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,以后有时间,我也补充补充。

    代理模式的优缺点

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

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

  • 相关阅读:
    Asp.Net Web API 2第八课——Web API 2中的属性路由
    Asp.Net Web API 2第七课——Web API异常处理
    Asp.Net Web API 2第六课——Web API路由和动作选择
    Asp.Net Web API 2第五课——Web API路由
    开始学习python
    BMI 小程序 购物车
    深浅copy 文件操作
    字典 dict 集合set
    基本数据类型 (str,int,bool,tuple,)
    python 运算符
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5209401.html
Copyright © 2011-2022 走看看