代理模式

转载请注明出处!!!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("收尾工作结束");
    }
}


 

客户端(也就是老班长啦)需要访问我(送我苹果)的时候,就通过代理来做了。

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

 

代理模式的优缺点

         优点嘛,就是调用者和被调用者直接解耦了,因为使用了代理嘛,同时也是被调用者将任务交给代理来做,省去了调用者的麻烦。

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

 

 

 

 

 

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值