13_代理模式
代理模式是一种结构型设计模式,它提供了一个代理对象来控制对其他对象的访问。代理对象可以作为目标对象的代表,以控制对目标对象的访问、限制或增加功能。
代理模式有三个主要角色:
-
抽象主题(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(); }