设计模式之代理模式

    代理模式也叫做委托模式,它是一项基本设计技巧。许多其他的模式,如状态模式、策略模式、访问者模式本质上是在特殊场合使用了代理模式。代理这个词的意思,就是让别人干自己原本需要做的事情,代理模式也是这么回事。一说到代理,我马上就想到两个东西,代理服务器和游戏代理,那么以游戏代理来写这个模式吧。先例行盗图一波:

先来一个打游戏的接口:

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里来获取代理,在其他方法里加上判断是否有这个代理就行了,因为就比原来多了点儿代码,就不写了,下篇主要来说一下动态代理。

posted @ 2017-12-26 17:41  fengshenjingjun  阅读(185)  评论(0编辑  收藏  举报