保护代理模式-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 HashSetblackList = new HashSet () {{ 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); } }
运行结果如下: