设计模式之—代理模式

1.代理模式定义

Provide a surrogate or placeholder for another object to control access to it. 对其他对象提供一种代理,以控制对这个对象的访问

2.代理模式通用类图

代理模式的通用类图如下:

其中Subject为抽象主题角色:

Subject为普通业务接口

RealSubject为具体主题角色:

此类为具体被代理的对象

Proxy为代理类:

此类负责执行被代理的功能,并且在处理前后做预处理和善后操作

3.通用模式的代码实现:

Subject类:

public interface Subject {

    /**
     * 发送request请求
     */
    void request();
}

RealSubject类:

public class RealSubject implements Subject {

    @Override
    public void request() {
        System.out.println("Send request:" + "....");
    }
}

Proxy代理类,在代理类中可以通过构造函数或setter方法传入。

public class Proxy implements Subject {

    private Subject subject;

    public Proxy(Subject subject){
        this.subject = subject;
    }

    @Override
    public void request() {
        subject.request();
    }

    private void before(){
        // do before
    }

    private void after(){
        //do after
    }
}

4.动态代理

动态代理:是在实现阶段不用关心代理谁,而在运行阶段才指定代理哪一个对象。

其中Spring的AOP是典型的动态代理模式 下面我们以网络连接中的代理为例说明动态代理,类图如下:

首先定义一个网络连接器:Connector,此方法中只定义了一个connect方法,用于创建网络连接,代码如下:

public interface Connector {

    /**
     * 建立网络连接
     */
    void connect();
}

然后定义Connector接口的实现类如下:

public class NetworkConnector implements Connector {

    @Override
    public void connect() {
        System.out.println("Connect to network.");
    }
}

此类为被代理的对象。 最后定义动态代理类,JDK中定义了用于动态代理的接口

InvocationHandler,实现动态代理的类必须实现此接口。

代码如下:

public class NetworkConnectorDP implements InvocationHandler {

    private Object realObject;

    public NetworkConnectorDP(Object realObject){
        this.realObject = realObject;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Exception{
        return method.invoke(this.realObject, args);
    }
}

最后定义Client带使用动态代理功能,代码如下:

public class Client {

    public static void main(String[] args) throws Exception {
        Connector connector = new NetworkConnector();

        InvocationHandler handler = new NetworkConnectorDP(connector);
        ClassLoader classLoader = connector.getClass().getClassLoader();

        Connector proxy = (Connector) Proxy.newProxyInstance(classLoader, new Class[]{Connector.class}, handler);
        System.out.println("Start connect to network.");
        proxy.connect();
        System.out.println("Connect to network finished.");

    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

Python黑客学习笔记:从HelloWorld到编写PoC(上)

本系列文章适合CS在读学生和万年工具党,本文会在英文原文的基础上做些修改,并适当增加些解释说明。 ? 本篇包含原文的前几部分: 0x0 – Getting St...

316100
来自专栏FreeBuf

代码审计 | DedeCMS v 5.7 sp2 RemoveXSS bypass

DedeCMS 简称织梦CMS,当前最新版为 5.7 sp2,最近又去挖了挖这个CMS,发现过滤XSS的RemoveXSS函数存在缺陷导致可以被绕过。

31730
来自专栏Java架构沉思录

Java并发编程之阻塞队列

使用非阻塞队列的时候有一个很大问题就是:它不会对当前线程产生阻塞,那么在面对类似消费者-生产者的模型时,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来...

10820
来自专栏北京马哥教育

Python 基础语法

Python语言与Perl,C和Java等语言有许多相似之处。但是,也存在一些差异。 在本章中我们将来学习Python的基础语法,让你快速学会Python编程...

45160
来自专栏Java学习之路

Java的LockSupport工具,Condition接口和ConditionObject LockSupportConditionConditionObject

在之前我们文章(关于多线程编程基础和同步器),我们就接触到了LockSupport工具和Condition接口,之前使用LockSupport工具来唤醒阻塞的线...

36750
来自专栏公众号_薛勤的博客

Java多线程编程核心技术(三)多线程通信

通过本节可以学习到,线程与线程之间不是独立的个体,它们彼此之间可以互相通信和协作。

13380
来自专栏Java学习网

Java Web中Request对象的52个方法—即查即用

Request表示HttpServletRequest对象,它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session...

30380
来自专栏aCloudDeveloper

总结:常用的通用数据处理指令

作者:bakari  时间:2012.4.21 1、 操作数类型 Imm立即操作数 Reg寄存器操作数 Mem内存操作数 2、 操作数寻址方式 立即数寻址 寄存...

20680
来自专栏我是攻城师

Hadoop进阶之输入路径如何正则通配?

48950
来自专栏小灰灰

Java 回调函数的使用

回调函数 回调函数是什么鬼, 回调函数干嘛用,回调函数可以怎么用 如果有过android开发经验,经常可以看到一些类似下面的代码 Button Btn1 = ...

40780

扫码关注云+社区

领取腾讯云代金券