张德长

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

设计模式之:代理模式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   张德长  阅读(53)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示