23种设计模式----------代理模式(一)
2014-12-14 00:27
267 查看
代理模式也叫委托模式。
代理模式定义:对其他对象提供一种代理从而控制对这个对象的访问。就是,代理类 代理 被代理类,来执行被代理类里的方法。
一般情况下,代理模式化有三个角色。
1,抽象的主题类(或者接口) IGamePlayer
2,代理类。
3,被代理类。
下面以游戏玩家代理为例。
一,先来看下最基本的代理模式。
代码如下:
被代理类:
代理类:
先来看下不用代理类的场景类:
游戏也有玩累,玩乏的时候,所以找个代练来升级。下面就是代理类的场景类。
执行还是这样,但是可以看出,确实是代理类来执行的。这就是最简单的代理模式了。
代理模式还是有很多种的,比如,普通代理模式,强制代理模式,虚拟代理模式,动态代理模式.....
接下来我们一一来看。
二,普通代理模式:
其实普通代理模式和上面的差不多。
普通代理模式,它不用知道代理的真实角色是谁,屏蔽了真实角色的更变对高层模块的影响。
(本例中,就是,不用知道为谁代练游戏,只需要知道代练游戏的用户名,密码即可。)
代码如下:
抽象主题类或者接口:
需要被代理类:
代理类:
看下场景类:
在场景类中,我们发现,我们并不需要知道具体为谁代理,把被代理类进行了隐藏。所以,被代理若是有所修改,只要实现了对应接口中的方法,则不会影响代理的执行。
(下一篇)23种设计模式----------代理模式(二)
代理模式定义:对其他对象提供一种代理从而控制对这个对象的访问。就是,代理类 代理 被代理类,来执行被代理类里的方法。
一般情况下,代理模式化有三个角色。
1,抽象的主题类(或者接口) IGamePlayer
2,代理类。
3,被代理类。
下面以游戏玩家代理为例。
一,先来看下最基本的代理模式。
代码如下:
主题接口:
package com.yemaozi.proxy.base; //游戏玩家主题接口 public interface IGamePlayer { //登录游戏 public void login(String username, String password); //击杀Boss public void killBoss(); //升级 public void upGrade(); }
被代理类:
package com.yemaozi.proxy.base; //需要代理的主题类。 public class GamePlayer implements IGamePlayer{ private String name = ""; public GamePlayer(String name){ this.name = name; } public void login(String username, String password) { System.out.println("登录名为 "+username+" 进入游戏," + name + " 登录成功!"); } public void killBoss() { System.out.println(this.name + " 击杀了Boss!"); } public void upGrade() { System.out.println(this.name + "升级了!"); } }
代理类:
package com.yemaozi.proxy.base; //代理类 //代理也是个游戏玩家,所以也要实现IGamePlayer public class ProxyGamePlayer implements IGamePlayer{ private IGamePlayer proxyGp = null; //代理需要获取被代理的信息,就是执行被代理所要执行的方法, //所以要获取被代理的对象。这里通过构造方法获取。 public ProxyGamePlayer(GamePlayer gp){ this.proxyGp = gp; } public void login(String username, String password) { System.out.println("代理登录的游戏!"); proxyGp.login(username, password); } public void killBoss() { proxyGp.killBoss(); } public void upGrade() { proxyGp.upGrade(); } }
先来看下不用代理类的场景类:
package com.yemaozi.proxy.base; //这是正常的,用非代理的情况下。 public class Client { public static void main(String [] args){ IGamePlayer gp = new GamePlayer("张三"); //开始执行主题接口中的方法。 //登录游戏 gp.login("zhangsan", "123456"); //杀怪 gp.killBoss(); //升级 gp.upGrade(); } } 执行结果: 登录名为 zhangsan 进入游戏,张三 登录成功! 张三 击杀了Boss! 张三升级了!
游戏也有玩累,玩乏的时候,所以找个代练来升级。下面就是代理类的场景类。
package com.yemaozi.proxy.base; //代理客户端 public class BasePoxyClient { public static void main(String[] args){ IGamePlayer proxyGp = new ProxyGamePlayer(new GamePlayer("张三")); proxyGp.login("zhangsan", "123456"); proxyGp.killBoss(); proxyGp.upGrade(); } } 执行结果为: 代理登录的游戏! 登录名为 zhangsan 进入游戏,张三 登录成功! 张三 击杀了Boss! 张三升级了!
执行还是这样,但是可以看出,确实是代理类来执行的。这就是最简单的代理模式了。
代理模式还是有很多种的,比如,普通代理模式,强制代理模式,虚拟代理模式,动态代理模式.....
接下来我们一一来看。
二,普通代理模式:
其实普通代理模式和上面的差不多。
普通代理模式,它不用知道代理的真实角色是谁,屏蔽了真实角色的更变对高层模块的影响。
(本例中,就是,不用知道为谁代练游戏,只需要知道代练游戏的用户名,密码即可。)
代码如下:
抽象主题类或者接口:
package com.yemaozi.proxy.common; /** * 普通代理模式:就是我们要知道代理的存在,然后才能访问(或者使用代理)。 * 对于基本的代理改动较小。只改变实现类中 * @author yemaozi */ public interface IGamePlayer { //登录游戏 public void login(String username, String password); //击杀Boss public void killBoss(); //升级 public void upGrade(); }
需要被代理类:
package com.yemaozi.proxy.common; public class GamePlayer implements IGamePlayer{ private String name = ""; //通过构造方法,将代理传递进来。 public GamePlayer(IGamePlayer proxyGp, String name){ if(proxyGp == null){ //处理非正常情况。 }else{ this.name = name; } } //登录游戏 public void login(String username, String password) { System.out.println("登录名为 "+username+" 进入游戏," + name + " 登录成功!"); } //杀Boss public void killBoss() { System.out.println(this.name + " 击杀了Boss!"); } //升级 public void upGrade() { System.out.println(this.name + "升级了!"); } }
代理类:
package com.yemaozi.proxy.common; public class ProxyGamePlayer implements IGamePlayer{ private IGamePlayer proxyGp = null; public ProxyGamePlayer(String name){ try { //通过构造方法创建GamePlayer,同时将自己传递进去。用于在GamePlayer判断业务逻辑 proxyGp = new GamePlayer(this, name); } catch (Exception e) { e.printStackTrace(); } } public void login(String username, String password) { System.out.println("代理登录的游戏!"); proxyGp.login(username, password); } public void killBoss() { proxyGp.killBoss(); } public void upGrade() { proxyGp.upGrade(); } }
看下场景类:
package com.yemaozi.proxy.common; /** * 普通代理模式,它不用知道代理的真实角色是谁,屏蔽了真实角色的更变对高层模块的影响。 * (本例中,就是,不用知道为谁代练游戏,只需要知道代练游戏的用户名,密码即可。) * @author yemaozi * */ public class Client { public static void main(String[] args){ IGamePlayer proxyGp = new ProxyGamePlayer("张三"); proxyGp.login("zhangsan", "123456"); proxyGp.killBoss(); proxyGp.upGrade(); } } 执行结果: 代理登录的游戏! 登录名为 zhangsan 进入游戏,张三 登录成功! 张三 击杀了Boss! 张三升级了!
在场景类中,我们发现,我们并不需要知道具体为谁代理,把被代理类进行了隐藏。所以,被代理若是有所修改,只要实现了对应接口中的方法,则不会影响代理的执行。
(下一篇)23种设计模式----------代理模式(二)
相关文章推荐
- c++23种设计模式之代理模式
- 23种设计模式之代理模式(Proxy)
- 23种设计模式(17):代理模式
- java23种设计模式 代理模式(五)
- 23种设计模式--代理模式-Proxy
- Java开发中的23种设计模式之八:代理模式(Proxy)
- 23种设计模式(12)_结构型_代理模式(Proxy Pattern)
- 23种设计模式(6):代理模式
- 精通23种设计模式——代理模式
- java_23种设计模式之代理模式
- 23种设计模式--代理模式
- 23种设计模式----------代理模式(三) 之 动态代理模式
- GoF23种设计模式之结构型模式之代理模式
- 重学java23种设计模式(12)代理模式
- 用最通俗的话说23种设计模式之代理模式
- Java经典23种设计模式之结构型模式(三)------附代理模式、适配器模式、外观模式区别
- 23种设计模式----------代理模式(二)
- 23种设计模式 第二部分 结构模式(3) 代理模式
- 23种设计模式3--结构型模式(适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式)
- GoF23种设计模式之结构型模式之代理模式