您的位置:首页 > 其它

23种设计模式----------代理模式(一)

2014-12-14 00:27 267 查看
代理模式也叫委托模式。

代理模式定义:对其他对象提供一种代理从而控制对这个对象的访问。就是,代理类 代理 被代理类,来执行被代理类里的方法。

一般情况下,代理模式化有三个角色。

  1,抽象的主题类(或者接口) IGamePlayer
  2,代理类。
  3,被代理类。

下面以游戏玩家代理为例。

一,先来看下最基本的代理模式。

代码如下:

主题接口:


package com.yemaozi.proxy.base;

//游戏玩家主题接口
public interface IGamePlayer {
//登录游戏
public void login(String username, String password);

//击杀Boss
public void killBoss();

//升级
public void upGrade();
}


被代理类:

package com.yemaozi.proxy.base;

//需要代理的主题类。
public class GamePlayer implements IGamePlayer{

private String name = "";

public GamePlayer(String name){
this.name = name;
}

public void login(String username, String password) {
System.out.println("登录名为 "+username+" 进入游戏," + name + " 登录成功!");
}

public void killBoss() {
System.out.println(this.name + " 击杀了Boss!");
}

public void upGrade() {
System.out.println(this.name + "升级了!");
}

}


代理类:

package com.yemaozi.proxy.base;

//代理类
//代理也是个游戏玩家,所以也要实现IGamePlayer
public class ProxyGamePlayer implements IGamePlayer{

private IGamePlayer proxyGp = null;

//代理需要获取被代理的信息,就是执行被代理所要执行的方法,
//所以要获取被代理的对象。这里通过构造方法获取。
public ProxyGamePlayer(GamePlayer gp){
this.proxyGp = gp;
}

public void login(String username, String password) {
System.out.println("代理登录的游戏!");
proxyGp.login(username, password);
}

public void killBoss() {
proxyGp.killBoss();
}

public void upGrade() {
proxyGp.upGrade();
}
}


先来看下不用代理类的场景类:

package com.yemaozi.proxy.base;

//这是正常的,用非代理的情况下。
public class Client {
public static void main(String [] args){
IGamePlayer gp = new GamePlayer("张三");
//开始执行主题接口中的方法。
//登录游戏
gp.login("zhangsan", "123456");
//杀怪
gp.killBoss();
//升级
gp.upGrade();
}
}

执行结果:
登录名为 zhangsan 进入游戏,张三 登录成功!
张三 击杀了Boss!
张三升级了!


游戏也有玩累,玩乏的时候,所以找个代练来升级。下面就是代理类的场景类。

package com.yemaozi.proxy.base;

//代理客户端
public class BasePoxyClient {
public static void main(String[] args){
IGamePlayer proxyGp = new ProxyGamePlayer(new GamePlayer("张三"));
proxyGp.login("zhangsan", "123456");
proxyGp.killBoss();
proxyGp.upGrade();
}
}

执行结果为:
代理登录的游戏!
登录名为 zhangsan 进入游戏,张三 登录成功!
张三 击杀了Boss!
张三升级了!


执行还是这样,但是可以看出,确实是代理类来执行的。这就是最简单的代理模式了。

代理模式还是有很多种的,比如,普通代理模式,强制代理模式,虚拟代理模式,动态代理模式.....

接下来我们一一来看。

二,普通代理模式:

其实普通代理模式和上面的差不多。

普通代理模式,它不用知道代理的真实角色是谁,屏蔽了真实角色的更变对高层模块的影响。
(本例中,就是,不用知道为谁代练游戏,只需要知道代练游戏的用户名,密码即可。)

代码如下:

抽象主题类或者接口:

package com.yemaozi.proxy.common;

/**
* 普通代理模式:就是我们要知道代理的存在,然后才能访问(或者使用代理)。
* 对于基本的代理改动较小。只改变实现类中
* @author yemaozi
*/
public interface IGamePlayer {
//登录游戏
public void login(String username, String password);

//击杀Boss
public void killBoss();

//升级
public void upGrade();
}


需要被代理类:

package com.yemaozi.proxy.common;

public class GamePlayer implements IGamePlayer{

private String name = "";

//通过构造方法,将代理传递进来。
public GamePlayer(IGamePlayer proxyGp, String name){
if(proxyGp == null){
//处理非正常情况。
}else{
this.name = name;
}
}
//登录游戏
public void login(String username, String password) {
System.out.println("登录名为 "+username+" 进入游戏," + name + " 登录成功!");
}
//杀Boss
public void killBoss() {
System.out.println(this.name + " 击杀了Boss!");
}

//升级
public void upGrade() {
System.out.println(this.name + "升级了!");
}

}


代理类:

package com.yemaozi.proxy.common;

public class ProxyGamePlayer implements IGamePlayer{

private IGamePlayer proxyGp = null;

public ProxyGamePlayer(String name){

try {
//通过构造方法创建GamePlayer,同时将自己传递进去。用于在GamePlayer判断业务逻辑
proxyGp = new GamePlayer(this, name);
} catch (Exception e) {
e.printStackTrace();
}
}

public void login(String username, String password) {
System.out.println("代理登录的游戏!");
proxyGp.login(username, password);
}

public void killBoss() {
proxyGp.killBoss();
}

public void upGrade() {
proxyGp.upGrade();
}

}


看下场景类:

package com.yemaozi.proxy.common;

/**
* 普通代理模式,它不用知道代理的真实角色是谁,屏蔽了真实角色的更变对高层模块的影响。
* (本例中,就是,不用知道为谁代练游戏,只需要知道代练游戏的用户名,密码即可。)
* @author yemaozi
*
*/
public class Client {
public static void main(String[] args){
IGamePlayer proxyGp = new ProxyGamePlayer("张三");
proxyGp.login("zhangsan", "123456");
proxyGp.killBoss();
proxyGp.upGrade();
}
}

执行结果:
代理登录的游戏!
登录名为 zhangsan 进入游戏,张三 登录成功!
张三 击杀了Boss!
张三升级了!


在场景类中,我们发现,我们并不需要知道具体为谁代理,把被代理类进行了隐藏。所以,被代理若是有所修改,只要实现了对应接口中的方法,则不会影响代理的执行。

(下一篇)23种设计模式----------代理模式(二)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: