设计模式(6):代理模式

设计模式(6):代理模式

分类:Java设计模式

代理模式设计模式

代理模式:

定义:

为其他对象提供一种代理以控制对这个对象的访问。

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 blocke.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可以指定一个自己的代理,除了代理外谁都不能访问。

我走得很慢!但我从不后退!

设计模式(6):代理模式

相关文章:

你感兴趣的文章:

标签云: