zl程序教程

您现在的位置是:首页 >  后端

当前栏目

【23种设计模式】代理模式(Proxy Pattern) .Net Core实现

2023-09-11 14:14:50 时间

简介

代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

当一个复杂对象的多份副本须存在时,代理模式可以结合享元模式以减少存储器用量。典型作法是创建一个复杂对象及多个代理者,每个代理者会引用到原本的复杂对象。而作用在代理者的运算会转送到原本对象。一旦所有的代理者都不存在时,复杂对象会被移除。

说白了就是中介,大学的时候打过暑假工的都应该知道,你要进电子厂打工,中间谁签的线?带你去电子厂,并且能让你进去的那个人就是代理。比如你要买东西,你自己不打算去,让别人帮你买,也是代理。

废话不多说,写个简单明了的例子,就行了。首先要抽象一个角色这个角色是抽象类或者接口都行。下面就写个接口

组成

  1. 抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
  2. 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
  3. 真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用

实现

interface

 public interface Workinerface
    {
        //工作类
        void Work(string PersonName);
    }

定义一个真实角色类

public class Peron : Workinerface
    {
        public void Work(string PersonName)
        {
            Console.WriteLine($"姓名为{PersonName}去了电子厂,做的工作是");
        }
    }

定义一个代理角色

public class Proxy : Workinerface
    {
      public  PeronClass person;
        public Proxy()
        {
            person = new PeronClass();
        }

        public void Work(string PersonName)
        {
            before();
            person.Work(PersonName);
            after();
        }
        public void before()
        {
            Console.WriteLine("真实角色执行前。。。。");
        }public void after()
        {
            Console.WriteLine("真实角色执行后。。。。");
        }
        
    }

客户端调用

class Program
    {
        static void Main(string[] args)
        {
           
            Workinerface work = new Proxy();
            work.Work("张三");
            Console.Read();
        }

效果
在这里插入图片描述
代理模式就是这样实现的,是不是很简单。(其实代理模式的好处就是,在真实角色没有执行自己的方法之前和之后可以做一些操作)

改进

但是后来我又想了想,如果一个代理不止代理一种类型,于是我就改进了一下:

public interface Workinerface
    {
        //工作类
        void Run(string PersonName);
    }
 
    public class PeronClass : Workinerface
    {
        public void Run(string PersonName)
        {
            Console.WriteLine($"姓名为{PersonName}去了电子厂");
        }
    }
    public class RentHouse : Workinerface
    {
        public void Run(string PersonName)
        {
            Console.WriteLine($"姓名为{PersonName}租了房");
        }
    }

    public class Proxy<T> : Workinerface where T : Workinerface, new()
    {
      public  T t;
        public Proxy()
        {
            t = new T();
        }

        public void Run(string PersonName)
        {
            before();
            t.Run(PersonName);
            after();
        }
        public void before()
        {
            Console.WriteLine("真实角色执行前。。。。");
        }public void after()
        {
            Console.WriteLine("真实角色执行后。。。。");
        }

客户端调用

class Program
    {
        static void Main(string[] args)
        {
          
            Workinerface work = new Proxy<PeronClass>();
            Workinerface house = new Proxy<RentHouse>();
            work.Run("张三");
            house.Run("李四");
            Console.Read();
        }

效果
在这里插入图片描述

优点

  • 职责清晰,真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
  • 代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
  • 高扩展性

来源

代理模式
.net core 设计模式—>代理模式