美文网首页
设计模式之静态代理模式

设计模式之静态代理模式

作者: Leon_hy | 来源:发表于2017-04-06 22:23 被阅读16次

    静态代理模式定义

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

    代理模式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

    相关文章

      网友评论

          本文标题:设计模式之静态代理模式

          本文链接:https://www.haomeiwen.com/subject/vlfcattx.html