代理模式

代理模式属于结构型模式

定义:为其他对象提供一种代理以控制对这个对象的访问

代理模式就是在操作原对象的时候,多出来一个代理类,用来对原对象的访问进行控制和替代原对象进行一些操作

模式类图

角色

  1. 抽象接口:able,定义业务接口
  2. 被代理类:Source
  3. 代理类:Proxy,用来对原对象的访问进行控制和替代原对象进行一些操作
  4. 客户端:Client,负责调用代理类

优点

  1. 职责清晰,被代理类只关心实际的业务逻辑,不关心其他事情
  2. 高扩展性,被代理类可以随意更改,不会影响到代理类对其的访问控制

模式代码实现

源码地址:https://github.com/mingyuHub/design-patterns

以打电话为例

抽象接口

被代理类和代理类都实现此接口

/**
 * @author: chenmingyu
 * @date: 2019/3/1 10:20
 * @description: 手机接口
 */
public interface Phoneable {

    /**
     * 打电话
     */
    void call();
}
被代理类

实现Phoneable接口

/**
 * @author: chenmingyu
 * @date: 2019/3/1 10:19
 * @description: 被代理类
 */
public class Phone implements Phoneable {

    @Override
    public void call() {
        System.out.println("打电话");
    }
}
代理类

实现Phoneable接口,持有被代理类实例,提供validate()对被代理类的访问进行控制

/**
 * @author: chenmingyu
 * @date: 2019/3/1 14:16
 * @description: 代理类
 */
public class Proxy implements Phoneable {

    private Phone phone = new Phone();

    @Override
    public void call() {
        if(validate()){
            phone.call();
        }
        System.out.println("结束通话");
    }

    /**
     * 检查手机号
     * @return
     */
    private Boolean validate(){
        System.out.println("手机号验证通过");
        return Boolean.TRUE;
    }
}
验证
public static void main(String[] args) {
    Proxy proxy = new Proxy();
    proxy.call();
}

输出

手机号验证通过
打电话
结束通话

代理模式与装饰器模式的区别,代理模式主要是对原对象的访问进行控制,而装饰器模式主要是为了对原对象增加新的功能

参考:设计模式之禅:https://www.kancloud.cn/sstd521/design/193540

推荐阅读:23种设计模式详解