文档章节

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

zhengxiaohui
 zhengxiaohui
发布于 2017/02/08 09:33
字数 1581
阅读 5
收藏 0

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());
            …
        }
}

复制代码

本文转载自:http://www.educity.cn/wenda/363782.html

zhengxiaohui
粉丝 1
博文 48
码字总数 12262
作品 0
福州
Android工程师
私信 提问
我的Java设计模式-代理模式

写完上一篇之后有小伙伴问我有没有写过代理模式,想看看我的理解。原本我的设计模式系列是按照创建型-行为型-结构型的顺序写下去的,既然小伙伴诚心诚意了,我就大发慈悲的穿插一篇代理模式。...

Jet啟思
2017/11/29
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
293
0
javascript设计模式及应用场景

前言 这里花几分钟时间来讲解几个设计模式以及它们的应用场景。可以帮助你在平时开发时把设计模式用起来 装饰器模式 迭代器模式 发布订阅模式 工厂模式 单例模式 代理模式 外观模式 废话不多...

DEMOCODING
06/30
0
0
【朝花夕拾】设计模式之装饰器模式

装饰器模式简介 装饰器模式是动态的向一个对象添加新的功能,并且保持其类方法签名的完整性,换言之,其方法及继承结构将不会被改变。这种模式一种结构型模式,是对现有类的包装。这种模式,...

艾心❤
03/30
0
0
JavaScript设计模式总结

之前看过《JavaScript设计模式与开发实践》这本书,对书中的设计模式和一些相关案例也有了一定的了解,同时把这些设计模式的应用对应在在一些其他的项目中,进行了一些整理,如下仅供参考: ...

jefferyE
03/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

zk服务预启动和启动选举过程

QuorumPeerMain类public static void main(String[] args) { QuorumPeerMain main = new QuorumPeerMain(); try { main.initializeAndRun(args); } catch (Illega......

writeademo
33分钟前
6
0
深究递归和迭代的区别、联系、优缺点及实例对比

http://blog.csdn.net/laoyang360/article/details/7855860 http://www.zhihu.com/question/20278387 深究递归和迭代的区别、联系、优缺点及实例对比 1.概念区分 递归的基本概念:程序调用自身...

slagga
35分钟前
5
0
基于SOM-TL6678核心板而研发的TL6678-EasyEVM开发板硬件说明书

TL6678-EasyEVM是广州创龙基于SOM-TL6678核心板而研发的一款多核高性能DSP开发板。开发板采用核心板+底板方式,底板采用沉金无铅工艺的四层板设计,尺寸为200mm*106.65mm,它为用户提供了SOM...

Tronlong创龙
39分钟前
5
0
分别在有网和无网状态下批量安装python库

## 连网状态下,批量安装python库查看当前python环境下已安装的库包版本查看命令:pip freeze"""alabaster==0.7.10anaconda-client==1.6.3anaconda-navigator==1.6.2anaconda-projec......

KYO4321
42分钟前
3
0
fiddler、Charles-断点

一、添加Charles断点 1、用Charles抓包发起一次接口请求 2、对要打断点的接口右键,选择【Breakpoints】 二、Charles断点设置 1、点击Charles菜单-【Proxy】-【Breakpoint...】,此时会弹出【...

果树啊
42分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部