定义:也称委托模式,为其他对象提供一种代理以控制对这个对象的访问。
使用场景:有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
应用举例:支票可以当钱的使用,律师代表帮人打官司。
类图:
- Subject:抽象主题类,声明真实与代理共同的接口方法,可以是一个抽象方法,也可以是一个接口。
- RealSuject:真实主题类,定义代理的所表示的真实对象,由其执行具体的业务逻辑
- ProxySubject:代理类,在实现的接口方法中调用真是主题中相应的接口方法执行。
- Client: 客户类
关键代码:实现与被代理类组合
优点:
- 职责清晰。
- 高扩展性。
- 智能化。
缺点:
- 因为客户端和真实主题之间增加了代理类,所以有些请求可能会变慢。
- 有些代理类实现起来需要额外的工作,实现起来非常复杂
abstract class Subject{
public abstract void visit();
}
class RealSubject extends Subject{
@Override
public void visit() {
// TODO 自动生成的方法存根
System.out.println("真正的Subject");
}
}
class ProxySubject extends Subject{
private RealSubject realSubject;
public ProxySubject(RealSubject realSubject) {
// TODO 自动生成的构造函数存根
this.realSubject = realSubject;
}
@Override
public void visit() {
// TODO 自动生成的方法存根
realSubject.visit();
}
}
主程序
public static void main(String[] args) {
// TODO 自动生成的方法存根
RealSubject realSubject = new RealSubject();
ProxySubject proxySubject = new ProxySubject(realSubject);
proxySubject.visit();
}
程序截图