1.代理模式的定义
代理模式的英文定义:
Provide a surroagte or placehloder for another object to control access to it.
大体的意思就是:为其他对象提供一种代理以控制对这个对象的访问。
代理模式是一项基本的设计技巧,许多其他的模式,如状态模式、策略模式、访问者模式本质上也是采用了代理模式。代理模式的类图如下:
代理模式提供了三个角色。
1)抽象主题角色:该角色是真实主题和代理主题的共同接口,以便在任何时候可以使用真实主题的第放都可使用代理主题。
2)代理主题角色:也叫委托类、代理类,该角色负责控制真实主题的引用,负责在需要的时候创建和删除真实主题的对象,并在真实主题角色处理完毕前后做预处理和后处理工作。
3)真实主题角色:该角色也叫被委托角色,或者被代理角色,是业务逻辑的具体执行者。
Subject.java
import java.util.*;
/**
*
*/
public interface Subject {
/**
*
*/
public void request();
}
RealSubject.java
import java.util.*;
/**
*
*/
public class RealSubject implements Subject {
/**
* Default constructor
*/
public RealSubject() {
}
/**
*
*/
public void request() {
// TODO implement here
//***业务逻辑***
}
}
ProxySubject.java
import java.util.*;
/**
*
*/
public class ProxySubject implements Subject {
private Subject subject;
/**
* Default constructor
*/
public ProxySubject(Subject subject) {
this.subject= subject;
}
/**
*
*/
public void beforeRequest() {
// TODO implement here
}
/**
*
*/
public void afterRequest() {
// TODO implement here
}
/**
*
*/
public void request() {
// TODO implement here
beforeRequest();
subject.request();
afterRequest();
}
}
一个代理类可以代理多个真实主题,具体代理那个真实的主题是由高层的应用模块决定的,可以通过代理类的构造函数传递内代理者。
2.代理模式的优点
代理模式的优点有以下几个方面:
1)职责清晰:真实的角色实现实现的业务逻辑,不用关心其他非本职的事务,通过后期的代理完成附件的事务,附带的结果就是编程简洁清晰。
2)高度展性:具体主题角色随需求不同可能变为多种,但是只要实现了接口,代理类就可以完全在不做任何修饰的情况下代理各种真实的角色。
3)智能化:代理类可以再运行的时候确定真实的代理主题,这是一种强大的功能。
3.代理模式的实例
下述代码用于实现任务描述,通过游戏代练演示代理模式的应用,其类图如下:
IGamePlayer.java
package fengqi.wang;
public interface IGamePlayer {
public void killBoss();
public void upGrade();
}
GamePlayer.java
package fengqi.wang;
public class GamePlayer implements IGamePlayer {
private String name = "";
GamePlayer(String name) {
this.name = name;
}
@Override
public void killBoss() {
// TODO Auto-generated method stub
System.out.println(this.name + "正在打怪。");
}
@Override
public void upGrade() {
// TODO Auto-generated method stub
System.out.println(this.name + "成功升了1级。");
}
}
GamePlayerProxy.java
package fengqi.wang;
import java.util.Date;
public class GamePlayerProxy implements IGamePlayer {
private IGamePlayer player = null;
public GamePlayerProxy(IGamePlayer player) {
// TODO Auto-generated constructor stub
this.player = player;
}
private void log() {
System.out.println("打怪时间 " + new Date().toString());
}
private void count() {
System.out.println("升1级消耗了10小时");
}
@Override
public void killBoss() {
// TODO Auto-generated method stub
log();
player.killBoss();
}
@Override
public void upGrade() {
// TODO Auto-generated method stub
player.upGrade();
count();
}
}
TestGamePlayerProxy.java
package fengqi.wang;
public class TestGamePlayerProxy {
public static void main(String[] args) {
// TODO Auto-generated method stub
IGamePlayer player = new GamePlayer("张三丰");
IGamePlayer proxy = new GamePlayerProxy(player);
proxy.killBoss();
proxy.upGrade();
}
}
测试结果
打怪时间 Wed Aug 10 15:56:30 CST 2016
张三丰正在打怪。
张三丰成功升了1级。
升1级消耗了10小时