美文网首页
第4章 结构型模式-代理模式

第4章 结构型模式-代理模式

作者: 一介书生独醉江湖 | 来源:发表于2022-06-14 09:05 被阅读0次
结构型模式的目的是通过组合类或对象产生更大结构,以适应更高层次的逻辑需求;
结构型模式共有7种:
■ 代理模式
■ 装饰模式
■ 适配器模式
■ 组合模式
■ 桥梁模式
■ 外观模式
■ 享元模式
一、代理模式简介
为其他对象提供一种代理以控制对这个对象的访问;
image.png
二、代理模式3个角色
■ 抽象主题(Subject)角色:该角色是真实主题和代理主题的共同接口;
■ 代理主题(Proxy Subject)角色:也叫做委托类、代理类,该角色负责控制对真实主题的引用;
  1) 在需要的时候创建或删除真实主题对象;
  2) 在真实主题角色处理完毕前后做预处理和善后处理工作;
■ 真实主题(Real Subject)角色:该角色也叫做被委托角色、被代理角色,是业务逻辑的具体执行者;
public interface Subject {
    public void request();
}
public class RealSubject implements Subject{
    @Override
    public void request() {
        // 业务逻辑处理
        System.out.println("这里是真正的逻辑处理");
    }
}
public class ProxySubject implements Subject{

    private Subject subject;

    public ProxySubject(Subject subject){
        this.subject = subject;
    }

    @Override
    public void request() {
        this.beforeRequest();
        subject.request();
        this.afterRequest();
    }

    private void beforeRequest(){
        // 预处理
        System.out.println("预处理");
    }

    private void afterRequest(){
        // 善后处理
        System.out.println("善后处理");
    }
}
public class ClientDemo {
    public static void main(String[] args){
        Subject realSubject = new RealSubject();

        Subject proxySubject = new ProxySubject(realSubject);
        proxySubject.request();

    }
}
# 控制台输出 :
预处理
这里是真正的逻辑处理
善后处理
三、代理模式的优点
■ 职责清晰:真实的角色实现实际的业务逻辑,不用关心其他非本职的事务;
  通过后期的代理完成附加的事务,附带的结果就是编程简洁清晰;
■ 高扩展性:具体主题角色随需求不同可能有很多种,但只要实现了接口,代理类就完全可以在不做任何修改的情况下代理各种真实主题角色;
■ 智能化:代理类可以在运行时才确定需要去代理的真实主题;
四、代理模式的实例(游戏代练)
image.png
public interface IGamePlayer {
    // 杀怪
    void killBoss();
    // 升级
    void upGrade();
}
public class GamePlayer implements IGamePlayer{

    private String name;

    public GamePlayer(String name){
        this.name = name;
    }
    @Override
    public void killBoss() {
        System.out.println(name + "杀死了boss");
    }

    @Override
    public void upGrade() {
        System.out.println(name + "升级了");
    }
}
public class GamePlayerProxy implements IGamePlayer{

    private IGamePlayer iGamePlayer;

    public GamePlayerProxy(IGamePlayer iGamePlayer){
        this.iGamePlayer = iGamePlayer;
    }

    @Override
    public void killBoss() {
        // 记录打怪时间
        log();

        iGamePlayer.killBoss();
    }

    @Override
    public void upGrade() {
        iGamePlayer.upGrade();

        // 计算升级所需的时间
        count();
    }

    private void log(){
        System.out.println("打怪时间 : " + new Date().toString());
    }

    private void count(){
        System.out.println("升一级需要50个小时.");
    }
}
public class ClientDemo {

    public static void main(String[] args){
        IGamePlayer gamePlayer = new GamePlayer("小号007");
        IGamePlayer gamePlayerProxy = new GamePlayerProxy(gamePlayer);
        gamePlayerProxy.killBoss();
        gamePlayerProxy.upGrade();
    }
}
# 控制台输出 : 
打怪时间 : Mon Jun 13 18:40:38 CST 2022
小号007杀死了boss
小号007升级了
升一级需要50个小时.
参考:
摘录 《设计模式(Java版)》韩敬海主编;(微信读书APP中有资源,可以直接阅读)

相关文章

网友评论

      本文标题:第4章 结构型模式-代理模式

      本文链接:https://www.haomeiwen.com/subject/idnomrtx.html