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

运行结果如下:

原文地址:https://www.cnblogs.com/noKing/p/9064946.html

时间: 2024-08-03 03:49:40

保护代理模式-Access Proxy(Java实现)的相关文章

虚拟代理模式-Virtual Proxy(Java实现)

虚拟代理模式-Virtual Proxy 虚拟代理模式(Virtual PRoxy)会推迟真正所需对象实例化时间. 在需要真正的对象工作之前, 如果代理对象能够处理, 那么暂时不需要真正对象来出手. 优点: 这种方法的优点是,在应用程序启动时,由于不需要创建和装载所有的对象,因此加速了应用程序的启动. 缺点: 因为不能保证特定的应用程序对象被创建,在访问这个对象的任何地方,都需要检测确认它不是空(null).性能的降低上不仅仅是多了一句代码这么简单, ` if ` 这种跳转类语句的很有可能会阻塞

代理模式-JDK Proxy(Java实现)

代理模式-JDK Proxy 使用JDK支持的代理模式, 动态代理 场景如下: 本文例子代理了ArrayList, 在ArrayList每次操作时, 在操作之前和之后都进行一些额外的操作. ArrayListProxy类 这里是代理的实现. import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class ArrayListProxy implements InvocationHan

【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理

这篇博文,我们主要以类图和代码的形式来对照学习一下静态代理和动态代理.重点解析各自的优缺点. 定义 代理模式(Proxy Pattern)是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并由代理对象控制对原对象的引用. 代理模式不会改变原来的接口和行为,仅仅是转由代理干某件事,代理能够控制原来的目标,比如:代理商,代理商仅仅会买东西,但并不会改变行为.不会制造东西. 让我们通过以下的代码好好理解一下这句话. 分类 静态代理和动态代理 静态代理 静态代理类图 代码演示样例 接口 pac

java设计模式(10):代理模式(Proxy)

一,定义:  代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 二,其类图: 三,分类一:静态代理 1,介绍:也就是需要我们为目标对象编写一个代理对象,在编译期就生成了这个代理对象,然后通过访问这个代理,来实现目标对象某些功能. 2,简单应用:在这里我们看一个简单的登录登出的例子: 登录功能的接口: [java] view plaincopyprint? /** * 公共接口,目标对象和代理都来实现 */ public interface ILogin{ //登录 void

java设计模式学习 ----- 代理模式(Proxy)

代理模式(Proxy) 其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思.再如我们有的时候打官司,我们需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们的想法.先来看看关系图: 根据上文的阐述,代理模式就比较容易的理解了,我们看下代码: public interface Sourceable { publ

NET设计模式 第二部分 结构性模式(13):代理模式(Proxy Pattern)

代理模式(Proxy Pattern) ——.NET设计模式系列之十四 Terrylee,2006年5月 摘要:在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来代替目标对象打点一切.这就是本文要说的Proxy模式. 主要内容 1.例说Proxy模式 2.Proxy模式效果及实现要点 …… 概述 在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而

设计模式----代理模式(Proxy)

为还有一个对象提供一个替身或占位符以控制对这个对象的訪问. 代理模式的组成: 主题接口(Subject):提取真正主题与代理的公共方法,让使用真正主题的地方也能用代理取代. 真正主题(RealSubject):真正处理请求的类. 代理(Proxy):真正主题的代理类,请求方通过调用代理对象间接调用真正主题. 代理模式的简单样例: (主题接口类)Subject.java package xu.neng.Proxy; public interface Subject { public void re

第12章 代理模式(Proxy Pattern)

原文   第12章 代理模式(Proxy Pattern) 代理模式 概述: 在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来代替目标对象打点一切.这就是本文要说的Proxy模式. 结构图:     举例:       代练游戏,玩游戏,自己不想花时间去升级.委托给代练. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1

C#设计模式之十二代理模式(Proxy Pattern)【结构型】

原文:C#设计模式之十二代理模式(Proxy Pattern)[结构型] 一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看."代理"可以理解为"代替",代替"主人"做一些事情,为什么需要"代理",是因为某些原因(比如:安全方面的原因),不想让"主人"直接