1. 代理模式的原理与实现

在不改变原始类(或叫呗代理类)的情况下,通过带入代理类来给原始类附加功能,一般情况下,我们让代理类和原始类实现同样的接口,但是,如果原始类并没有定义接口,并且原始代码不是我们开发维护的,在这种情况下,我们可以通过让代理类继承原始类的方法来实现代理模式

2. 动态代理的原理与实现

静态代理需要争对每个类都创建一个代理类,并且每个代理类中的代码都有点像模板模式的“重复”代码,增加了维护成本和开发成本,对于静态代理存在的问题,就可以通过动态代理来解决。不是事先为每个原始类编写代理类,而是在运行的时候动态的创建原始类对应的代理类,然后在系统中用代理类替换掉原始类

3. 代理模式的应用场景

代理模式常用在业务系统中开发一些非功能需求,比如:监控,统计,鉴权,限流,事务,幂等,日志。将这些附加功能与业务功能解耦,放到代理类统一处理,让程序员之需要关注业务方面的开发,除此之外,代理模式还可以用在RPC ,缓存等应用场景中。

4. 代码示例

实现了一个静态代理

 public class Poroy
    {
        // static void Main()
        // {
        //     IProtuct proxyProtuct = new ProtuctProxy();
        //     proxyProtuct.Production("汽车");
        // }


    }

    interface IProtuct
    {
         void Production(string protuct);
         
    }
    class Protuct : IProtuct
    {
        public void Production(string protuct)
        {
            Console.WriteLine($"{protuct}被生产");
        }
    }

    class ProtuctProxy : IProtuct
    {
        private readonly Protuct _protuct = new Protuct();
        public void Production(string protuct)
        {
            string methodName = nameof(Production);

            PreProcess(methodName);
            _protuct.Production(protuct);
            PostProcess(methodName);
        }
        /// <summary>
        /// 代理前置操作
        /// </summary>
        void PreProcess(string methodName)
        {
            Console.WriteLine($"{methodName}函数执行之前");
        }
        // 代理后置操作
        void PostProcess(string methodName)
        {
            Console.WriteLine($"{methodName}函数执行之后");
        }
        
    }