设计模式-代理模式

82 阅读1分钟

代理模式的定义

为其他对象提供一种代理以控制对这个对象的访问

image.png

  • 抽象主题(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() {

    }
}

具体实现

image.png

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();
    }
}

image.png