张德长

导航

设计模式之:代理模式ProxyPattern的实现

代理模式的理解:

  • 当用户无法或不能直接访问某个对象时,可以通过一个代理来间接访问;
  • 为保证客户端使用的透明性,所访问的真是对象和代理对象需要实现相同的接口;
  • 代理模式分为:保护代理(Protect Proxy)、远程代理(Remote Proxy)、虚拟代理(Virtual Proxy)、缓冲代理(Cache Proxy)、智能引用代理(Smart Reference Proxy);
  • 本例属于保护代理(Protect Proxy),用于控制对一个对象的访问,给不同的用户提供不同的访问权限;

类图 with StarUML

搜索引擎接口

    internal interface Seacher
    {
        string DoSearch(string userId,string keyword);
    }

搜索引擎真正的实现类

    internal class RealSeacher : Seacher
    {
        public string DoSearch(string userId, string keyword)
        {
            Console.WriteLine($"用户[{userId}]使用关键词[{keyword}]查询信息");
            return $"关键词[{keyword}]的查询结果:\n古墓派最上乘的武功,亦是金庸武侠小说中最绝顶的武功之一。\n是祖师林朝英创来专门用来克制全真派的武功,修练时须得二人同练,互为臂助。\n修练的第一步是先练成古墓派本门各项武功。\n第二步是学全真派武功。\n第三步再练克制全真派武功的玉女心经。\n其境界已达到九阴真经的境界,亦即是无上的境界。";
        }
    }

搜索引擎代理类

    internal class ProxySeacher:Seacher
    {
        private RealSeacher seacher = new RealSeacher();
        private AccessValidator validator ;
        private Logger logger ;

        public string DoSearch(string userId, string keyword)
        {
            if (this.Validate(userId))
            {
                string result = seacher.DoSearch(userId, keyword);
                this.Log(userId);
                return result;
            }
            else
            {
                return null;
            }
        }
        public bool Validate(string userId)
        {
            validator = new AccessValidator();
            return validator.Validate(userId);
        }
        public void Log(string userId)
        {
            logger = new Logger();
            logger.Log(userId);
        }
    }

登录验证类

    internal class AccessValidator
    {
        public bool Validate(string userId)
        {
            Console.WriteLine($"在数据库中验证用户[{userId}]是否合法?");
            if (userId.Equals("杨过"))
            {
                Console.WriteLine($"[{userId}]登录成功!");
                return true;
            }
            else
            {
                Console.WriteLine($"[{userId}]登录失败!");
                return false;
            }
        }
    }

日志打印类

    internal class Logger
    {
        public void Log(string userId)
        {
            Console.WriteLine($"用户[{userId}]查询次数加1...");
        }
    }

配置文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<appSettings>
		<add key="proxy" value ="ProxyPattern.ProxySeacher"/>
	</appSettings>
</configuration>

客户端类

    internal class Program
    {
        static void Main(string[] args)
        {
            //读取配置文件
            string proxy = ConfigurationManager.AppSettings["proxy"];
            //通过反射创建代理
            Seacher seacher = Assembly.Load("ProxyPattern").CreateInstance(proxy) as Seacher;

            string result = seacher.DoSearch("杨过","玉女心经");
            Console.WriteLine(result);
            Console.Read();
        }
    }

运行结果

posted on 2022-04-03 17:55  张德长  阅读(51)  评论(0编辑  收藏  举报