保护代理模式-Access Proxy(Java实现)
保护代理模式-Access Proxy
保护代理模式(Access Proxy), 也叫Protect Proxy. 这种代理用于对真实对象的功能做一些访问限制, 在代理层做身份验证. 通过了验证, 才调用真实的主体对象的相应方法.
模拟场景如下: 某平台的系统有查询功能, 可以根据关键词进行查询, 在查询之前对该关键词进行检查, 如果关键词是敏感词, 那么就不予处理. 如果成功查询了该关键词, 那么就记录一条日志.
(敏感词验证同理也可以换成 `用户的身份验证` 之类的其他的验证)
Searchable接口
无论是实体类还是代理类, 都需要实现这个接口. 因为本例子中的主要功能就是搜索. 代理类做的事情就是接管(代理)这个方法, 然后再执行这个方法之前进行敏感词验证, 执行这个方法成功的时候进行日志记录.
public interface Searchable {
String search(String keyword);
}
RealSearch类
这是真实的实体对象, 他的主要方法search()在本例子中仅仅是一条SQL语句, 在真实的场景中可以是sql的查询`结果集`.
public class RealSearch implements Searchable {
public RealSearch() {
}
/**
* 真实的查询
*/
public String search(String keyword) {
return "真正的查询: SELECT * FROM users WHERE keyword = " + keyword;
}
}
LoggerHelper类
工具类, 用于记录日志(当然, 在本里子中仅仅是模拟记录日志)
public class LoggerHelper {
/**
* 记录日志
*/
public static void log(String keyword) {
System.out.println("模拟log4j记录日志 >> info >> login >> keyword: [" + keyword + "]");
}
}
ValidatorHelper类
工具类, 用于验证是否是敏感信息.
public class ValidatorHelper {
/**
* 敏感词黑名单
*/
private static final HashSet<String> blackList = new HashSet<String>() {{
add("jack123");
add("json898");
add("nancy");
}};
/**
* 敏感词验证
* 如果keyword在黑名单blackList里, 那么返回false
* 如果keyword不在黑名单blackList里, 那么返回true
*/
public static boolean validate(String userId) {
return !blackList.contains(userId.trim());
}
}
ProxySearch类
代理类, 做的事情就是接管RealSearch类的search()方法, 然后再执行这个方法之前进行敏感词验证, 执行这个方法成功的时候进行日志记录.
public class ProxySearch implements Searchable {
private RealSearch searcher;
public ProxySearch() {
searcher = new RealSearch();
}
/**
* 查询前的授权操作
*/
private boolean check(String keyword) {
if (ValidatorHelper.validate(keyword)) {
System.out.println("不是敏感词:" + keyword);
return true;
} else {
System.out.println("是敏感词:" + keyword);
return false;
}
}
/**
* 查询操作模板
*/
public String search(String keyword) {
if (check(keyword)) {
// 不是敏感词, 那就予以查询处理
String result = searcher.search(keyword);
// 查询成功再打一条日志记录一下
LoggerHelper.log(keyword);
// 返回查询结果
return result;
} else {
// 是敏感词, 那么就无法被正常处理.
return null;
}
}
}
Main
在本类中调用/调试/运行
public class Main {
public static void main(String[] args) {
Searchable searcher = new ProxySearch();
String keyword = "football";
String result = searcher.search(keyword);
System.out.println(result);
}
}
运行结果如下:

