设计模式-深入理解各种代理模式(1)通俗代码版

1》普通代理模式(有益于扩展开发),对代理者进行封装真实角色

public interface IGamePlayer {

//登录游戏
public void login(String user,String password);

//杀怪,这是网络游戏的主要特色
public void killBoss();

//升级
public void upgrade();
}

---

public class GamePlayer implements IGamePlayer {
private String name = "";

//构造函数限制谁能创建对象,并同时传递姓名
public GamePlayer(IGamePlayer _gamePlayer,String _name) throws Exception{
if(_gamePlayer == null ){
throw new Exception("不能创建真是角色!");
}else{
this.name = _name;
}

}
//打怪,最期望的就是杀老怪
public void killBoss() {
System.out.println(this.name + "在打怪!");
}

//进游戏之前你肯定要登录吧,这是一个必要条件
public void login(String user, String password) {
System.out.println("登录名为"+user + " 的用户 " + this.name + "登录成功!");
}

//升级,升级有很多方法,花钱买是一种,做任务也是一种
public void upgrade() {
System.out.println(this.name + " 又升了一级!");
}

}

----

public class GamePlayerProxy implements IGamePlayer {
private IGamePlayer gamePlayer = null;

//通过构造函数传递要对谁进行代练,封装代理者
public GamePlayerProxy(String name){
try {
gamePlayer = new GamePlayer(this,name);
} catch (Exception e) {
// TODO 异常处理
}
}

//代练杀怪
public void killBoss() {
this.gamePlayer.killBoss();
}

//代练登录
public void login(String user, String password) {
this.gamePlayer.login(user, password);

}

//代练升级
public void upgrade() {
this.gamePlayer.upgrade();

}

}

-------

public class Client {
public static void main(String[] args) {
//然后再定义一个代练者
IGamePlayer proxy = new GamePlayerProxy("张三");

//开始打游戏,记下时间戳
System.out.println("开始时间是:2009-8-25 10:45");
proxy.login("zhangSan", "password");
//开始杀怪
proxy.killBoss();
//升级
proxy.upgrade();
//记录结束游戏时间
System.out.println("结束时间是:2009-8-26 03:40");

}
}

2》强制代理模式:真实角色找指定代理

public interface IGamePlayer {
//登录游戏
public void login(String user,String password);

//杀怪,这是网络游戏的主要特色
public void killBoss();

//升级
public void upgrade();

//每个人都可以找一下自己的代理
public IGamePlayer getProxy();
}

----

public class GamePlayer implements IGamePlayer {
private String name = "";
//我的代理是谁
private IGamePlayer proxy = null;

public GamePlayer(String _name){
this.name = _name;

}

//找到自己的代理
public IGamePlayer getProxy(){
this.proxy = new GamePlayerProxy(this);
return this.proxy;
}

//打怪,最期望的就是杀老怪
public void killBoss() {
if(this.isProxy()){
System.out.println(this.name + "在打怪!");
}else{
System.out.println("请使用指定的代理访问");
}

}

//进游戏之前你肯定要登录吧,这是一个必要条件
public void login(String user, String password) {
if(this.isProxy()){
System.out.println("登录名为"+user + " 的用户 " + this.name + "登录成功!");
}else{
System.out.println("请使用指定的代理访问");;
}

}

//升级,升级有很多方法,花钱买是一种,做任务也是一种
public void upgrade() {
if(this.isProxy()){
System.out.println(this.name + " 又升了一级!");
}else{
System.out.println("请使用指定的代理访问");
}
}

//校验是否是代理访问
private boolean isProxy(){
if(this.proxy == null){
return false;
}else{
return true;
}
}

}

----

public class GamePlayerProxy implements IGamePlayer {
private IGamePlayer gamePlayer = null;

//构造函数传递用户名
public GamePlayerProxy(IGamePlayer _gamePlayer){

this.gamePlayer = _gamePlayer;
}

//代练杀怪
public void killBoss() {
this.gamePlayer.killBoss();
}

//代练登录
public void login(String user, String password) {
this.gamePlayer.login(user, password);

}

//代练升级
public void upgrade() {
this.gamePlayer.upgrade();

}

//代理的代理暂时还没有,就是自己
public IGamePlayer getProxy(){
return this;
}

}

----

public class Client {
public static void main(String[] args) {
IGamePlayer proxy=null;
//定义个游戏的角色
IGamePlayer player = new GamePlayer("张三");
//真实角色
//proxy=player; 
//新建一个代理者
//proxy = new GamePlayerProxy(player);
//获得指定的代理(代理自己指定的代理)
proxy = player.getProxy();//真实角色找到指定代理
System.out.println(">>>"+proxy);
//System.out.println(proxy);
//开始打游戏,记下时间戳
System.out.println("开始时间是:2009-8-25 10:45");
proxy.login("zhangSan", "password");
//开始杀怪
proxy.killBoss();
//升级
proxy.upgrade();
//记录结束游戏时间
System.out.println("结束时间是:2009-8-26 03:40");
}
}

时间: 2014-09-21

设计模式-深入理解各种代理模式(1)通俗代码版的相关文章

设计模式-深入理解各种代理模式(2)通俗代码版

3>多代理模式:提高或增强代理的其他业务,如:拦截.过滤等 public interface IGamePlayer { //登录游戏public void login(String user,String password); //杀怪,这是网络游戏的主要特色public void killBoss(); //升级public void upgrade(); } --- public interface IProxy {//计算费用public void count(); } --- publ

设计模式(十一)代理模式Proxy(结构型)

设计模式(十一)代理模式Proxy(结构型)    1.概述        因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ? 你有想过限制访问某个对象,也就是说,提供一组方法给普通用户,特别方法给管理员用户?以上两种需求都非常类似,并且都需要解决一个更大的问题:你如何提供一致的接口给某个对象让它可以改变其内部功能,或者是从来不存在的功能? 可以通过引入一个新的对象,来实现对真实对象的操作或者将新的

详解设计模式中的proxy代理模式及在Java程序中的实现_java

一.代理模式定义 给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原对象. 著名的代理模式的例子就是引用计数(reference counting): 当需要一个复杂对象的多份副本时, 代理模式可以结合享元模式以减少存储器的用量.典型做法是创建一个复杂对象以及多个代理者, 每个代理者会引用到原本的对象.而作用在代理者的运算会转送到原本对象.一旦所有的代理者都不存在时, 复杂对象会被移除. 要理解代理模式很简单,其实生活当中就存在代理

传统设计模式(十一)代理模式

所谓的代理,就是代表某个真实的对象.在这个设计模式中,代理可以假装自己是远程对象,但其实只是一个中间角色.客户对象所作的就像是在做远程方法调用,但其实只是调用本地资源中得"代理"对象上得方法,再由代理处理所有网络通信的底层细节. 其实其实项目实例神马的 根本就没必要了 看一下Web Service的调用方式大家也许就明白了,它会在客户端生成一个代理类 - - 已经很完美的诠释了代理模式这个概念 虫子放下水 直接拿以前监控项目中客户端采集的代理方法了 --_____-- 服务器端 [We

Java设计模式(八)----代理模式

代理模式 1.生活中: 代理就是一个人或者一个组织代表其他人去做一件事的现实生活中的.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 2.官方: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用 一.静态代理 类图结构如下 在代理模式中的角色: ●抽象主题角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象. ●真实主题角色:定义了代理对象所代表的

设计模式系列之五:代理模式

代理模式 代理模式的定义很简单:给某一对象提供一个代理对象,并由代理对象控制对原对象的引用. 代理模式的结构 有些情况下,一个客户不想活着不能够直接引用一个对象,可以通过代理对象在客户端和目标对象之间起到中介作用.代理模式中的角色有: 1.抽象对象角色 声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象 2.目标对象角色 定义了代理对象所代表的目标对象 3.代理对象角色 代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象:代理对象提供一个与目标

C++设计模式编程中proxy代理模式的使用实例_C 语言

代理模式典型的结构图为: 实际上,代理模式的想法非常简单. 代理模式的实现: 完整代码示例(code):代理模式的实现很简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用 C++实现,并在 VC 6.0 下测试运行). 代码片断 1:Proxy.h //Proxy.h #ifndef _PROXY_H_ #define _PROXY_H_ class Subject{ public: virtual ~Subject(); virtual void Request() =

设计模式之禅之代理模式

jdk的动态代理的条件: ===>要实现动态代理的首要条件是:被代理类必须实现一个接口,回想一下前面的分析吧.当然了,现在也有很多技术如CGLIB可以实现不需要接口也可以实现动态代理的方式.   动态代理的应用 代理模式应用得非常广泛,大到一个系统框架.企业平台,小到代码片段.事务处理,稍不留意就用到代理模式.可能该模式是大家接触最多的模式,而且有了AOP大家写代理就更加简单了,有类似Spring AOP和AspectJ这样非常优秀的工具,拿来主义即可!不过,大家可以看看源代码,特别是调试时,只

设计模式详解之代理模式

代理模式(Proxy):其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的带你就是这个意思.再如我们有的时候打官司,我们需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们的想法.先来看看关系图: 根据上文的阐述,代理模式就比较容易的理解了,我们看下代码: public interface Sourceable { publ