Proxy(代理) 结构型 对象 1
Intent_意图2
为另一个对象提供一个替身或占位符以访问这个对象
Motivation_动机3
控制客户对对象的访问
Applicability_适用性4
- 控制 一个类的访问
Structure_结构5
Participants_参与者6
- Subject(抽象主题) 通过接口或抽象类声明真实主题和代理对象实现的业务方法
- RealSubject(真实主题) 实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象
- Proxy(代理) 提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能
Collaborations_协作7
- Subject声明业务方法
- RealSubject实现Subject中声明的业务方法,并实现具体业务
- Proxy实现Subject中声明的业务方法,内部包含对RealSubject业务方法的引用
->代理对象通常在客户调用传递给目标对象之前或之后执行某个操作,而不是单纯的将调用传递给目标对象
Comsequences_结果8
- 优点
职责清晰
高扩展性
智能化 - 缺点
由于在客户和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢
实现代理模式需要额外的工作,有些代理模式的实现非常复杂 - 用途
远程代理、虚拟代理、保护代理、写入时复制代理、缓存代理、防火墙代理、同步化代理、智能引用代理
Implementation/Sample Code_实现/范例代码910
Implementation
Subject
public interface Subject {
public void operation();
}
RealSubject
public class RealSubject implements Subject {
@Override
public void operation() {
// TODO
}
}
Proxy
public class Proxy implements Subject {
RealSubject realSubject = new RealSubject();
@Override
public void operation() {
// TODO
realSubject.operation();
// TODO
}
}
Sample Code
Subject
public interface Model {
public void make();
}
RealSubject
public RealModel implements Model {
@Override
public void make() {
System.out.println("The model is ready to made");
}
}
Proxy
public ProxyModel implements Model {
private RealModel realModel;
public ProxyModel(RealModel realModel) {
this.realModel = realModel;
}
public void prepare() {
System.out.println("Buy model");
}
public void done() {
System.out.println("Done");
}
@Override
public void make() {
prepare();
realModel.make();
done();
}
}
Demo
public class Demo {
public static void main(String[] args) {
Model model = new ProxyModel(new RealModel());
model.make();
}
}
Result
Buy model
The model is ready to made
done
Known Uses_已知应用11
Related Patterns_相关模式12
- 远程代理
- 虚拟代理
- 写入时复制代理
- 保护代理
- 缓存代理
- 防火墙代理
- 同步化代理
- 智能引用
模式分类归属 ↩︎
意图:描述该模式的作用,以及该模式的定义 ↩︎
动机:给出了问题以及如何解决这个问题的具体场景 ↩︎
适用性:描述模式可以被应用在什么场合 ↩︎
结构:提供了图示,显示出参与此模式的类之间的关系 ↩︎
参与者:描述在此设计中所涉及到的类和对象在模式中的责任和角色 ↩︎
协作 :告诉参与者如何在此模式中合作 ↩︎
结果:描述采用此模式之后可能产生的效果,好的与不好的 ↩︎
实现:提供了在实现该模式时需要使用的技巧,以及应该小心面对的问题 ↩︎
范例代码:提供代码的片段 ↩︎
已知应用:用来描述已经在真实系统中发现的模式例子 ↩︎
相关模式:描述了此模式和其他模式之间的关系 ↩︎