代理模式的定义
为其他对象提供一种代理以控制对这个对象的访问
-
抽象主题(Subject)角色
该角色是真实主题和代理主题的共同接口,以便在任何可以使用真实主题的地方都可以使用代理主题。
-
代理主题(Proxy Subject)角色
也叫委托类、代理类,该角色负责控制对真实主题的引用,负责在需要的时候创建或删除真实主题,并在真是主题角色处理完毕前后做预处理和善后处理工作
-
真实主题(Real Subject)角色
也叫被委托角色、被代理角色,是业务逻辑的具体执行者
模板实现
public interface Subject {
/**
* 定义一个请求
*/
public void request();
}
public class ProxySubject implements Subject{
private Subject subject;
public ProxySubject(Subject subject){
this.subject = subject;
}
/**
* 实现请求方法
*/
@Override
public void request() {
this.beforeSubject();
subject.request();
this.afterSubject();
}
/**
* 请求前的操作
*/
private void beforeSubject(){
System.out.println("预处理...");
}
/**
* 请求后的处理
*/
private void afterSubject(){
System.out.println("善后处理...");
}
}
public class RealSubject implements Subject{
/**
* 业务逻辑处理
*/
@Override
public void request() {
}
}
具体实现
public interface IGamePlayer {
public void killBoss(); //杀怪
public void upGrade(); // 升级
}
public class GamePlayer implements IGamePlayer{
private String name = "";
public GamePlayer(String name){
this.name = name;
}
@Override
public void killBoss() {
System.out.println(this.name+" 正在打怪...");
}
@Override
public void upGrade() {
System.out.println(this.name+" 成功升了一级...");
}
}
public class GamePlayerProxy implements IGamePlayer {
private Date start;
private Date end;
private IGamePlayer iGamePlayer;
public GamePlayerProxy(IGamePlayer iGamePlayer){
this.iGamePlayer = iGamePlayer;
}
/**
* 记录打怪时间
*/
private void log(){
this.start = new Date();
System.out.println("打怪开始时间:"+start.toString());
}
@Override
public void killBoss() {
this.log();
iGamePlayer.killBoss();
}
@Override
public void upGrade() {
iGamePlayer.upGrade();
this.count();
}
/**
* 计算升级时候的时间
*/
private void count(){
this.end = new Date();
System.out.println("打怪结束时间:"+this.end.toString());
}
}
public class ClientDemo {
public static void main(String[] args) {
IGamePlayer player = new GamePlayer("王一");
IGamePlayer proxy = new GamePlayerProxy(player);
proxy.killBoss();
proxy.upGrade();
}
}