保護代理模式-Access Proxy(Java實現)

保護代理模式-Access Proxy

保護代理模式(Access Proxy), 也叫Protect Proxy. 這種代理用於對真實對象的功能作一些訪問限制, 在代理層作身份驗證. 經過了驗證, 才調用真實的主體對象的相應方法.java

 模擬場景以下: 某平臺的系統有查詢功能, 能夠根據關鍵詞進行查詢, 在查詢以前對該關鍵詞進行檢查, 若是關鍵詞是敏感詞, 那麼就不予處理. 若是成功查詢了該關鍵詞, 那麼就記錄一條日誌.sql

(敏感詞驗證同理也能夠換成 `用戶的身份驗證` 之類的其餘的驗證)json

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

在本類中調用/調試/運行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);
    }
}

 運行結果以下:  接口

相關文章
相關標籤/搜索