结构型 - 代理模式

目录
设计思想
代理模式是一种结构型设计模式,它允许一个对象(代理对象)控制另一个对象的访问。代理对象通常充当客户端和实际对象之间的中介,用于对实际对象的访问进行控制、监控或其他目的。
类图
代码实现
interface ServiceInterface {
void operation();
}
class Service implements ServiceInterface {
@Override
public void operation() {
System.out.println("Service operation invoke.");
}
}
class Proxy implements ServiceInterface {
private Service realService;
public Proxy(Service realService) {
this.realService = realService;
}
public boolean checkAccess() {
return realService != null;
}
@Override
public void operation() {
System.out.println("Proxy operation invoke.");
if (checkAccess()) {
this.realService.operation();
}
}
}
public class Client {
public static void main(String[] args) {
Service service = new Service();
Proxy proxy = new Proxy(service);
proxy.operation();
}
}
优缺点
优点:
- 符合开闭原则,你可以在不对服务或客户端做出修改的情况下创建新代理。
- 可以灵活地隐藏被代理对象的部分功能和服务,也增加额外的功能和服务。
缺点:
- 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
- 代码可能会变得复杂, 因为需要新建许多类。
适用场景
- 不想或者不能直接引用一个对象时
比如如在移动端加载网页信息时,因为下载真实大图比较耗费流量和性能,可以用一个小图代替进行渲染(用一个代理对象去下载小图),在真正点击图片时,才去下载大图,显示大图效果。还有 HTML 中的占位符,其实也是代理的思想。
- 想对一个对象的功能进行加强时
如在字体(Font)渲染时,对粗体(BoldFont)进行渲染时,可使用字体 Font 对象进行代理,只要在对 Font 进行渲染后,进行一步加粗的操作即可。
- 各种特殊用途的代理:远程代理、虚拟代理、Copy-on-Write 代理、保护(Protect or Access)代理、Cache 代理、防火墙(Firewall)代理、同步化(Synchronization)代理、智能引用(Smart Reference)代理。