• 【结构型】代理模式(Proxy)


    代理模式(Proxy)

    为其他对象提供一种代理以控制对这个对象的访问。Proxy 模式适用于在需要比较通用和复杂的对象指针代替简单的指针的时候。

    适用场景

    • 远程代理 (Remote Proxy) 为一个对象在不同地址空间提供局部代表。
    • 虚代理 (Virtual Proxy) 根据需要创建开销很大的对象。
    • 保护代理 (Protection Proxy) 控制对原始对象的访问,用于对象应该有不同的访问权限的时候。
    • 智能引用 (Smart Reference) 取代了简单的指针,它在访问对象时执行一些附加操作。典型用途包括:对指向实际对象的引用计数,这样当该对象没有引用时,可以被自动释放:当第一次引用一个持久对象时,将它装入内存:在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。
      在这里插入图片描述

    ✦ Proxy 保存一个引用使得代理可以访问实体;提供一个与 Subject 的接口相同的接口,使代理可以用来代替实体:控制对实体的存取,并可能负责创建和删除它;其他功能依赖于代理的类型:Remote Proxy 负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求;Virtual Proxy 可以缓存实体的附加信息,以便延迟对它的访问;Protection Proxy 检查调用者是否具有实现一个请求所必需的访问权限。
    ✦ Subject 定义 RealSubject 和 Proxy 的共用接口,这样就在任何使用 RealSubject 的地方都可以使用Proxy。
    ✦ RealSubject 定义 Proxy 所代表的实体。

    代理模式实例代码(Java)

    interface Subject {
        public void buy();
    }
    
    class Proxy implements Subject {
        protected RealSubject realSubject;
    
        public Proxy(RealSubject realSubject) {
            this.realSubject = realSubject;
        }
    
        @Override
        public void buy() {
            System.out.println("办理购买前的手续");
            realSubject.buy(); // 付钱
            System.out.println("办理购买后的手续");
        }
    }
    
    class RealSubject implements Subject {
        @Override
        public void buy() {
            System.out.println("付钱");
        }
    }
    
    public class ProxyPattern {
        public static void main(String[] args) {
            RealSubject realSubject = new RealSubject();
            Proxy proxy = new Proxy(realSubject);
    
            proxy.buy();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    其他设计模式详见本专栏其他博文~
    特别感谢zst_2001在备考软考期间提供的帮助,贴上博主B站
    zst_2001的个人空间

  • 相关阅读:
    SpringSecurity以及Oauth2(笔记)
    第14届蓝桥杯青少组python试题解析:22年10月选拔赛
    【web课程设计网页规划与设计】基于HTML+CSS+JavaScript火车票网上预订系统网站(4个页面)
    Elasticsearch:什么是大语言模型 (LLMs)?
    Linux多任务编程(并发)
    硅谷华人天才CEO被开除,是否会有奇迹发生?
    并查集及相关变形
    骑车与走路
    Pytorch实战 | 第P1周:实现mnist手写数字识别
    06 Spring_AOP
  • 原文地址:https://blog.csdn.net/qq_44033208/article/details/132908090