13_代理模式

代理模式是一种结构型设计模式,它提供了一个代理对象来控制对其他对象的访问。代理对象可以作为目标对象的代表,以控制对目标对象的访问、限制或增加功能。

代理模式有三个主要角色:

  1. 抽象主题(Subject):定义了目标对象和代理对象的公共接口,可以是抽象类或接口。

  2. 真实主题(Real Subject):实现了抽象主题接口,是被代理的真实对象。

  3. 代理(Proxy):实现了抽象主题接口,并持有一个真实主题的引用。代理可以在调用真实主题之前或之后执行额外的操作。

代理模式的工作原理如下:

  1. 抽象主题定义了目标对象和代理对象的公共接口,包含了需要增加或限制的方法。

  2. 真实主题实现了抽象主题接口,并实现了真实的业务逻辑。

  3. 代理实现了抽象主题接口,并持有一个真实主题的引用。代理可以在调用真实主题之前或之后执行额外的操作,如权限验证、缓存等。

  4. 客户端通过代理对象来访问目标对象,客户端无需直接与真实主题进行交互。

代理模式的优点包括:

  1. 可以实现对目标对象的访问控制,提高了系统的安全性。

  2. 可以实现对目标对象的功能增强,增加了系统的灵活性和扩展性。

  3. 可以实现对目标对象的延迟初始化,节省了系统的资源。

代理模式适用于以下场景:

  1. 当需要对目标对象的访问进行控制或增加额外功能时,可以使用代理模式。

  2. 当需要对目标对象进行延迟初始化时,可以使用代理模式。

  3. 当需要保护目标对象的安全性时,可以使用代理模式。

总结而言,代理模式通过引入代理对象来控制对目标对象的访问,可以增加或限制目标对象的功能。它提供了一种灵活的方式来控制对象的访问,并可以在不改变目标对象的情况下对其进行增强。

 

Subject

/// <summary>
    /// 加减乘除
    /// </summary>
    public interface IMath
    {
        double Add(double x, double y);
        double Subtract(double x, double y);
        double Multiply(double x, double y);
        double Divide(double x, double y);
    }

 

Real Subject

public class Math : IMath
    {
        public double Add(double x, double y)
        {
            return x + y;
        }

        public double Divide(double x, double y)
        {
            return x / y;
        }

        public double Multiply(double x, double y)
        {
            return (x * y);
        }

        public double Subtract(double x, double y)
        {
            return (x - y);
        }
    }

 

Proxy

public class MathProxy : IMath
    {
        private Math math = new Math();
        public double Add(double x, double y)
        {
            var result = math.Add(x, y);
            Console.WriteLine($"{x}+{y}={result}");
            return result;
        }

        public double Divide(double x, double y)
        {
            if (y == 0)
            {
                Console.WriteLine("0不能作为除数");
                return 0;
            }
            var result = math.Divide(x, y);
            Console.WriteLine($"{x}/{y}={result}");
            return result;
        }

        public double Multiply(double x, double y)
        {
            var result = math.Multiply(x, y);
            Console.WriteLine($"{x}*{y}={result}");
            return result;
        }

        public double Subtract(double x, double y)
        {
            var result = math.Subtract(x, y);
            Console.WriteLine($"{x}-{y}={result}");
            return result;
        }
    }

 

调用

internal class Client
    {
        public void Start()
        {
            IMath math = new MathProxy();
            math.Add(343, 334);
            math.Divide(43, 5);
            math.Divide(45, 0);
            math.Subtract(45, 5);
            math.Multiply(3, 4);
        }
    }
static void Main(string[] args)
        {
            new Client().Start();

            Console.ReadKey();
        }

 

posted @ 2024-03-12 10:13  野码  阅读(2)  评论(0编辑  收藏  举报