知识库

5、装饰模式

网站:知识库   来源:网络收集

装饰模式:Decorator 1、基本原理 在软件系统中,有时候我们会使用继承来扩展对象的功能,但是由 于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且 随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的 组合)会导致更多子类的膨胀。

如何使“对象功能的扩展”能够根据需 要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题? 从而使得任何“功能扩展变化”所导致的影响将为最低?这就是本文要 讲的Decorator模式。

装饰模式(别名Wrapper)是在不必改变原类文件和使用继承的情 况下,动态的扩展一个对象的功能。

它通过创建一个包装对象,也就 是装饰来包裹真实对象,了比继承更具弹性的代替方案。

装饰模式一般涉及到的角色 抽象构建角色(Component):给出一个抽象的接口,以规范准 备接受附加责任的对象。

具体的构建角色(ConcreteComponent):定义一个将要接受 附加责任的类。

抽象的装饰角色 (Decorator):持有一个抽象构建 (Component)角色的引用,并定义一个与抽象构件一致的接 口。

具体的装饰角色(ConcreteDecorator):负责给构建对象“贴 上”附加的责任。

2、优缺点 优点 Decorator模式与继承关系的目的都是要扩展对象的功 能,但是Decorator可以比继承更多的灵活性。

把类中的装饰功能从类中搬移出去,这样可以简化原有

5、装饰模式

的类。

有效地把类的核心功能和装饰功能区分开了。

通过使用不同的具体装饰类以及这些装饰类的排列组 合,可创造出很多不同行为的组合。

缺点 这种比继承更加灵活机动的特性,也同时意味着更加多 的复杂性。

装饰模式会导致设计中出现许多小类,如果过度使用, 会使程序变得很复杂。

符合的设计原则: 多用组合,少用继承。

利用继承设计子类的行为是在编 译时静态决定的,且所有的子类都会继承到相同的行 为。

如能够利用组合扩展对象的行为,就可在运行时动 态进行扩展。

类应设计的对扩展开放,对修改关闭。

3、适用情况 1. 需要扩展一个类的功能,或给一个类添加附加职责。

2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。

3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能, 从而使继承关系变的不现实。

4. 当不能采用生成子类的方法进行扩充时。

一种情况是,可能有大 量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈 性增长。

另一种情况可能是因为类定义被隐藏,或类定义不能用于 生成子类。

4、应用举例 1、送生日蛋糕: MM们要过生日了,怎么也得表示下吧。

最起码先送个蛋糕。

蛋糕多 种多样了。

巧克力,冰淇淋,奶油等等。

这都是基本的了,再加点额外 的装饰,如蛋糕里放点花、放贺卡、放点干果吃着更香等等。

分析: 方案1:如果采用继承会造成大量的蛋糕子类 方案2、蛋糕作为主体,花,贺卡,果仁等是装饰者,需要时加到蛋 糕上。

要啥我就加啥。

2、极品飞车喷涂鸦: “极品飞车”这款游戏中有对汽车进行喷涂鸦的功能,而且这个喷涂 鸦是可以覆盖的,并且覆盖的顺序也影响到最后车身的显示效果,比如

5、装饰模式

可以是红色火焰、紫色霞光等 3、Java I/O API java IO中需要完成对不同输入输出源的操作,如果单纯的使用继承这 一方式,无疑需要很多的类。

比如说,我们操作文件需要一个类,实现 文件的字节读取需要一个类,实现文件的字符读取又需要一个类....一次 类推每个特定的操作都需要一个特定的类。

这无疑会导致大量的IO继承 类的出现。

显然对于编程是很不利的。

而是用装饰模式则可以很好的解决这一问题,在装饰模式中:节点 流(如FileInputStream)直接与输入源交互,之后通过过滤流 (FilterInputStream)进行装饰,这样获得的io对象便具有某几个的功 能,很好的拓展了IO的功能。

