10 结构型模式-----装饰模式

模式动机(Decorator Pattern)我们在给一个类进行功能扩展时,总是通过继承或者复合关系,使得一个类具有其他相关类型的功能,继承本身属于静态关联,派生类比较臃肿,使用者也不能控制增加功能的方式。而使用复合机制,即将一个类的对象作为另一个类的成员,我们可以决定什么时候调用哪种功能,非常方便,这就是装饰模式,即给一个现有的类进行装饰,使其具有我们希望的功能。

模式结构图:

模式代码:

bt_装饰模式.h

 1 #ifndef DP_H
 2 #define DP_H
 3 #include <iostream>
 4 using namespace std;
 5
 6 /*
 7     抽象组件类
 8 */
 9 class Component
10 {
11 public:
12     virtual ~Component(){ }
13     virtual void Operation(){ }
14 };
15
16 /*
17     具体组件类
18 */
19 class ConcreteComponent : public Component
20 {
21 public:
22     virtual void Operation()
23     {
24         cout << "具体组件类的功能" << endl;
25     }
26 };
27
28 /*
29     抽象装饰器类:维护一个指向抽象组件类的指针,
30     并定义一个与抽象组件类一致的接口
31 */
32 class Decorator : public Component
33 {
34 public:
35     Decorator(Component* pCom) : component(pCom){ }
36     virtual void Operation()
37     {
38         component->Operation();     // 调用抽象组件类的功能
39     }
40
41 private:
42     Component* component;
43 };
44
45 /*
46     具体装饰器:负责对组件进行装饰以添加新功能
47 */
48 class ConcreteDecoratorA : public Decorator
49 {
50 public:
51     ConcreteDecoratorA(Component* pCom, int state = 0) : Decorator(pCom), addedState(state){ }
52     virtual void Operation()
53     {
54         Decorator::Operation();
55         cout << "装饰器A为组件新增状态 = " << addedState << endl;
56     }
57
58 private:
59     int addedState;
60 };
61
62 class ConcreteDecoratorB : public Decorator
63 {
64 public:
65     ConcreteDecoratorB(Component* pCom) : Decorator(pCom){ }
66     virtual void Operation()
67     {
68         Decorator::Operation();
69         AddedBehavior();
70 }
71
72 private:
73     void AddedBehavior()            // 具体装饰器新增的功能
74     {
75         cout << "装饰器B为组件新增功能" << endl;
76     }
77 };
78
79 #endif // DP_H

测试用例.cpp

 1 #include "bt_装饰模式.h"
 2
 3 int main()
 4 {
 5     cout << "***** 装饰模式测试 *****" << endl;
 6     Component* pCom = new ConcreteComponent;
 7     pCom->Operation();                          // 未装饰时
 8     cout << endl;
 9
10     cout << "装饰器A" << endl;
11     Decorator* pDec1 = new ConcreteDecoratorA(pCom);
12     pDec1->Operation();                         // 第一次装饰后
13     cout << endl;
14
15     cout << "装饰器B" << endl;
16     Decorator* pDec2 = new ConcreteDecoratorB(pDec1);
17     pDec2->Operation();                         // 第二次装饰后
18
19     delete pDec2;
20     delete pDec1;
21     delete pCom;
22
23     return 0;
24 }


模式优缺点:

1》 相比于静态继承扩展,装饰器模式可以提供更多的灵活性,它允许客户在运行时添加装饰功能,而继承则是在静态编译时就确定了,再者,多重继承时虽然很多功能派生类用不到,但是仍然不得不处理。相比而言,装饰器可以通过多个不同的装饰类来装饰组件从而添加不同的新功能,扩展非常方便。

2》 组件层次和装饰层次耦合性比较低,可以独立发展,通过搭配不同的具体组件和具体装饰器可以实现不同的组合,新增时不需要改变源代码,符合“开闭原则”。

3》 装饰模式比较麻烦,使用时可能需要创建多个装饰类对象,使得系统设计复杂度增大;若多次级联调用装饰器,一旦出错必须逐级排查。

时间: 2024-08-02 18:52:35

10 结构型模式-----装饰模式的相关文章

结构型模式 装饰模式

结构型模式 装饰模式 适用于:  装饰者模式(Decorator Pattern)动态的给一个对象添加一些额外的职责.就增加功能来说,此模式比生成子类更为灵活. /** * 结构型模式 装饰模式 * 装饰( Decorator )模式又叫做包装模式. * 通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案. * 装饰模式就是把要添加的附加功能分别放在单独的类中,并让这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择地.按顺序地使用装饰功能包装对象. * */ #defi

第11章 结构型模式—装饰模式

1. 装饰模式(Decorator Pattern)的定义 (1)动态地给一个对象添加一些额外的职责.就增加功能来说,装饰模式比生成子类更为灵活. ①装饰模式是为对象(而不是类)添加功能的. ②用组合方式,而不是继承方式为对象添加功能. (2)装饰模式的结构和说明 ①Component:组件对象的接口,可以给这些对象动态地添加职责. ②ConcreteComponent:具体的组件对象,实现组件对象接口,通常就是被装饰器装饰的原始对象,也就是可以给这个对象添加职责. ③Decorator:所有装

10结构型模式之装饰模式

概念   装饰( Decorator )模式又叫做包装模式.通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案. 装饰模式就是把要添加的附加功能分别放在单独的类中,并让这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择地.按顺序地使用装饰功能包装对象. 类图角色和职责 适用于: 装饰者模式(Decorator Pattern)动态的给一个对象添加一些额外的职责.就增加功能来说,此模式比生成子类更为灵活. 案例 //给跑车,额外添加游泳.飞行的功能 #include <i

java设计模式--结构型模式--装饰模式

1 装饰模式 2 概述 3 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 4 5 6 适用性 7 1.在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. 8 9 2.处理那些可以撤消的职责. 10 11 3.当不能采用生成子类的方法进行扩充时. 12 参与者 13 1.Component 14 定义一个对象接口,可以给这些对象动态地添加职责. 15 16 2.ConcreteComponent 17 定义一个对象,可以给这个对象添

设计模式--结构型模式--装饰模式

装饰者模式: 我们可以通过继承和组合的方式来给一个对象添加行为,虽然使用继承能够很好拥有父类的行为,但是它存在几个缺陷: 一.对象之间的关系复杂的话,系统变得复杂不利于维护. 二.容易产生“类爆炸”现象. 三.是静态的.在这里我们可以通过使用装饰者模式来解决这个问题. 装饰者模式,动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更加有弹性的替代方案.虽然装饰者模式能够动态将责任附加到对象上,但是他会产生许多的细小对象,增加了系统的复杂度. uml类图如下: 装饰者Decorator与被

设计模式-10 装饰模式(结构型模式)

一 装饰模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能. 主要解决:扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀. 关键代码:1.Component 类充当抽象角色,不应该具体实现. 2.修饰类引用和继承 Component 类,具

7 结构型模式之 - 装饰模式

装饰模式介绍:装饰模式也称为包装模式,是结构型模式之一,其使用一种对客户端透明的方式来动态地扩展对象的功能,同时它也是继承关系的一种替代方案之一.在现实生活中你也可以看见很多装饰模式的例子,或者可以大胆地说装饰模式无处不在,就拿人来说,人需要各式各样的衣着,不管你穿着怎样,但是,对于个人的本质来说是不变的,充其量只是在外面披上一层包装而已,这就是装饰模式,装饰物也许各不相同但是装饰的对象本质是不变的. 装饰模式的定义:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式相比生成子类更加灵

设计模式(八) : 结构型模式--装饰模式

装饰模式的目的是为了给一个对象动态的增加一些功能.装饰对象和被装饰的对象实现同一个接口,装饰对象持有被装饰对象的实例. 类图: 示意性代码: package com.javadesignpattern.Decorator; public interface Component { void sampleOperation(); } package com.javadesignpattern.Decorator; public class ConcreteComponent implements

结构型模式之装饰模式

概述 装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为,在现实生活中,这种情况也到处存在,例如一张照片,我们可以不改变照片本身,给它增加一个相框,使得它具有防潮的功能,而且用户可以根据需要给它增加不同类型的相框,甚至可以在一个小相框的外面再套一个大相框. 装饰模式是一种用于替代继承的技术,它通过一种无须定义子类的方式来给对象动态增加职责,使用对象之间的关联关系取代类之间的继承关系.在装饰模式中引入了装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩充原有