代理模式:
定义:
为其他对象提供一种代理以控制对这个对象的访问。
Subject抽象主题角色:
抽象主题类可以是抽象类也可以是接口。
RealSubject具体主题角色:
被代理角色
Proxy代理主题角色:
代理类,负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实角色处理完毕前后做预处理和善后处理工作。就是替具体主题角色完成抽象类中的方法。
代理模式的优点:
职责清晰
高扩展性
智能化
游戏代理:
interface IGamePlayer { // 登陆 public void login(String user, String password); // 杀怪 public void killBoss(); // 升级 public void upgrade(); } class GamePlayer implements IGamePlayer { private String name = ""; public GamePlayer(String name) { this.name = name; } public void login(String user, String password) { System.out.println("登陆名为" + this.name + "登陆成功"); } public void killBoss() { System.out.println(this.name + "在打怪"); } public void upgrade() { System.out.println(this.name + "升级了"); } } /* 代练 */ class GamePlayerProxy implements IGamePlayer { private IGamePlayer gamePlayer = null; // 通过构造函数传递被代练者 public GamePlayerProxy(IGamePlayer gamePlayer) { this.gamePlayer = gamePlayer; } public void login(String user, String password) { this.gamePlayer.login(user, password); } public void killBoss() { this.gamePlayer.killBoss(); } public void upgrade() { this.gamePlayer.upgrade(); } } public class Client { public static void main(String[] args) { IGamePlayer player = new GamePlayer("zhangsan"); IGamePlayer proxy = new GamePlayerProxy(player); proxy.login("zhangsan", "12345"); proxy.killBoss(); proxy.upgrade(); } }
普通代理与强制代理:
普通代理就是我们要知道代理的存在,而强制代理则是调用者直接调用真实角色,不用关心代理是否存在。
普通代理:
修改了之前两个类的构造函数,GamePlayer的构造函数增加了gamePlayer参数,而代理角色只要传入代理者名字即可,而不需要说是替哪个对象做代理。
interface IGamePlayer { // 登陆 public void login(String user, String password); // 杀怪 public void killBoss(); // 升级 public void upgrade(); } class GamePlayer implements IGamePlayer { private String name = ""; private IGamePlayer gamePlayer; public GamePlayer(IGamePlayer gamePlayer, String name) throws Exception { if (gamePlayer == null) { throw new Exception("不能创建真实角色!"); } else { this.name = name; } } public void login(String user, String password) { System.out.println("登陆名为" + this.name + "登陆成功"); } public void killBoss() { System.out.println(this.name + "在打怪"); } public void upgrade() { System.out.println(this.name + "升级了"); } } /* 代练 */ class GamePlayerProxy implements IGamePlayer { private IGamePlayer gamePlayer = null; public GamePlayerProxy(String name) { try { gamePlayer = new GamePlayer(this, name); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void login(String user, String password) { this.gamePlayer.login(user, password); } public void killBoss() { this.gamePlayer.killBoss(); } public void upgrade() { this.gamePlayer.upgrade(); } } public class Client { public static void main(String[] args) { IGamePlayer proxy = new GamePlayerProxy("zhangsan"); proxy.login("zhangsan", "12345"); proxy.killBoss(); proxy.upgrade(); } }
运行结果完全相同,在该模式下,调用者只知道代理而不用知道真实角色是谁。
强制代理:
调用者直接调用真实角色,而不用关心代理是否存在,其代理的产生是由真实角色决定的。必须通过真实角色查找到代理角色。只有通过真实角色指定的代理类才可以访问。
在接口上增加了一个getProxy方法,真实角色GamePlayer可以指定一个自己的代理,除了代理外谁都不能访问。
interface IGamePlayer { // 登陆 public void login(String user, String password); // 杀怪 public void killBoss(); // 升级 public void upgrade(); public IGamePlayer getProxy(); } class GamePlayer implements IGamePlayer { private String name = ""; private IGamePlayer proxy; public GamePlayer(String name) { this.name = name; } public IGamePlayer getProxy() { this.proxy = new GamePlayerProxy(this); return this.proxy; } private boolean isProxy() { if (this.proxy == null) { return false; } return true; } public void login(String user, String password) { if (isProxy()) { System.out.println("登陆名为" + this.name + "登陆成功"); } else { System.out.println("请使用指定的代理访问"); } } public void killBoss() { if (isProxy()) { System.out.println(this.name + "在打怪"); } else { System.out.println("请使用指定的代理访问"); } } public void upgrade() { if (isProxy()) { System.out.println(this.name + "升级了"); } else { System.out.println("请使用指定的代理访问"); } } } /* 代练 */ class GamePlayerProxy implements IGamePlayer { private IGamePlayer gamePlayer = null; public GamePlayerProxy(IGamePlayer gamePlayer) { this.gamePlayer = gamePlayer; } public void login(String user, String password) { this.gamePlayer.login(user, password); } public void killBoss() { this.gamePlayer.killBoss(); } public void upgrade() { this.gamePlayer.upgrade(); } // 代理的代理暂时还没有,就是自己 public IGamePlayer getProxy() { return this; } } public class Client { public static void main(String[] args) { IGamePlayer player = new GamePlayer("zhangsan"); IGamePlayer proxy = player.getProxy(); proxy.login("zhangsan", "12345"); proxy.killBoss(); proxy.upgrade(); } }
强制代理的概念就是要从真实角色查找到代理角色,不能直接访问真实角色。高层模块只要调用getProxy就可以访问真实角色的所有方法。
代理是有个性的
代理类不仅仅可以实现主题接口,也可以实现其他接口完不成的任务,而且代理的目的是在目标对象方法的基础上做增强。
游戏代理是要收费的,增加一个IProxy接口,其作用是计算代理费用。
interface IProxy { // 计算费用 public void count(); } /* 代练 */ class GamePlayerProxy implements IGamePlayer, IProxy { private IGamePlayer gamePlayer = null; public GamePlayerProxy(IGamePlayer gamePlayer) { this.gamePlayer = gamePlayer; } public void login(String user, String password) { this.gamePlayer.login(user, password); } public void killBoss() { this.gamePlayer.killBoss(); } public void upgrade() { this.gamePlayer.upgrade(); this.count(); } // 代理的代理暂时还没有,就是自己 public IGamePlayer getProxy() { return this; } // 计算费用 public void count() { System.out.println("升级总费用:10000"); } }
动态代理。。。。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/u013476556/article/details/47208207