设计模式之代理模式
代理模式也叫做委托模式,它是一项基本设计技巧。许多其他的模式,如状态模式、策略模式、访问者模式本质上是在特殊场合使用了代理模式。代理这个词的意思,就是让别人干自己原本需要做的事情,代理模式也是这么回事。一说到代理,我马上就想到两个东西,代理服务器和游戏代理,那么以游戏代理来写这个模式吧。先例行盗图一波:
先来一个打游戏的接口:
interface IGamePlayer{ public void login(String user,String password); public void shuatu(); public void upgrade(); public void logout(); }
游戏嘛,无非登陆刷图升级以及打完了之后登出,对战游戏除外啊,然后来一个玩家打游戏的实现类:
class GamePlayer implements IGamePlayer { String name = null; public GamePlayer(String name) { this.name = name; } @Override public void login(String user,String password) { System.out.println(user+"登陆"); } @Override public void shuatu() { System.out.println(name+"正在刷图"); } @Override public void upgrade() { System.out.println(name+"升级了!"); } @Override public void logout() { System.out.println(name+"登出了"); } }
以及代理类
class ProxyGamePlayer implements IGamePlayer { private IGamePlayer gameplayer = null; public ProxyGamePlayer(IGamePlayer gameplayer) { this.gameplayer = gameplayer; } @Override public void login(String user, String password) { this.gameplayer.login(user, password); } @Override public void shuatu() { this.gameplayer.shuatu(); } @Override public void upgrade() { this.gameplayer.upgrade(); } @Override public void logout() { this.gameplayer.logout(); } }
下面我们可以测试一下:
public class ProxyTest { public static void main(String[] args) { IGamePlayer gamePlayer = new GamePlayer("zhangsan"); ProxyGamePlayer pGamePlayer = new ProxyGamePlayer(gamePlayer); pGamePlayer.login("user", "password"); pGamePlayer.shuatu(); pGamePlayer.upgrade(); pGamePlayer.logout(); } }
这就是最基础的代理模式写法。但是这种写法是有些问题的,这里在main方法new了一个GamePlayer就可以直接调用打游戏的方法了,应该把实例化这个类的方法隐藏起来,具体做法可以通过在代理类里面传入name获取到GamePlayer里定义好的一个实例。这种代理模式是普通代理,你想通过代理访问可以,你一定要通过真实角色访问也没啥问题,但是强制代理就强迫一定要通过代理类来访问了。具体做法可以通过在接口定义一个getProxy()方法,在GamePlayer里来获取代理,在其他方法里加上判断是否有这个代理就行了,因为就比原来多了点儿代码,就不写了,下篇主要来说一下动态代理。