代理模式
一、概念界定
委托、代理、中介
二、委托(Delegate)
委托是一种引用方法的类型,相当于C++
里的函数指针。
三、代理(Proxy)
见他如见我就叫代理,产品代理商,代购,租房代理
四、中介(Mediator)
中间搭桥就是中介,最终双方还是要见面,租房中介
五、定义
为其他对象提供一种代理以控制对这个对象的访问。
六、总结
随着系统复杂度的发展,代理模式更偏向于是一种架构模式,在各种框架中以及与各种中间件交互是是非常常见的,而在我们自己的代码中反而很少见了,它更多的体现的是一种思想,而非代码实现。
七、示例
现在实现当用户是管理员,能查询到真实的查询结果;当用户是普通用户时查询不到结果返回没有权限。
1.Program.cs
internal class Program { static void Main(string[] args) { // 创建代理并尝试使用代理执行查询 IDatabaseExecutor executorProxy = new DatabaseExecutorProxy("admin", "password"); executorProxy.ExecuteQuery("select count(*) from users"); // 执行查询 // 修改用户为非管理员 executorProxy = new DatabaseExecutorProxy("user", "hello"); executorProxy.ExecuteQuery("select count(*) from users"); // 输出 Access Denied! } }
2.IDatabaseExecutor.cs
public interface IDatabaseExecutor { void ExecuteQuery(string query); }
3.DatabaseExecutor.cs
public class DatabaseExecutor : IDatabaseExecutor { public void ExecuteQuery(string query) { Console.WriteLine($"Executing Query: {query}"); } }
4.DatabaseExecutorProxy.cs
public class DatabaseExecutorProxy : IDatabaseExecutor { private readonly string _user; private readonly string _password; private readonly IDatabaseExecutor _executor; public DatabaseExecutorProxy(string user, string password) { _user = user; _password = password; _executor = new DatabaseExecutor(); } public void ExecuteQuery(string query) { if (CheckAccess()) { _executor.ExecuteQuery(query); } else { Console.WriteLine("Access Denied!"); } } private bool CheckAccess() { return _user == "admin" && _password == "password"; } }
运行结果: