代理模式

一、概念界定

委托、代理、中介

二、委托(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";
        }
    }

 

运行结果:

 

posted on 2023-05-25 15:14  一只向上爬的小蜗牛  阅读(24)  评论(0编辑  收藏  举报