博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之—代理模式
阅读量:6352 次
发布时间:2019-06-22

本文共 2281 字,大约阅读时间需要 7 分钟。

1.代理模式定义

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

2.代理模式通用类图

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

929184-20180831235142065-1623150233.png

其中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是典型的动态代理模式

下面我们以网络连接中的代理为例说明动态代理,类图如下:
929184-20180831235208642-1096431036.png

首先定义一个网络连接器: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.");    }}

转载于:https://www.cnblogs.com/vitasyuan/p/9568823.html

你可能感兴趣的文章
《Python和Pygame游戏开发指南》——1.14 配套网站上的更多信息
查看>>
Kafka+Flink 实现准实时异常检测系统
查看>>
利用mybatis查询两级树形菜单
查看>>
《慕客网:IOS基础入门之Foundation框架初体验》学习笔记 <一>
查看>>
Spring声明式事务管理之二:核心接口API
查看>>
LNMP环境安装(二)
查看>>
MFC对话框编程-图片控件
查看>>
nodejs启动webserver服务
查看>>
小偷被抓叫嚣:我不偷警察没饭吃
查看>>
python初学—-实现excel里面读数据进行排序
查看>>
用户体验升级后 “谁行谁上”让百度Q4财报更有底气
查看>>
直播相关学习链接
查看>>
使用RPM包工具和源码包编译安装Linux应用程序
查看>>
VoIP——开启免费通话新时代的先锋
查看>>
Linux下rsync的用法
查看>>
apache虚拟主机、日志轮询、日志统计、去版本优化
查看>>
java代码实现开启openoffice服务和关闭sffice.exe进程
查看>>
docker镜像的使用方法
查看>>
提升HTTPS安全评级
查看>>
iOS开发过程中的心得
查看>>