设计模式之代理

简介: 设计模式之代理

代理模式介绍


679140-20210818091435076-464664955.png


代理模式


是一种结构型设计模式,让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问,并允许在将请求提交给对象前后进行一些处理。


其实说通俗点,就好比我们平时生活中的购买机票,火车票,我们以前的做法是去县上或市区的每一个代理点去购买,你不需要关心代理点的工作人员去哪、购买车票,你只需要给钱说购买的地方,其余的一切都交由他负责。那么在这个购票的过程中,代理点的购票员就相当于是一种代理模式。


代理模式最常见的地方就是数据库操作部分,对于数据库的操作很多时候我们都在使用代理的模式来进行,比如我们常用的ORM其实说白了也是代理的一种特殊表现形式。


679140-20210818091736479-1882940424.png


代理模式结构


  • 服务接口 声明服务接口,代理必须遵循该接口才能伪装成服务对象。


  • 服务 类提供一些实用的业务逻辑。


  • 代理 类包含一个指向服务对象的引用成员变量。代理完成其任务(例如延迟初始化、记录日志、访问控制和缓存等)后会将请求传递给服务对象。通常情况下,代理会对其服务对象的整个生命周期进行管理。


  • 客户端 能通过同一接口或代理进行交互,所以你可在一切需要服务对象的代码中使用代理。



代理模式应用场景


  • 延迟初始化


  • 访问控制


  • 本地执行远程服务(远程代理)


  • 记录日志请求


  • 智能引用


代理模式的实现方式


  • 如果没有现成的服务接口,你就需要创建一个接口来实现代理和服务对象的可交换性。


  • 创建代理类,其中必须包含一个存储指向服务的引用的成员变量(创建服务并对其整个生命周期进行管理,客户端通过构造函数将服务传递给代理)。


  • 根据需求实现代理方法。在大部分情况下,代理在完成一些任务后应将工作委派给服务对象。


  • 可以考虑新建一个构建方法来判断客户端可获取的是代理还是实际服务。(可在代理类中创建一个静态方法,也可以创建工厂方法)


  • 可以考虑为服务对象提供延迟初始化操作


Demo


原始类提取的接口


 public interface ISubject 
    {
        void Request();
    }


原始类和代理类的实现


 /// <summary>
    /// 代理的对象  
    /// 在代理类中提前声明并通过构造函数实例化
    /// </summary>
    public class RealSubject : ISubject
    {
        public void Request()
        {
            Console.WriteLine("打印原始的RealSubject");
        }
    }
    /// <summary>
    /// 代理类 ,实现了ISbuject接口
    /// </summary>
    public class Proxy : ISubject
    {
        private RealSubject _realSubject;
        public Proxy(RealSubject realSubject)
        {
            this._realSubject = realSubject;
        }
        public void Request()
        {
            if (CheakAccess())
            {
                _realSubject.Request();
                LogAcess();
            }
        }
        private bool CheakAccess() 
        {
            Console.WriteLine("Proxy:类  检测验证");
            return true;
        }
        private void LogAcess()
        {
            Console.WriteLine("Proxy类,主动输出LogAcess");        
        }
    }



客户端和验证Main方法


   /// <summary>
    /// 验证的客户端
    /// 可接收实现了ISubject接口的类
    /// </summary>
    public class Client
    {
        public void ClientCode(ISubject subject)
        {
            subject.Request();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Client client = new Client();
            Console.WriteLine("开始");
            RealSubject realSubject = new RealSubject();
            client.ClientCode(realSubject);
            Console.WriteLine("-------------");
            Proxy proxy = new Proxy(realSubject);
            client.ClientCode(proxy);
            Console.ReadKey();
        }
    }



679140-20210818091700396-1516377396.png


通过上面的数据库访问示意图和练习的Demo代码,可以非常清楚的了解代理模式。在我们平时的业务开发过程中,可以多多留意是否有这样的需求可以满足代理模式的要求,那么就大概率可以使用代理模式来实现或重构。



一个好的设计模式,是恰当好处的出现在了业务刚好需要它的时候才是最美妙的。

目录
相关文章
|
7月前
|
设计模式 XML JSON
二十三种设计模式全面解析-代理模式进阶篇:揭秘远程代理
二十三种设计模式全面解析-代理模式进阶篇:揭秘远程代理
167 0
|
设计模式 缓存 安全
设计模式之代理模式的懂静态代理和动态代理
设计模式之代理模式的懂静态代理和动态代理
137 0
|
2月前
|
设计模式 网络协议 Java
05.静态代理设计模式
《静态代理设计模式》详细介绍了静态代理的基本概念、原理与实现、应用场景及优缺点。主要内容包括静态代理的由来、定义、使用场景、实现方式、结构图与时序图,以及其在降低耦合、保护对象权限等方面的优势。同时,文章也指出了静态代理的局限性,如缺乏灵活性、难以复用、难以动态添加功能等,并介绍了动态代理如何弥补这些不足。最后,通过多个实际案例和代码示例,帮助读者更好地理解和应用静态代理模式。
43 4
|
3月前
|
设计模式 Java Spring
spring源码设计模式分析-代理设计模式(二)
spring源码设计模式分析-代理设计模式(二)
|
7月前
|
设计模式 缓存 安全
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
设计模式-代理模式(静态代理、动态代理、cglib代理)、代理模式和装饰者模式的区别
|
设计模式 缓存 Java
代理设计模式解读(下)
代理设计模式解读(下)
|
7月前
|
设计模式 安全 Java
静态代理还是动态代理?来聊聊Java中的代理设计模式
代理模式(Proxy Design Pattern)是一种结构型设计模式,为一个对象提供一个代理对象,然后使用代理对象控制对原对象的引用。即通过代理对象访问目标对象。被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。
54 0
静态代理还是动态代理?来聊聊Java中的代理设计模式
|
7月前
|
设计模式
装饰者设计模式(二)番外篇 装饰者设计模式和静态代理设计模式区别
装饰者设计模式(二)番外篇 装饰者设计模式和静态代理设计模式区别
|
设计模式 Java
设计模式之代理模式(静态&动态)代理
二十三种设计模式中的一种,属于结构型模式。它的作用就是通过提供一个代理类,让我们在调用目标方法的时候,不再是直接对目标方法进行调用,而是通过代理类间接调用。让不属于目标方法核心逻辑的代码从目标方法中剥离出来——解耦。调用目标方法时先调用代理对象的方法,减少对目标方法的调用和打扰,同时让附加功能能够集中在一起也有利于统一维护。
56 0
|
设计模式 缓存 Java
Java反射(反射与代理设计模式、反射与Annotation、自定义Annotation、反射整合工厂设计模式和代理设计模式)
1.反射与代理设计模式,2.反射与Annotation,3.自定义Annotation,4.Annotation整合工厂设计模式和代理设计模式
77 0