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


保護代理模式-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);
    }
}

 運行結果如下:  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM