代理模式也叫做委托模式,它是一项基本设计技巧。许多其他的模式,如状态模式、策略模式、访问者模式本质上是在特殊场合使用了代理模式。代理这个词的意思,就是让别人干自己原本需要做的事情,代理模式也是这么回事。一说到代理,我马上就想到两个东西,代理服务器和游戏代理,那么以游戏代理来写这个模式吧。先例行盗图一波:
先来一个打游戏的接口:
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里来获取代理,在其他方法里加上判断是否有这个代理就行了,因为就比原来多了点儿代码,就不写了,下篇主要来说一下动态代理。