zoukankan      html  css  js  c++  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.");
    
        }
    }
  • 相关阅读:
    PHP中的list方法
    PHP通过引用传递参数
    PHP浮点数的精确计算BCMath
    cssViewer牛逼的chrome插件
    Chrome浏览器插件VisualEvent,可以方便的查看页面绑定的事件
    Javascript水平提升
    360良心制作fonts.useso.com
    PHP函数htmlspecialchars_decode
    ecshop移动端支付宝支付对接
    转:阿里旺旺导致python安装包失败的解决办法
  • 原文地址:https://www.cnblogs.com/vitasyuan/p/9568823.html
Copyright © 2011-2022 走看看