zoukankan      html  css  js  c++  java
  • 代理模式

    转载请注明出处。!!http://blog.csdn.net/zhonghuan1992

      全部配套代码均在github上:https://github.com/ZHONGHuanGit/DesignPattern

     

     

     

    跟着ZHONGHuan学习设计模式

    代理模式

     

     

     

     

     

           依据GOF95。代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象。并由代理对象控制对原对象的引用。

             代理模式的概念也是非常清晰的。该模式的结构也是比較简单。所谓代理,在我们生活中也是或多或少接触过的吧。

    记得大一平安夜那会儿,高中当了三年的老班长送了个苹果过来。当时可开心了。但是老班长不是亲自送来的,而是通过网上的一家机构。填了信息后,苹果就到了。

    (老班长还是不错滴,但是第二年就没了╮(╯▽╰)╭)。这个就是代理。

    老班长通过那个机构,将送苹果给我的任务代理出去了。

    这个代理方式能够归为远程代理。

             代理方式有分非常多种嘛,有远程代理,虚拟代理等等。

    (嘿嘿。万恶的等等)尽管有这些分类,事实上它们的本质都是一样的,就是将本来直接和一个真实对象打交道的任务交给代理来干了。

    记得这个。知道本质就好了。(只是不要和门面模式等其他模式弄混。记得门面模式façade类做的事是代理一个系统的事,这个区别不小)

            

    代理模式的结构:

             说了这么多,让我们来看一下代理模式的结构。

    代理模式中有三个角色:

     Subject(抽象角色):声明真实对象和代理对象的共同接口。

    Proxy(代理角色):代理对象与真实对象实现同样的接口,所以它可以在不论什么时刻都可以代理真实对象。代理角色内部包括有对真实对象的引用。所以她可以操作真实对象,同一时候也可以附加其它的操作,相当于对真实对象进行封装。

     RealSubject(真实角色):它代表着真实对象。是我们终于要引用的对象

             以下看一下实现代码。背景样例。使用上面的老班长送苹果的样例。

    抽象角色。没有什么特别之处,抽象类+抽象方法:

    abstract class Subject{
        /**
         * 抽象的请求方法
         */
        abstract public void request();
    }


    看一下真实角色。这里的真实角色就是接受苹果的我,request方法事实上就是接受苹果的方法。实现例如以下:

    class RealSubject extends Subject{
        public RealSubject(){}
       
        //实现请求方法。这里是接收苹果
        public void request(){
           System.out.println("老班长是好人,会送苹果。^_^。在下接受了");
        }
    }


    而代理角色呢?就是替老班长送苹果的那个组织啦,它的实现例如以下:

    class Proxy extends Subject{
       
        Subject realSubject;
       
        public Proxy(SubjectrealSubject){
            this.realSubject=realSubject;
        }
       
        public void preRequest(){
            System.out.println("准备工作完成");
        }
       
        public void request(){
            System.out.println("我是送苹果结构,除夕夜替人送苹果");
            this.preRequest();
            realSubject.request();
            this.postRequest();
            System.out.println("送完了");
        }
       
        public void postRequest(){
            System.out.println("收尾工作结束");
        }
    }


    client(也就是老班长啦)须要訪问我(送我苹果)的时候,就通过代理来做了。

    public class Client{
        public static void main(String[]args)
        {
            Subject realSubject=new RealSubject();
            Proxy proxy = new Proxy(realSubject);
            proxy.request();
        }
    }


             实现完成。

    如今临时初步了解了代理模式了。只是。事实上java有份静态代理和动态代理,上面的样例都是静态代理。由程序猿来决定。

             动态代理却不一样。动态代理是是程序执行时。由反射机制动态创建而成。详细能够看这篇http://www.cnblogs.com/jqyp/archive/2010/08/20/1805041.html,以后有时间,我也补充补充。

    代理模式的优缺点

             长处嘛,就是调用者和被调用者直接解耦了。由于使用了代理嘛,同一时候也是被调用者将任务交给代理来做。省去了调用者的麻烦。

             缺点就是两者之间添加了一个代理,从程序执行上来说。处理速度会受影响。

  • 相关阅读:
    python之__new__方法
    python之类也是一个对象
    python之面向对象中的多态
    python之多继承中的一些问题
    python之子类继承父类时进行初始化的一些问题
    Java深度历险(四)——Java垃圾回收机制与引用类型
    Java深度历险(三)——Java线程​:基本概念、可见性与同步
    Java深度历险(二)——Java类的加载、链接和初始化
    Java深度历险(一)——Java字节代码的操纵
    程序员面试什么最重要?
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5209401.html
Copyright © 2011-2022 走看看