qiuxx404

Proxy Pattern,23种常用的面向对象软件的设计模式之一。(设计模式的说法源自《设计模式》一书,原名《Design Patterns: Elements of Reusable Object-Oriented Software》。1995年出版,出版社:Addison Wesly Longman.Inc。该书提出了23种基本设计模式,第一次将设计模式提升到理论高度,并将之规范化。)

1 代理模式定义

为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

2 优点

  • (1).职责清晰
    真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。

  • (2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。

  • (3).高扩展性

3 代理模式实现

代理模式主要是多态的体现,代理对象与被代理对象都实现与同一个接口(保证双方能做一样的事情),再由代理对象干被代理对象的活

  • 1)定义一个公用的上级接口CommonPerson,定义shopping()、bringFood()等方法

  • 2)定义代理对象ProxyPersonA类与被代理对象ProxiedPersonB类,都实现CommonPerson接口,实现所有方法

  • 3)定义调用方Caller类,访问代理对象,却调用的是被代理对象的方法,实现代理模式

4 动态代理与静态代理

代理模式分为静态代理、动态代理。

  • 1)静态代理是由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

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

5 代码实现

5.1 统一上级接口

/**
 * @Description: 统一上级接口(让代理对象与被代理对象拥有同样的方法才能做同样的事情)
 * @Author: qiuxx
 * @Date: 19:48 2018/6/18
 */
public interface CommonPerson {

    /**
     * 购物
     */
    public void shopping();

    /**
     * 带饭
     */
    public void bringFood();
}

5.2 代理(与被代理)对象

/**
 * @Description: 代理对象A
 * @Author: qiuxx
 * @Date: 19:50 2018/6/18
 */
public class ProxyPersonA implements CommonPerson {

    private CommonPerson commonPerson;

    private ProxyPersonA(){

    }

    public ProxyPersonA(CommonPerson commonPerson){
        this.commonPerson = commonPerson;
    }

    @Override
    public void shopping() {
        this.commonPerson.shopping();
    }

    @Override
    public void bringFood() {
        this.commonPerson.bringFood();
    }
}

/**
 * @Description: 被代理对象B
 * @Author: qiuxx
 * @Date: 19:50 2018/6/18
 */
public class ProxiedPersonB implements CommonPerson {

    @Override
    public void shopping() {
        System.out.println("我是被代理的对象B,现在出去购物去");
    }

    @Override
    public void bringFood() {
        System.out.println("我是被代理的对象B,现在帮别人带饭去");
    }
}

5.3 调用方Caller

/**
 * @Description: 调用方(访问代理对象方法,做被代理对象的事情)
 * @Author: qiuxx
 * @Date: 19:55 2018/6/18
 */
public class Caller {

    public static void main(String[] args){
        ProxiedPersonB proxiedPersonB = new ProxiedPersonB();//被代理对象B
        //创建代理对象A
        ProxyPersonA proxyPersonA = new ProxyPersonA(proxiedPersonB);
        //看似在访问代理对象A的方法,实际是调用了被代理对象B的方法
        proxyPersonA.shopping();
        proxyPersonA.bringFood();
    }
}

博客地址:https://qiuxx404.github.io/2018/06/18/原创/设计模式/设计模式-代理模式

相关文章: