静态代理模式定义
为其他对象对象提供一种代理以控制对这个对象的访问。
- Subject:定义了RealSubject和Proxy的公用接口,这样在任何使用RealSubject的地方都可以使用Proxy。
- RealSubject:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
- Proxy:实现抽象角色Subject,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
代理模式具体实现
背景:
周杰伦商演,需要面谈、合同起草、签字、收预付款、安排车辆和机票、唱歌、收尾款。周杰伦只负责唱歌即可,如果很多商演干这么多活岂不是要累死。这里就可以想到周杰伦有经纪人,经纪人负责安排周杰伦唱歌并处理好其他收款等事情,周杰伦只要安安静静的唱歌就可以啦!
经纪人(代理对象)安排 周杰伦(真实对象) 唱歌(间接访问的操作)。
抽象对象Subject
public interface Subject {
/**
* 面谈
*/
public void confer();
/**
* 签合同
*/
public void signContact();
/**
* 订机票
*/
public void bookTicket();
/**
* 唱歌
*/
public void sing();
/**
* 收尾款
*/
public void collectMoney();
}
具体对象RealSubject
public class RealSubject implements Subject{
@Override
public void confer() {
System.out.println("RealSubject confer()");
}
@Override
public void signContact() {
System.out.println("RealSubject signContact()");
}
@Override
public void bookTicket() {
System.out.println("RealSubject bookTicket()");
}
@Override
public void sing() {
System.out.println("周杰伦 唱歌(sing())");
}
@Override
public void collectMoney() {
System.out.println("RealSubject collectMoney()");
}
}
代理对象proxy
public class Proxy implements Subject{
Subject MySubject;
public Proxy(Subject subject) {
MySubject = subject;
}
@Override
public void confer() {
System.out.println("Proxy confer()");
}
@Override
public void signContact() {
System.out.println("Proxy signContact()");
}
@Override
public void bookTicket() {
System.out.println("Proxy bookTicket()");
}
@Override
public void sing() {
MySubject.sing();
}
@Override
public void collectMoney() {
System.out.println("Proxy collectMoney()");
}
}
Test
public class Client {
public static void main(String[] args) {
RealSubject subject= new RealSubject();
Proxy proxy = new Proxy(subject);
proxy.confer();
proxy.bookTicket();
proxy.sing();
proxy.collectMoney();
}
}
结果
Proxy confer()
Proxy bookTicket()
周杰伦 唱歌(sing())
Proxy collectMoney()
代理模式的优缺点
优点
- 协调调用者和被调用者,降低了系统的耦合度
- 代理对象作为客户端和目标对象之间的中介,起到了保护目标对象的作用。
缺点
- 由于在客户端和真实主题之间增加了代理对象,因此会造成请求的处理速度变慢;
- 实现代理模式需要额外的工作(有些代理模式的实现非常复杂),从而增加了系统实现的复杂度。http://blog.csdn.net/fengyuzhengfan/article/details/49586277