Design Pattern - 装饰模式
装饰模式
动态 地给一个对象 添加一些额外的职责 。就增加功能来说,Decorator模式相比生成子类更为灵活。
对于对象功能的扩展, 面向对象一般通过继承来解决, 但这种方式缺乏灵活性, 而且随意定义子类容易导致类层次结构过快膨胀.
场景, 当类的核心职责和主要行为没有发生变化, 仅仅需要动态对类对象添加一些装饰性的功能, 比如给人穿衣服......
如下图所示, 只是为图画换换边框, 这种改动只需要使用下面介绍的装饰模式.
装饰模式实现, 如下代码,
class Component //核心类 { void Operation(); } class Decorator: Component //装饰类, 必须继承自核心类, 第一是要保持接口一致, 更重要的是, 这样可以嵌套装饰 { protected Component com; //核心类对象(引用, 需多态) void setComponent (Component com) {this.com = com} void Operation() { com.Operation() //这儿除了调用核心类的功能, 可以任意添加装饰性功能 } }
客户代码使用,
com = new Component() dec = new Decorator() dec.setComponent(com) dec.Operation() //这个Operation就是经过装饰的
装饰模式如下图, 我们可以创建一个抽象Decorator类, 然后根据需要创建许多的ConcreteDecroator类. 而Decorator类可以装饰任意Component类.
而且Decorator类只是对核心类对象进行动态装饰, 不会影响到核心类本身, 所以可以任意装饰, 加成员变量, 调用其他函数, 如ConcreteDecroatorA, ConcreteDecroatorB.
且Decorator类本身也是Component类, 所以可以嵌套装饰, 非常的强大,
com = new Component() dec_a = new ConcreteDecroatorA() dec_b = new ConcreteDecroatorB() dec_c = new ConcreteDecroatorC() dec_a.setComponent(com) dec_b.setComponent(dec_a) dec_c.setComponent(dec_b) dec_c.Operation() //这个Operation就是经过多次装饰的
装饰模式的好处,
首先, 有效的将类的核心职能和装饰功能区分开了, 动态装饰完全不会影响核心类 便于维护, 可复用性强.
其次, 有效的解决了子类的快速膨胀的问题, 如果单纯用继承来解决问题, 不但对于装饰A,B,......各需要子类, 而且对于各种装饰的组合也需要创建子类. 当装饰种类很多时, 可想而知那会创建非常多的子类. 而使用装饰模式, 只需要对每个装饰生成子类, 而装饰的组合和搭配只需要嵌套使用装饰模式就可以达成.
这个模式还是很实用, 很强大的, 可以用于很多场景......
具体实用例子参考, http://www.cnblogs.com/fxjwind/archive/2013/02/08/2909294.html
本文章摘自博客园,原文发布日期:2013-02-05
相关文章
- 微信双版本更新!悄悄上线十个新功能,建议升级
- Camera2 自定义相机开发流程详解
- iPhone iPad生产力大增!带你玩转Safari扩展
- 深入分析AMS启动流程
- 曝微信小范围上线欠费不停机功能:手机欠费一百块还能用
- 历经四次测试,iOS15.1正式版全面推送,带来三个好消息
- 老用户还没被抛弃?苹果紧急发布iOS14.8.1正式版,修复14个漏洞
- 苹果发布iOS 14.8.1系统更新,修复多个安全漏洞,建议升级
- 数字人民币越来越近了,其优势在哪里?“扫一扫”会成过去式吗?
- iOS/iPad OS 14.8.1发布:苹果建议iPhone老机型都升级
- 小米之家遍地开花,但是为何苹果直营店却这么少?
- 苹果更新 iOS 15/iPadOS 15 设计资源,推出新模板、字体和网站
- 为什么管理技术债务如此重要
- 苹果 iOS/iPadOS 15.1 正式版发布:支持 AirPods 3,带来共享同播及一系列改进
- 手机怎样永久关闭系统更新?只需关闭这四个开关,就能轻松搞定
- 详细分析IntentFilter的匹配规则
- 手机怎样永久关闭系统更新?只需关闭这四个开关,就能轻松搞定
- Android 12翻车:多款谷歌Pixel设备更新后崩溃 续航缩水
- 为什么很多企业不用企业微信、钉钉和飞书?
- 深入详解Apk编译打包流程