美文网首页
第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