代理模式是一種結構型設計模式,它提供了一個代理對象來控制對其他對象的訪問。代理對象可以作爲目標對象的代表,以控制對目標對象的訪問、限制或增加功能。
代理模式有三個主要角色:
-
抽象主題(Subject):定義了目標對象和代理對象的公共接口,可以是抽象類或接口。
-
真實主題(Real Subject):實現了抽象主題接口,是被代理的真實對象。
-
代理(Proxy):實現了抽象主題接口,並持有一個真實主題的引用。代理可以在調用真實主題之前或之後執行額外的操作。
代理模式的工作原理如下:
-
抽象主題定義了目標對象和代理對象的公共接口,包含了需要增加或限制的方法。
-
真實主題實現了抽象主題接口,並實現了真實的業務邏輯。
-
代理實現了抽象主題接口,並持有一個真實主題的引用。代理可以在調用真實主題之前或之後執行額外的操作,如權限驗證、緩存等。
-
客戶端通過代理對象來訪問目標對象,客戶端無需直接與真實主題進行交互。
代理模式的優點包括:
-
可以實現對目標對象的訪問控制,提高了系統的安全性。
-
可以實現對目標對象的功能增強,增加了系統的靈活性和擴展性。
-
可以實現對目標對象的延遲初始化,節省了系統的資源。
代理模式適用於以下場景:
-
當需要對目標對象的訪問進行控制或增加額外功能時,可以使用代理模式。
-
當需要對目標對象進行延遲初始化時,可以使用代理模式。
-
當需要保護目標對象的安全性時,可以使用代理模式。
總結而言,代理模式通過引入代理對象來控制對目標對象的訪問,可以增加或限制目標對象的功能。它提供了一種靈活的方式來控制對象的訪問,並可以在不改變目標對象的情況下對其進行增強。
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(); }