设计模式之静态代理模式

静态代理模式定义

为其他对象对象提供一种代理以控制对这个对象的访问。

代理模式UML.png
  • 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容