设计模式之静态代理模式

2017-04-06  本文已影响16人  Leon_hy

静态代理模式定义

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

代理模式UML.png

代理模式具体实现

背景:

周杰伦商演,需要面谈、合同起草、签字、收预付款、安排车辆和机票、唱歌、收尾款。周杰伦只负责唱歌即可,如果很多商演干这么多活岂不是要累死。这里就可以想到周杰伦有经纪人,经纪人负责安排周杰伦唱歌并处理好其他收款等事情,周杰伦只要安安静静的唱歌就可以啦!

经纪人(代理对象)安排 周杰伦(真实对象) 唱歌(间接访问的操作)。

抽象对象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()

代理模式的优缺点

优点
缺点
上一篇下一篇

猜你喜欢

热点阅读