设计模式之代理模式

代理模式

  • 定义:

    ​ 又叫委派模式,给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。简而言之,就是一种访问目标对象的方式,通过代理对象实现对目标对象的使用,同时也控制了外界对目标对象的访问。通俗来讲就是我们现实中的中介。

  • 使用场景:

    代理模式一般可以分为两种,动态代理和静态代理。

    代理类主要是负责为委派类预处理消息、过滤消息、把消息传送给委派类,以及事后对结果的处理。代理类不是服务类,而是提供服务的,真正的服务由委派类去执行。

    代理模式主要是为了提供控制访问。

    1. 静态代理:程序员创建的工具类,代理类和委派类的关系在运行前就确定的。
    2. 动态代理:程序运行期间由JVM根据反射机制动态的生成,所以不存在代理类的字节码文件。代理类和委派类的关系是在程序运行时确定的。
  • UML:

    1. Subject:被委派的抽象类或是接口。
    2. RealSubject:被委派或者被代理的角色,业务具体的执行者。
    3. Proxy:代理类或者委派类,负责对被委派类的应用。

在这里插入图片描述

  • 优点:

    1. 被委派类或者被代理类可以更加专注于主要功能的实现,而无须考虑其他。
    2. 代理类可以在被代理类中添加功能。
    3. 可以很好的控制被代理类的访问情况,保证数据的安全。
  • 缺点:

    1. 静态代理时代理类和被代理类都要实现相同的接口,会出现代码重复,还有增加了代码的维护的难度。
    2. 代理对象只负责一钟类型的对象,如果静态代理规模比较大的话,系统的压力也就比较大。
    3. 动态代理始终无法摆脱仅支持接口代理的处境。
  • 样例:

    静态代理:

    public interface Subject{
        /**
         * 接口方法
         */
        void request() ;
    }
    
    public class RealSubject implements Subject {
        
        @Override
        public void request(){
            System.out.println("RealSubject.request()方法被执行") ;
        }
    }
    
    public class Proxy implements Subject {
        
        private Subject subject ;
        
        public Proxy(Subject subject){
            this.subject = subject ;
        }
        
        @Override
        public void request(){
            this.before() ;
            System.out.println("Proxy.request()方法被执行") ;
            this.subject.request() ;
            this.after() ;
        }
        
        public void before(){
            //预处理
        }
        
        public void after(){
            //后处理
        }
    }
    
代理模式是一种结构型设计模式,它提供一个代理对象来代表另一个对象。在代理模式中,有一个被称为实际对象(Subject)和一个被称为代理对象(Proxy)的中介,代理对象持有实际对象的引用,并且可以控制对实际对象的访问。代理模式的主要目的是在不修改原始对象的情况下,为原始对象添加额外的逻辑处理。 代理模式分为多种类型,如远程代理、虚拟代理、保护代理等,它们各自有不同的应用场景: - 远程代理:为远程对象提供一个本地代表。 - 虚拟代理:根据需要创建开销大的对象,通过虚拟代理控制访问这些对象的过程。 - 保护代理:控制对原始对象的访问权限,例如进行权限检查。 代理模式的优点包括: 1. 能够控制对真实对象的访问,并在访问前后添加额外的逻辑。 2. 可以通过代理对象实现延迟加载,即在实际需要时才创建真实对象。 3. 增强了对真实对象的封装,并且可以避免对真实对象的重复引用。 在C#中实现代理模式通常涉及以下步骤: 1. 定义一个接口或抽象类,声明真实对象和代理对象需要实现的方法。 2. 实现真实对象的类,按照接口或抽象类的要求实现具体方法。 3. 实现代理类,它同样实现接口或抽象类,并在方法中持有真实对象的引用,通过调用真实对象的方法来执行所需的操作,同时可以添加额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值