zoukankan      html  css  js  c++  java
  • 保护代理模式-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);
        }
    }
    

     运行结果如下:  

  • 相关阅读:
    Linux
    memory库函数的实现
    剑指Offer面试题1
    Linux
    Linux-配置vim开发环境
    Linux-Find命令
    busybox,alphine,ubuntu,centos/fedore操作系统
    端口映射与容器互联
    docker 数据管理数据卷
    Celery
  • 原文地址:https://www.cnblogs.com/noKing/p/9064946.html
Copyright © 2011-2022 走看看