保护代理模式-Access Proxy(Java实现)的更多相关文章
- 远程代理模式-Remote Proxy(Java实现)
远程代理模式-Remote Proxy 服务端通过rmi将对象注册到远程服务, 客户端使用时, 只需要通过rmi协议获取即可, 只要接口统一, 即可不需要知道内部具体实现, 直接调用使用. Compa ...
- 代理模式-JDK Proxy(Java实现)
代理模式-JDK Proxy 使用JDK支持的代理模式, 动态代理 场景如下: 本文例子代理了ArrayList, 在ArrayList每次操作时, 在操作之前和之后都进行一些额外的操作. Array ...
- 虚拟代理模式-Virtual Proxy(Java实现)
虚拟代理模式-Virtual Proxy 虚拟代理模式(Virtual PRoxy)会推迟真正所需对象实例化时间. 在需要真正的对象工作之前, 如果代理对象能够处理, 那么暂时不需要真正对象来出手. ...
- JAVA设计模式(09):结构化-代理模式(Proxy)
一,定义: 代理模式(Proxy):为其它对象提供一种代理以控制对这个对象的訪问. 二.其类图: 三,分类一:静态代理 1,介绍:也就是须要我们为目标对象编写一个代理对象,在编译期就生成了这个代理对 ...
- Java设计模式(10)代理模式(Proxy模式)
理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...
- 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理
这篇博文,我们主要以类图和代码的形式来对照学习一下静态代理和动态代理.重点解析各自的优缺点. 定义 代理模式(Proxy Pattern)是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并 ...
- java设计模式(10):代理模式(Proxy)
一,定义: 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 二,其类图: 三,分类一:静态代理 1,介绍:也就是需要我们为目标对象编写一个代理对象,在编译期就生成了这个代理对 ...
- NET设计模式 第二部分 结构性模式(13):代理模式(Proxy Pattern)
代理模式(Proxy Pattern) ——.NET设计模式系列之十四 Terrylee,2006年5月 摘要:在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对 ...
- 设计模式----代理模式(Proxy)
为还有一个对象提供一个替身或占位符以控制对这个对象的訪问. 代理模式的组成: 主题接口(Subject):提取真正主题与代理的公共方法,让使用真正主题的地方也能用代理取代. 真正主题(RealSubj ...
随机推荐
- matlab中的实时音频
音频系统工具箱™针对实时音频处理进行了优化.audioDeviceReader, audioDeviceWriter, audioPlayerRecorder, dsp.AudioFileReader ...
- 放下技术,是PM迈出的第一步
上一篇,我们从项目层面提出了PM的核心能力架构.今天,我想从公司层面,分析一下PM的核心能力架构中的过程能力,这也是PM当下最关心.最真切的痛点. 还记得上一篇我的同事老A吗? 为什么他能在知名外企带 ...
- 如何从GitHub下载csv文件
当打开存.csv文件的页面时,不用直接点击页面的Download,这样会使csv文件直接用浏览器打开. 要点击Raw按钮,鼠标右键,文件另存为,可以直接把csv文件下载到本地.
- mysql(mariadb)主从配置
环境: 内核版本:uname -r 系统版本:cat /etc/redhat-release
- windows压缩图片
- Windows下查看硬连接引用技术
Win10有了bash,可以方便的进入并用ll查看文件的硬连接数. 但是用powershell直接查看就比较麻烦了,比较曲折的找到了方法: fsutil hardlink list [filename ...
- Linux学习之路(三)Shell脚本初探
本文参考链接:http://www.runoob.com/linux/linux-shell.html 基本说明 Shell脚本(shell script)是一种为shell编写的脚本程序.其中she ...
- web安全—sql注入漏洞
SQL注入-mysql注入 一.普通的mysql注入 MySQL注入不像注入access数据库那样,不需要猜.从mysql5.0以上的版本,出现一个虚拟的数据库,即:information_schem ...
- ubuntu18.04从零开始配置环境(jdk+tomcat+idea)到使用idea开发web应用和servlet
昨天吃了亏,搞了一下午才把环境配置好,故此将整个过程记录一下以防日后需要. 注意:因为我的博客模块的原因,所以我把图片压缩了一些,如果有看不清的, 可以 右键图片->在新标签页打开图片 目录: ...
- [BJOI2019]光线[递推]
题意 题目链接 分析 令 \(f_i\) 表示光线第一次从第一块玻璃射出第 \(i\) 块玻璃的比率. 令 \(g_i\) 表示光线射回第 \(i\) 块玻璃,再射出第 \(i\) 块玻璃的比率. 容 ...