前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之—代理模式

设计模式之—代理模式

作者头像
代码改变世界-coding
发布2018-09-27 15:45:47
2700
发布2018-09-27 15:45:47
举报
文章被收录于专栏:java相关java相关java相关
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.");

    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-09-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.代理模式定义
  • 2.代理模式通用类图
  • 3.通用模式的代码实现:
  • 4.动态代理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档