设计模式--5.2 代理模式--普通代理
1. 普通代理就是我们要知道代理类(Subject)的存在,然后才能访问
(1)调用者只知道代理存在就可以, 不用知道代理了谁
(2) 屏蔽了真实角色(RealSubject)的变更对高层类(场景类)的影响
(3)真实的主题角色想怎么修改就怎么修改, 对高层次的模块没有任何的影响,只要你实现了接口所对应的方法, 该模式非常适合对扩展性要求较高的场合。
2.
(1) 接口类
package com.design.代理模式.第一阶段; public interface IGamePlayer { void login(String username , String pwd); void killBoss(); void upgrade(); }
(2)真实角色
package com.design.代理模式.普通代理; import com.design.代理模式.第一阶段.IGamePlayer; public class GamePlayer implements IGamePlayer { private String name = ""; public GamePlayer(IGamePlayer _gamePlayer , String _name) throws Exception{ // 只有代理才能创建对象 if(_gamePlayer != null && _gamePlayer.getClass().getName().equals("com.design.代理模式.普通代理.GamePlayerProxy")){ this.name = _name; }else{ throw new Exception("不能创建真实角色"); } } // 登录 @Override public void login(String username, String pwd) { System.out.println("GamePlayer:"+ name +" login....."); } // 杀怪 @Override public void killBoss() { System.out.println("GamePlayer:"+ name +" killBoss....."); } // 升级 @Override public void upgrade() { System.out.println("GamePlayer: "+ name +" upgrade....."); } }
(3)proxy
package com.design.代理模式.普通代理; import com.design.代理模式.第一阶段.IGamePlayer; public class GamePlayerProxy implements IGamePlayer { private IGamePlayer gamePlayer = null; public GamePlayerProxy(String name ) throws Exception{ gamePlayer = new GamePlayer(this,name); } // 通过构造函数决定要对谁进行代练 public GamePlayerProxy(IGamePlayer _gamePlayer) { super(); this.gamePlayer = _gamePlayer; } // 代练登录 @Override public void login(String username, String pwd) { this.gamePlayer.login(username, pwd); } // 代练杀怪 @Override public void killBoss() { this.gamePlayer.killBoss(); } // 代练升级 @Override public void upgrade() { this.gamePlayer.upgrade(); } }
(4) 场景类
package com.design.代理模式.普通代理; import com.design.代理模式.第一阶段.IGamePlayer; public class Client { public static void main(String[] args) throws Exception { // 调用者只知道代理存在就可以, 不用知道代理了谁 // 屏蔽了真实角色(RealSubject)的变更对场景类的影响 /* * 真实的主题角色想怎么修改就怎么修改, 对高层次的模 块没有任何的影响, 只要你实现了接口所对应的方法, 该模式非常适合对扩展性要求较高的 场合。 当然, 在实际的项目中, 一般都是通过约定来禁止new一个真实的角色, 这也是一个 非常好的方案。 */ IGamePlayer proxy = new GamePlayerProxy("lvyf"); proxy.login("lvyafei", "123456"); proxy.killBoss(); proxy.upgrade(); } }