设计模式之:代理模式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的实现的主要内容,如果未能解决你的问题,请参考以下文章