博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Design Pattern - 装饰模式
阅读量:6332 次
发布时间:2019-06-22

本文共 1418 字,大约阅读时间需要 4 分钟。

装饰模式

动态 地给一个对象 添加一些额外的职责 。就增加功能来说,Decorator模式相比生成子类更为灵活。 

对于对象功能的扩展, 面向对象一般通过继承来解决, 但这种方式缺乏灵活性, 而且随意定义子类容易导致类层次结构过快膨胀. 
场景, 当类的核心职责和主要行为没有发生变化, 仅仅需要动态对类对象添加一些装饰性的功能, 比如给人穿衣服...... 
如下图所示, 只是为图画换换边框, 这种改动只需要使用下面介绍的装饰模式.

Decorator_01.jpg 

装饰模式实现, 如下代码,

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,......各需要子类, 而且对于各种装饰的组合也需要创建子类. 当装饰种类很多时, 可想而知那会创建非常多的子类. 而使用装饰模式, 只需要对每个装饰生成子类, 而装饰的组合和搭配只需要嵌套使用装饰模式就可以达成. 
这个模式还是很实用, 很强大的, 可以用于很多场景......

具体实用例子参考, 

本文章摘自博客园,原文发布日期:2013-02-05

转载地址:http://kkdoa.baihongyu.com/

你可能感兴趣的文章
linux几大服务器版本大比拼
查看>>
在BT5系统中安装postgresQL
查看>>
Can't connect to MySQL server on 'localhost'
查看>>
【Magedu】Week01
查看>>
写给MongoDB开发者的50条建议Tip25
查看>>
PostgreSQL学习手册(四) 常用数据类型
查看>>
为什么要让带宽制约云计算发展
查看>>
[iOS Animation]-CALayer 绘图效率
查看>>
2012-8-5
查看>>
VS中ProjectDir的值以及$(ProjectDir)../的含义
查看>>
我的友情链接
查看>>
PHP实现排序算法
查看>>
Business Contact Mnanager for Outlook2010
查看>>
9种用户体验设计的状态是必须知道的(五)
查看>>
解决WIN7下组播问题
查看>>
陈松松:视频营销成交率低,这三个因素没到位
查看>>
vmware nat模式原理探究,实现虚拟机跨网段管理
查看>>
JavaSE 学习参考:集合运算
查看>>
CSS属性:font-family
查看>>
【Signals and Systems】 SYLLABUS
查看>>