代理模式
代理模式属于结构型模式
定义:为其他对象提供一种代理以控制对这个对象的访问
代理模式就是在操作原对象的时候,多出来一个代理类,用来对原对象的访问进行控制和替代原对象进行一些操作
模式类图
角色
- 抽象接口:
able
,定义业务接口 - 被代理类:
Source
- 代理类:
Proxy
,用来对原对象的访问进行控制和替代原对象进行一些操作 - 客户端:
Client
,负责调用代理类
优点
- 职责清晰,被代理类只关心实际的业务逻辑,不关心其他事情
- 高扩展性,被代理类可以随意更改,不会影响到代理类对其的访问控制
模式代码实现
源码地址: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种设计模式详解