Decorator模式

Decorator模式

在开发过程中,有时会遇到需要向已经定义好的类添加新功能的需求,这时候通常的做法就是定义一个新类,继承这个类,在新类中添加新功能。

采用继承的方式来实现,在使用时,我们经常使用父类的指针或引用通过多态技术来调用子类的接口,但这样就会遇到一个问题:再向子类添加方法时,也需要向父类添加方法,否则通过父类指针或引用就调用不到这个方法。所以Decorator模式没有采用继承来实现,而是采用组合的方式来实现。类结构图如下图所示:

类ConcreteComponent和类Decorator有相同的接口,所以都继承自Component。在Decorator中,有一个指向Component的指针(引用),通过这个指针来调用ConcreteComponent中的函数Operation。

下面是实现:

//Decorator.h

//Decorator.h
#ifndef _DECORATOR_H_
#define _DECORATOR_H_

class Component
{
public:
    virtual ~Component();
    virtual void Operation();
protected:
    Component();
};

class ConcreteComponent :public Component
{
public:
    ConcreteComponent();
    ~ConcreteComponent();
    void Operation();
};

class Decorator :public Component
{
public:
    Decorator(Component* com);
    virtual ~Decorator();
    void Operation();
protected:
    Component* _com;
};

class ConcreteDecorator :public Decorator
{
public:
    ConcreteDecorator(Component* com);
    ~ConcreteDecorator();
    void Operation();
    void AddedBehavior();
};

#endif

//Decorator.cpp

//Decorator.cpp

#include"Decorator.h"
#include<iostream>
Component::~Component(){}
void Component::Operation(){}
Component::Component(){}

ConcreteComponent::ConcreteComponent(){}
ConcreteComponent::~ConcreteComponent(){}
void ConcreteComponent::Operation()
{
    std::cout << "ConcreteComponent operation" << std::endl;
}

Decorator::Decorator(Component* com)
{
    _com = com;
}
Decorator::~Decorator()
{
    delete _com;
}
void Decorator::Operation(){}

ConcreteDecorator::ConcreteDecorator(Component* com) :Decorator(com)
{}
ConcreteDecorator::~ConcreteDecorator(){}
void ConcreteDecorator::AddedBehavior()
{
    std::cout << "ConcreteDecorator::AddedBehavior..." << std::endl;
}
void ConcreteDecorator::Operation()
{
    _com->Operation();
    AddedBehavior();
}

//main.cpp

//main.cpp

#include"Decorator.h"

int main()
{
    Component* com = new ConcreteComponent();
    Decorator* dec = new ConcreteDecorator(com);
    dec->Operation();
    delete dec;
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-05 11:15:17

Decorator模式的相关文章

Java装饰模式(Decorator模式)

Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这两种实体在Decorator模式中是必须的. Decorator定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活. 为什么使用Decorator 我们通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生

装饰(Decorator)模式

1.装饰(Decorator)模式    动态给一个对象添加一些额外的职责.就增加功能来说,装饰模式比生成子类更为灵活.Component是定义一个对象接口.可以给这些对象动态地添加职责.ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责.Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的.至于ConcreteDecorator就是具体的装饰对象,

奇幻RPG(物品锻造 与 Decorator模式)

物品锻造是各类奇幻游戏中的常见功能,就拿众所周知的Diablo来说吧.假设角色拥有一把单手剑,可能基础攻击力只有13,但是它有三个装备孔.当给剑镶嵌一颗蓝宝石的时候,它就拥有了额外的冰冻效果并多加2点攻击力:当给剑镶嵌一颗红宝石的时候,它又拥有了额外的火焰伤害并多加3点攻击力:当给剑镶嵌一颗绿宝石的时候,它又拥有了额外的中毒伤害并多加的4点攻击力.当然,也可以三个孔都镶嵌同一色的宝石.本文将说明如何使用Decorator模式来完成这样的设计. 使用继承来扩展 我们首先想到应该有个基类 Weapo

连载:面向对象葵花宝典:思想、技巧与实践(40) - DECORATOR模式

掌握了设计模式之道后,我们将以全新的方法来理解设计模式,这个方法更简单.更直观,不信?看几个样例就知道了 ===================================================================== DECORATOR模式(以设计模式之道来理解) [业务] 假设你进入了一个信息安全管理非常严格的公司,这家公司不允许员工自行打印文档,所有的文档打印都需要交给文档打印系统统一管理.文档打印系统会记录每次打印的时间.内容.打印人员......等等,以便后续

Decorator模式 装饰器模式

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

浅谈设计模式之八——Decorator模式

先上uml图: 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. uml解析:装饰者模式又名包装器,顾名思义就是给某个对象添加一些功能,而不是给整个类添加一些功能.Component跟Decorator是聚合关系,子类ConcreteDecoratorA和ConcreteDecoratorB实现具体对Component的修饰. 下面给出可执行的示例代码: Decorator.h #pragma once #include <iostream>

Structual设计--Decorator 模式

1.意图 动态的给一个对象添加额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 2.别名 包装器Wrapper. 3.动机 有时,我们希望给某个对象而不是整个类添加一些功能.例如,肯德基推出特价套餐,如果套餐1中有:汉堡和鸡腿和价格,套餐二中有:薯条和汉堡和价格,如果做继承类,而且是多继承明显不够灵活,那么就需要装饰类. 4.适用性 以下情况使用Decorator模式 在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责. 处理他那些可以撤销的职责. 当不能采用

Android学习CursorWrapper与Decorator模式 (转至http://www.cnblogs.com/bastard/archive/2012/05/31/2527944.html)

一 Decorator模式 意图: 动态的给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 动态的给一个对象,而不是对整个类添加额外职责,说明此模式将采用的结构是组合而不是继承: 要给一个对象添加职责,通常可以使用其类的派生类对象替换当前对象,但这显得不够灵活, 继承结构属于静态形式,系统往往并不知道有这样的类存在: 而我们需要的在某些时刻让对象具有一些额外的职责,额外的职责很可能是来自我们自己的扩展或者某些时刻的特定需求等. 于是通过一种方式对现有的对

Android学习CursorWrapper与Decorator模式

Android学习CursorWrapper与Decorator模式 - Dufresne - 博客园 一 Decorator模式 意图: 动态的给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 动态的给一个对象,而不是对整个类添加额外职责,说明此模式将采用的结构是组合而不是继承: 要给一个对象添加职责,通常可以使用其类的派生类对象替换当前对象,但这显得不够灵活, 继承结构属于静态形式,系统往往并不知道有这样的类存在: 而我们需要的在某些时刻让对象具有一