zoukankan      html  css  js  c++  java
  • 代理模式(Proxy Pattern)

    代理模式

    一、什么是代理模式

      代理模式(Proxy Pattern),指调用者通过调用代理对象来访问真实对象,在真实对象访问之前或者之后加入对应的逻辑,或者根据其他规则控制是否使用真实对象。代理对象需要和真实对象建立代理关系。

    二、代理模式的步骤

    1. 代理对象和真实对象建立代理关系
    2. 实现代理对象的代理逻辑方法

    三、代理模式的优缺点

    1、优点

    1. 职责清晰。
    2. 高扩展性。
    3. 智能化。

    2、缺点

    1. 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
    2. 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

    四、代码实现

    1、代理模式中的角色

    1. 抽象对象角色:声明了目标类及代理类对象的共同接口,这样在任何可以使用目标对象的地方都可以使用代理对象。
    2. 目标对象角色:定义了代理对象所代表的目标对象。
    3. 代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象和目标对象具有统一的接口,以便可以再任何时候替代目标对象。代理对象通常在客户端调用传递给目标对象之前或者之后,执行某些操作,而非单纯的将调用传递给目标对象。

    2、具体代码实现

    /**
     * 抽象对象
     *
     * @author zt1994 2019/3/2 16:25
     */
    public interface SayHello {
    
        void sayHelloWorld();
    }
    
    /**
     * 真实对象
     *
     * @author zt1994 2019/3/2 16:27
     */
    public class SayHelloImpl implements SayHello {
    
        @Override
        public void sayHelloWorld() {
            System.out.println("Hello World!");
        }
    }
    
    /**
     * 代理对象
     *
     * @author zt1994 2019/3/2 16:28
     */
    public class SayHelloProxy implements SayHello {
    
        private SayHello sayHello;
    
        public SayHelloProxy(SayHello sayHello) {
            this.sayHello = sayHello;
        }
    
        @Override
        public void sayHelloWorld() {
            System.out.println("调用sayHello之前的处理");
            sayHello.sayHelloWorld();
            System.out.println("调用sayHello之后的处理");
        }
    }
    
    /**
     * 测试静态代理
     *
     * @author zt1994 2019/3/2 16:30
     */
    public class staticProxyTest {
    
        /**
         * 测试静态代理
         */
        @Test
        public void testStaticProxy() {
            SayHelloImpl sayHello = new SayHelloImpl();
            sayHello.sayHelloWorld();
    
            SayHelloProxy sayHelloProxy = new SayHelloProxy(sayHello);
            sayHelloProxy.sayHelloWorld();
        }
    }
    
    测试结果:
    Hello World!
    调用sayHello之前的处理
    Hello World!
    调用sayHello之后的处理
    

    源码地址:https://github.com/zt19994/designPattern

  • 相关阅读:
    - (NSString *)description
    3.30 学习笔记
    常用的 博客
    iOS 比较好的博客
    iOS查看一段代码运行的时间
    tableview 第一次可以查看tableview 当退出第二次却会出现Assertion failure in -[UITableView _configureCellForDisplay:forIndexPath:]
    iphone 设置全局变量的几种方法
    java操作控件加密
    关闭windows 警报提示音
    HttpServletRequest简述
  • 原文地址:https://www.cnblogs.com/zt19994/p/10461812.html
Copyright © 2011-2022 走看看