代理模式
代理模式属于结构型模式
定义:为其他对象提供一种代理以控制对这个对象的访问
代理模式就是在操作原对象的时候,多出来一个代理类,用来对原对象的访问进行控制和替代原对象进行一些操作
模式类图
角色
- 抽象接口:able,定义业务接口
- 被代理类:Source
- 代理类:Proxy,用来对原对象的访问进行控制和替代原对象进行一些操作
- 客户端:Client,负责调用代理类
优点
- 职责清晰,被代理类只关心实际的业务逻辑,不关心其他事情
- 高扩展性,被代理类可以随意更改,不会影响到代理类对其的访问控制
抽象接口
被代理类和代理类都实现此接口
/**
* @author: linan
* @date: 2020/5/25 10:20
* @description: 手机接口
*/
public interface Phoneable {
/**
* 打电话
*/
void call();
}
被代理类
实现Phoneable接口
/**
* @author: linan
* @date: 2020/5/25 10:19
* @description: 被代理类
*/
public class Phone implements Phoneable {
@Override
public void call() {
System.out.println("打电话");
}
}
代理类
实现Phoneable接口,持有被代理类实例,提供validate()对被代理类的访问进行控制
/**
* @author: linan
* @date: 2020/5/25 10:19
* @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