保護代理模式(Access Proxy), 也叫Protect Proxy. 這種代理用於對真實對象的功能作一些訪問限制, 在代理層作身份驗證. 經過了驗證, 才調用真實的主體對象的相應方法.java
模擬場景以下: 某平臺的系統有查詢功能, 能夠根據關鍵詞進行查詢, 在查詢以前對該關鍵詞進行檢查, 若是關鍵詞是敏感詞, 那麼就不予處理. 若是成功查詢了該關鍵詞, 那麼就記錄一條日誌.sql
(敏感詞驗證同理也能夠換成 `用戶的身份驗證` 之類的其餘的驗證)json
不管是實體類仍是代理類, 都須要實現這個接口. 由於本例子中的主要功能就是搜索. 代理類作的事情就是接管(代理)這個方法, 而後再執行這個方法以前進行敏感詞驗證, 執行這個方法成功的時候進行日誌記錄.工具
public interface Searchable { String search(String keyword); }
這是真實的實體對象, 他的主要方法search()在本例子中僅僅是一條SQL語句, 在真實的場景中能夠是sql的查詢`結果集`.代理
public class RealSearch implements Searchable { public RealSearch() { } /** * 真實的查詢 */ public String search(String keyword) { return "真正的查詢: SELECT * FROM users WHERE keyword = " + keyword; } }
工具類, 用於記錄日誌(固然, 在本里子中僅僅是模擬記錄日誌)調試
public class LoggerHelper { /** * 記錄日誌 */ public static void log(String keyword) { System.out.println("模擬log4j記錄日誌 >> info >> login >> keyword: [" + keyword + "]"); } }
工具類, 用於驗證是不是敏感信息.日誌
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()); } }
代理類, 作的事情就是接管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; } } }
在本類中調用/調試/運行blog
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); } }
運行結果以下: 接口