装饰模式跟代理模式的区别
装饰模式跟代理模式的区别
zhengxiaohui 发表于1年前
装饰模式跟代理模式的区别
  • 发表于 1年前
  • 阅读 4
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

http://www.educity.cn/wenda/363782.html

装饰模式和代理模式的区别

  从功能效果上看

  装饰模式:在不改变接口的前提下,动态扩展对象的功能

  代理模式:在不改变接口的前提下,控制对象的访问

  装饰模式强调功能扩展,比如A对象的B方法,运用装饰模式后,在调用B方法前后,实现新的功能,此时B方法效果与原来不同

  代理模式强调控制访问,如上例,运用代理模式后,在调用B方法前后,控制怎么访问B方法的原始数据,而对于B实现的功能效果不做修改

  因此,如果运用设计模式后,方法的功能效果(主要是输出效果)不变,一般可视为代理。

  从类结构上看

  通过装饰模式结构图中可以看出

  431x356

  Component类在Decorator模式中充当抽象接口的角色,不应该去实现具体的行为。而且Decorator类对于Component类应该透明,换言之Component类无需知道Decorator类,Decorator类是从外部来扩展Component类的功能。

  Decorator类在接口上表现为is-a Component的继承关系,即Decorator类继承了Component类所具有的接口。但在实现上又表现为has-a Component的组合关系

  Decorator模式在实际中的运用可以很灵活。如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decorator类可以是ConcreteComponent的一个子类。

  同样,通过代理模式结构图中可以得出

  405x252

  代理类和被代理对象是has-a关系,一般没有is-a关系,除非代理类直接继承被代理类,重写被代理类的方法,即上图中没有抽象Subject类时的情况。

http://blog.csdn.net/sky_100/article/details/52527890

一.你在一个地方写装饰,大家就知道这是在增加功能,你写代理,大家就知道是在限制
     1.最常见的代理就是权限判断了,权限就肯定是限制了
     2.装饰模式是指增强被包装对象的功能
       代理模式是修改被代理对象的行为
     3.例子:
       1.装饰模式:对被装饰的对象增加额外的职责,满足里氏代换原则(子类可以代替父类)
         如:杯子生产线,杯子必须可以装水,在生产线上可以给杯子涂颜色,加杯盖,
但要保证杯子可以装水。
       2.代理模式:对被代理的对象提供访问控制。
       如:客户订购商品,可以直接从厂家订购,也可以从网上商城订购,网上商城是厂家
       的代理,从网上商城订购商品,商城可以对商品进行控制,不交钱不给商品,人不在
       不给商品,也可以赠送你额外的礼品,代金券。
     4.例子二:
       举个例子  A类是原始功能的类, B是装饰模式中对A类的扩展之后的类, C是代理模式中对A类的扩展
       对于用户调用来说。 
       使用装饰模式, 用户更关系的是B的功能(包含A的原始功能)。
       使用代理模式,用户更关心A的功能。并不关系(c的功能)。
       
     我思所得:当要扩展一个类的功能时,用装饰,如果要对原有的方法进行改进,则用代理
              这就是真理呀,就像前面关闭数据库的那个close()功能,它也是把这个功能
     改为结束利用,将连接还给连接池。(厉害,可以的)

http://www.cnblogs.com/jaredlam/archive/2011/11/08/2241089.html

学习AOP时,教材上面都说使用的是动态代理,可是在印象中代理模式一直都是控制访问什么的,怎么又动态增加行为了,动态增加行为不是装饰器模式吗?于是 找了很多资料,想弄清楚这两者之间到底有什么区别。结果发现这一篇英文文章讲的很清晰,就翻译一下,供参考。       

        首先,让我们先看一下下面的这两个UML类图,他们分别描述了装饰器模式和代理模式的基本实现。

                    

                     

        这两个图可能使我们产生困惑。这两个设计模式看起来很像。对装饰器模式来说,装饰者(decorator)和被装饰者(decoratee)都实现同一个 接口。对代理模式来说,代理类(proxy class)和真实处理的类(real class)都实现同一个接口。此外,不论我们使用哪一个模式,都可以很容易地在真实对象的方法前面或者后面加上自定义的方法。

        然而,实际上,在装饰器模式和代理模式之间还是有很多差别的。装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话 说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。

        我们可以用另外一句话来总结这些差别:使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。    

代理模式:

复制代码

//代理模式
public class Proxy implements Subject{

       private Subject subject;
       public Proxy(){
             //关系在编译时确定
            subject = new RealSubject();
       }
       public void doAction(){
             ….
             subject.doAction();
             ….
       }
}

复制代码

复制代码

//代理的客户
public class Client{
        public static void main(String[] args){
             //客户不知道代理委托了另一个对象
             Subject subject = new Proxy();
             …
        }
}

复制代码

装饰模式:

复制代码

//装饰器模式
public class Decorator implements Component{
        private Component component;
        public Decorator(Component component){
            this.component = component
        }
       public void operation(){
            ….
            component.operation();
            ….
       }
}

复制代码

复制代码

//装饰器的客户
public class Client{
        public static void main(String[] args){
            //客户指定了装饰者需要装饰的是哪一个类
            Component component = new Decorator(new ConcreteComponent());
            …
        }
}

复制代码

标签: 模式 代理 装饰
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 47
码字总数 12262
×
zhengxiaohui
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: