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();
        }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章