保護代理模式-Access Proxy 保護代理模式(Access Proxy), 也叫Protect Proxy. 這種代理用於對真實對象的功能做一些訪問限制, 在代理層做身份驗證. 通過了驗證, 才調用真實的主體對象的相應方法. 模擬場景如下: 某平臺的系統有查詢功能, 可以根據關鍵詞進行查詢, ...
保護代理模式-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); } }
運行結果如下: