Decorator 装饰

意图

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

结构

Component:定义一个对象接口,可以给这些对象动态地添加职责;(纯虚函数)

ConcreteComponent:定义一个具体的Component,继承自Component,重写了Component类的虚函数;(继承Component,实现纯虚函数)

Decorator:维持一个指向Component对象的指针,该指针指向需要被装饰的对象;并定义一个与Component接口一致的接口;(继承Component,提供接口(接口就是那个纯虚函数))

ConcreteDecorator:向组件添加职责。(添加具体功能)

实现

 1 #include <iostream>
 2 using namespace std;
 3 class Component
 4 {
 5 public:
 6     virtual void Operation() = 0;
 7 };
 8 class ConcreteComponent : public Component
 9 {
10 public:
11     void Operation()
12     {
13         cout << "I am no decoratored ConcreteComponent" << endl;
14     }
15 };
16 class Decorator : public Component
17 {
18 public:
19     Decorator(Component *pComponent) : m_pComponentObj(pComponent) {}
20     void Operation()
21     {
22         if (m_pComponentObj != NULL)
23         {
24             m_pComponentObj->Operation();
25         }
26     }
27 protected:
28     Component *m_pComponentObj;
29 };
30 class ConcreteDecoratorA : public Decorator
31 {
32 public:
33     ConcreteDecoratorA(Component *pDecorator) : Decorator(pDecorator){}
34     void Operation()
35     {
36         AddedBehavior();
37         Decorator::Operation();
38     }
39     void  AddedBehavior()
40     {
41         cout << "This is added behavior A." << endl;
42     }
43 };
44 class ConcreteDecoratorB : public Decorator
45 {
46 public:
47     ConcreteDecoratorB(Component *pDecorator) : Decorator(pDecorator){}
48     void Operation()
49     {
50         AddedBehavior();
51         Decorator::Operation();
52     }
53     void  AddedBehavior()
54     {
55         cout << "This is added behavior B." << endl;
56     }
57 };
58 int main()
59 {
60     Component *pComponentObj = new ConcreteComponent();
61     Decorator *pDecoratorAOjb = new ConcreteDecoratorA(pComponentObj);
62     pDecoratorAOjb->Operation();
63     cout << "=============================================" << endl;
64     Decorator *pDecoratorBOjb = new ConcreteDecoratorB(pComponentObj);
65     pDecoratorBOjb->Operation();
66     cout << "=============================================" << endl;
67     Decorator *pDecoratorBAOjb = new ConcreteDecoratorB(pDecoratorAOjb);
68     pDecoratorBAOjb->Operation();
69     cout << "=============================================" << endl;
70     delete pDecoratorBAOjb;
71     pDecoratorBAOjb = NULL;
72     delete pDecoratorBOjb;
73     pDecoratorBOjb = NULL;
74     delete pDecoratorAOjb;
75     pDecoratorAOjb = NULL;
76     delete pComponentObj;
77     pComponentObj = NULL;
78 }

桥接和装饰的区别

二者都是为了防止过度的继承,从而造成子类泛滥的情况。

桥接模式的定义是将抽象化与实现化分离(用组合的方式而不是继承的方式),使得两者可以独立变化。可以减少派生类的增长。装饰是在一个核心功能上添加一些附属功能,从而让核心功能发挥更大的作用,但是最终它的核心功能是不能丢失的。

桥接模式中所说的分离,其实是指将结构与实现分离(当结构和实现有可能发生变化时)或属性与基于属性的行为进行分离;而装饰者只是对基于属性的行为进行封闭成独立的类,从而达到对其进行装饰,也就是扩展。比如:异常类和异常处理类之间就可以使用桥接模式来实现完成,而不能使用装饰模式来进行设计;如果对于异常的处理需要进行扩展时,我们又可以对异常处理类添加Decorator,从而添加处理的装饰,达到异常处理的扩展,这就是一个桥接模式与装饰模式的搭配;

时间: 2024-08-29 22:28:14

Decorator 装饰的相关文章

设计模式(十):Decorator装饰者模式 -- 结构型模式

1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许多类的行为,改怎么办?前一个,只能在于运行时完成,后者

Decorator 装饰(结构型)

Decorator 装饰(结构型) 一:描述: Decorator装饰模式是动态地给一个对象增加一些额外的功能职责特性. 来替换以前使用的继承来静态扩展对象的功能,避免子类的增多,做到更灵活: 注:和桥接模式不同的是,桥接的对象是无顺序的,而装饰是有顺序的. 功能职责特性过多时应不使用装饰模式,因为装饰类多了不好管理,顺序也会乱: 二:模式图 三:实现代码简单例子: 1.定义操作的接口类: 2.实现原本真实的类:(这里做多了一个抽像,为了实现更多的产品) 3.实现装饰的抽像类: 4.具体的功能特

