保護代理模式-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);
}
}
運行結果如下:

