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

 运行结果如下:  

 

posted @ 2018-05-20 22:27  GoldArowana  阅读(1904)  评论(1编辑  收藏  举报