HeadFirst设计模式 之 C++实现(三):Decorator(装饰者模式)

装饰者模式是很有意思的一种设计模式,你将能够在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责.不是使用继承每回在编译时超类上修改代码,而是利用组合(composition)和委托(delegation)可以在运行时具有继承行为的效果. 代码应该如同晚霞中的莲花一样地关闭(免于改变),如同晨曦中的莲花一样地开放(能够扩展). 这就是,设计原则之五:类应该对扩展开放,对修改关闭. 通常情况下,我们不会对代码的每一处设计都采用该原则,我们实在没有闲工夫把设计的每个部分都这么设计(而且,

Design Pattern 设计模式 Decorator 装饰者模式

1 设计一个基类 2 继承这个基类,并包含这个基类的一个对象 3 创建继承类的时候,初始化这个基类,因为是基类指针,所以可以是所有基类的衍生类对象,那么就可以叠加任意多个衍生类对象了. 关键是在衍生类中包含一个基类对象,然后有了继承和包含两重关系,可以使得一个类一个类对象叠加,达到装饰目的. 等于是创建了一个对象指针链表,一个一个对象发挥其相应的作用. 下面程序装饰一个桌子,同时包含释放内存的处理. 关键要知道基类的析构函数必须使用虚函数,为什么? 1 如果基类不是析构函数,那么如果衍生类中包含

使用 sitemesh/decorator装饰器装饰jsp页面(原理及详细配置)

摘要:首先这个Decorator解释一下这个单词:“装饰器”,我觉得其实可以这样理解,他就像我们用到的Frame,他把每个页面共有的东西提炼了出来,也可能我们也会用各种各样的include标签,将我们的常用页面给包括进来:比如说页面的top,bottom这些每个页面几乎都有,而且都一样,如果我们在每个页面都include,可以发现我们的程序有很多冗余,重复.相比之下装饰器给我们提供了一个较好的选择,他在你要显示的页面根本看不出任何include信息,可以说完全解耦. 一.SiteMesh介绍 S

Decorator(装饰)-对象结构型模式

1.意图 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 2.别名 包装器 Wrapper. 3.动机 给某个对象而不是整个类添加一些功能.一个较为灵活的方式时将组件嵌入另一个对象中. 4.适用性 在不影响其它对象的情况下,以动态.透明的方式给单个对象添加职责. 处理那些可以撤销的职责. 当不能采用子类的方法进行扩充时.一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长.另一种情况可能是因为类定义被隐藏或

java设计模式—Decorator装饰者模式

一.装饰者模式 1.定义及作用 该模式以对客户端透明的方式扩展对象的功能. 2.涉及角色      抽象构件角色:定义一个抽象接口,来规范准备附加功能的类. 具体构件角色:将要被附加功能的类,实现抽象构件角色接口. 抽象装饰者角色:持有对具体构件角色的引用并定义与抽象构件角色一致的接口. 具体装饰角色:实现抽象装饰者角色,负责为具体构件添加额外功能. 3.简单实现 抽象构件角色java 代码: package com.pattern.decorator2; /** * 抽象构件角色 * @aut

Python 之 decorator装饰器

最近看到 廖雪峰 的Python教程,对于学习Python的人来说,这可谓是一大福音,没有冗长的废话,只有最通俗简短的语言,以及最清晰的例子讲解. 下面是我对 装饰器 这一小节的总结, 以及自己的理解. 注:[本文中的代码参考上述教程] 很多时候我会把Python的很多语法与C++相融合,在C++中,函数的名称即为函数的地址,我们可以通过定义成为"函数指针"的变量,并且将函数名称赋值给该变量,那么我们在调用函数的时候,就可以直接使用该变量调用函数. 例如下面的C++的代码就是一个简单的

[C++设计模式] decorator 装饰者模式

<head first>中 的例子:咖啡店有各种咖啡饮料,可以往咖啡里面加各种调料变成另一种饮料,如果使用继承的方式来为每一种饮料设计一个类,代码的复杂度很容易膨胀,而且会继承父类的所有特性,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性:同时,又掉入了另一个陷阱,随着扩展功能的增多,子类也会增多,各种子类的组合,就会导致类的膨胀,最后,就会被淹没在类的海洋. 这时大神们就发明了装饰者模式,在不修改现在有接口和实现类的基础上实现功能或者状态的添加. decorator(装饰者模式):