设计模式之:代理模式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();
}
}
运行结果