模式动机
在某些情况下,一个客户不想或者不能直接引用一个对 象,此时可以通过一个称之为“代理”的第三者来实现 间接引用。代理对象可以在客户端和目标对象之间起到 中介的作用,并且可以通过代理对象去掉客户不能看到 的内容和服务或者添加客户需要的额外服务。
模式定义
给某一个对象提供一个代 理,并由代理对象控制对原对象的引用。代理模式的英 文叫做Proxy或Surrogate,它是一种对象结构型模式。
模式结构
代理模式包含如下角色:
- Subject: 抽象主题角色
- Proxy: 代理主题角色
- RealSubject: 真实主题角色
时序图
代码实现
//抽象主题对象
public interface Producer {
void product();
}
//真实主题对象
public class RealProducer implements Producer{
@Override
public void product() {
System.out.println("生产了一个苹果手机");
}
}
//代理对象
public class ProducerProxy implements Producer{
private Producer producer;
public ProducerProxy(Producer producer){
this.producer=producer;
}
@Override
public void product() {
System.out.println("运送来零件");
producer.product();
System.out.println("配送到专卖店");
}
}
//客户端
public class Client {
public static void main(String[] args) {
Producer producer = new RealProducer();
ProducerProxy personProxy = new ProducerProxy(producer);
personProxy.product();
}
}
模式优缺点
优点
- 协调调用者和被调用者,在一定程度上降低了系统的耦合度
- 虚拟代理,可以通过一个小对象来代表一个大对象,减少系统资源消耗。
- 远程代理可以使客户端访问远程机器上的对象。
- 保护代理可以控制对真实对象的使用权限。
缺点
- 实现代理模式需要额外工作,有些代理模式的实现非常复杂。
- 由于在客户端与真实对象间使用了代理对象,有些类型的代理模式可能会造成请求对象的处理速度变慢。
模式扩展
动态代理(挖坑,以后来填)