5、其他 5.1装饰模式和继承的比较 装饰模式 用来扩展特定对象的功能 不需要子类 动态地 运行时分配职责 继承 用来扩展一类对象的功能 需要子类 静态地 编译时分派职责

5、装饰模式

防止由于子类而导致的复杂和混 乱 更多的灵活性 对于一个给定的对象,同时可能 有不同的装饰对象,客户端可以 通过它的需要选择合适的装饰对 象发送消息 很容易增加任何的扩展 导致很多子类产生,在一些场 合,报漏类的层次 缺乏灵活性 对于所有可能的联合,客户期 望 困难扩展 5.2、模式的简化: 1. 如果只有一个Concrete Decorator类时,可以将Decorator和Concrete Decorator合并。

2、如果只有一个Concrete Component类而没有抽象的Component接口 时,可以让Decorator继承Concrete Component。

总结 Decorator模式采用对象组合而非继承的手法,实现了在运行时动态 的扩展对象功能的能力,而且可以根据需要扩展多个功能,避免了单独 使用继承带来的“灵活性差”和“多子类衍生问题”。

同时它很好地符合面 向对象设计原则中“优先使用对象组合而非继承”和“开放-封闭”原则。

5、装饰模式

5、装饰模式

相关内容
  • 装饰模版画

    装饰模版画

    装饰模版画...

  • 5装饰设计模式

    5装饰设计模式

    5装饰设计模式...

  • 天地和装饰第五代家装买“家”模式

    天地和装饰第五代家装买“家”模式

    天地和装饰第五代家装买“家”模式...

  • 建筑装饰的工业化模式分析

    建筑装饰的工业化模式分析

    建筑装饰的工业化模式分析...

  • 中职“2.5+0.5”人才培养模式下建筑装饰专业产教融合初探

    中职“2.5+0.5”人才培养模式下建筑装饰专业产教融合初探

    中职“2.5+0.5”人才培养模式下建筑装饰专业产教融合初探...

  • 装饰企业工厂化装修运营模式研究

    装饰企业工厂化装修运营模式研究

    装饰企业工厂化装修运营模式研究...

  • 第五章 清单计价模式下装饰工程计量与计价

    第五章 清单计价模式下装饰工程计量与计价

    第五章 清单计价模式下装饰工程计量与计价...

  • 天地和装饰第五代家装模式的优势在哪里?

    天地和装饰第五代家装模式的优势在哪里?

    天地和装饰第五代家装模式的优势在哪里?...

  • 欧洲建筑室内风格样式第5章 洛可可建筑与装饰艺术

    欧洲建筑室内风格样式第5章 洛可可建筑与装饰艺术

    欧洲建筑室内风格样式第5章 洛可可建筑与装饰艺术...

  • 网友在搜
    iphone6 gpu 体温37度半正常吗 仙游红木 real slim shady翻译 模特步的基本走法 动力电池 英文 只手遮天 gai mp3 抽脂肚子要多少钱 nativesetautosuspend ext tree 自动展开 hope you are fine 本溪钢铁采购中心 手术后多久可以消肿 wuli的网名 丸子头男士留发过程 nick minaj vma 2015 凤凰知音会员登录 failed set data for 文件wgldr.mbr 异人启示录完整版 帝舵王子系列停产 冷冻水产品国家标准 stay hungry翻译 怎么书写好看的字体 as3 全局变量 永久山地车怎样 nsps 554 306 0_10_pan baidu空姐 红米2 基带 living image序列号 金南俊 爆料 微星ge60 2pg-1022 python 取天气数据 黑苹果slide 0 gucci金丝边眼镜型号 台州市民卡网站 小胖机器人价格多少钱 lesbian hospital 大众bora和朗逸那个好 jvm native heap 瞳亮电影先锋影音 the sims移动版 海老日语怎么读 make a fire keep

    All Right Reserved 知识库

    声明:本站内容源于网络,出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,请咨询相关专业人士。

    如果无意之中侵犯了您的版权,或有意见、反馈或投诉等情况 网站地图 网站栏目