乐趣区

关于程序员:装饰模式

在现实生活中,经常须要对现有产品减少新的性能或丑化其外观,如房子装修、相片加相框等。在软件开发过程中,有时想用一些现存的组件。这些组件可能只是实现了一些外围性能。但在不扭转其构造的状况下,能够动静地扩大其性能。所有这些都能够釆用装璜模式来实现。

装璜(Decorator)模式的定义:

在不扭转现有对象构造的状况下,动静地给该对象减少一些职责(即减少其额定性能)的模式,它属于对象结构型模式。

通常状况下,扩大一个类的性能会应用继承形式来实现。但继承具备动态特色,耦合度高,并且随着扩大性能的增多,子类会很收缩。如果应用组合关系来创立一个包装对象(即装璜对象)来包裹实在对象,并在放弃实在对象的类构造不变的前提下,为其提供额定的性能,这就是装璜模式的指标。

装璜模式次要蕴含以下角色:

1. 形象构件(Component)角色:定义一个形象接口以标准筹备接管附加责任的对象。

2. 具体构件(Concrete    Component)角色:实现形象构件,通过装璜角色为其增加一些职责。

3. 形象装璜(Decorator)角色:继承形象构件,并蕴含具体构件的实例,能够通过其子类扩大具体构件的性能。

4. 具体装璜(ConcreteDecorator)角色:实现形象装璜的相干办法,并给具体构件对象增加附加的责任。

装璜模式的结构图如图所示:

装璜模式通常在以下几种状况应用:

当须要给一个现有类增加附加职责,而又不能采纳生成子类的办法进行裁减时。例如,该类被暗藏或者该类是终极类或者采纳继承形式会产生大量的子类。

当须要通过对现有的一组基本功能进行排列组合而产生十分多的性能时,采纳继承关系很难实现,而采纳装璜模式却很好实现。

当对象的性能要求能够动静地增加,也能够再动静地撤销时。

装璜模式在 Java 语言中的最驰名的利用莫过于 Java I/O 规范库的设计了。例如,InputStream 的子类 FilterInputStream,OutputStream 的子类 FilterOutputStream,Reader 的子类 BufferedReader 以及 FilterReader,还有 Writer 的子类 BufferedWriter、FilterWriter 以及 PrintWriter 等,它们都是形象装璜类。

装璜(Decorator)模式的次要长处有:

采纳装璜模式扩大对象的性能比采纳继承形式更加灵便。

能够设计出多个不同的具体装璜类,发明出多个不同行为的组合。

通过装璜者模式优化之后的代码满足了凋谢关闭准则(对扩大凋谢,对批改关闭)。

其次要毛病是:装璜模式减少了许多子类,如果适度应用会使程序变得很简单。

装璜模式所蕴含的 4 个角色不是任何时候都要存在的,在有些应用环境下模式是能够简化的

如果只有一个具体构件而没有形象构件时,能够让形象装璜继承具体构件

如果只有一个具体装璜时,能够将形象装璜和具体装璜合并

跟其余模式比照:

适配器模式

持有的是待适配的对象,实现的是指标接口,两个不一样

扩大了待适配类新的性能

适配器模式拓展了新的性能

装璜器模式

持有对象和继承的对象个别是同一个类或接口

装璜模式中装璜过的类力求与原来对外接口统一,这使得在调用方看来,装璜过后的类与之前没有什么区别,只是某一方面性能加强了

装璜模式加强了原有性能

退出移动版