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

Posted 张德长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之:代理模式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();
        
    

运行结果

以上是关于设计模式之:代理模式ProxyPattern的实现的主要内容,如果未能解决你的问题,请参考以下文章

ProxyPattern代理模式

设计模式之结构型--代理模式

[08]Go设计模式:代理模式(ProxyPattern)

设计模式之代理模式

javaweb 之 代理模式

设计模式之代理模式