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

先上uml图:

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

uml解析:装饰者模式又名包装器,顾名思义就是给某个对象添加一些功能,而不是给整个类添加一些功能。Component跟Decorator是聚合关系,子类ConcreteDecoratorA和ConcreteDecoratorB实现具体对Component的修饰。

下面给出可执行的示例代码:

Decorator.h

#pragma once
#include <iostream>
using namespace std;

class Component
{
public:
    Component(void);
    virtual ~Component(void);
    virtual void Operation()=0;

};

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

};

class Decorator:public Component
{
public:
    Decorator(Component *component):m_Component(component){}
    void Operation();

protected:
    Component *m_Component;
};

class ConcreteDecoratorA:public Decorator
{
public:
    ConcreteDecoratorA(Component *component):Decorator(component){}
    void Operation();
    void AddState();
};

class ConcreteDecoratorB:public Decorator
{
public:
    ConcreteDecoratorB(Component *component):Decorator(component){}
    void Operation();
    void AddBehavior();
};

Decorator.cpp

#include "Component.h"

Component::Component(void)
{
}

Component::~Component(void)
{
}

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

void Decorator::Operation()
{
    m_Component->Operation();
};

void ConcreteDecoratorA::AddState()
{
    cout<<"AddState"<<endl;
}

void ConcreteDecoratorA::Operation()
{
    AddState();
    m_Component->Operation();
}

void ConcreteDecoratorB::AddBehavior()
{
    cout<<"AddBehavior"<<endl;
}

void ConcreteDecoratorB::Operation()
{
    AddBehavior();
    m_Component->Operation();
}

main.cpp

#include "Component.h"

int main(int argc,char **argv)
{
    //未装饰
    Component *p1=new ConcreteComponent;
    p1->Operation();
    //DecoratorA
    Component *p2=new ConcreteDecoratorA(p1);
    p2->Operation();
    //DecoratorB
    Component *p3=new ConcreteDecoratorB(p1);
    p3->Operation();
    return 0;
}

执行结果:

可看到分别对ConcreteComponent的装饰。

时间: 2024-10-11 16:23:56

浅谈设计模式之八——Decorator模式的相关文章

浅谈设计模式1-策略模式

对于大多数面向对象的初学者来说,将思维模式从面向过程转变过来是一个比较困难的过程.很多人在用面向对象语言编写程序的时候,依然会感觉自己在用面向过程的思维,笔者分享这篇文章的用意便是希望可以对大家有一些积极的影响. 阅读本文可以是没有接触设计模式,但需要一定的面向对象基础,至少简单理解封装,继承多态. 对于刚开始接触设计模式来说,一开始就说概念性的东西,很少能够理解.所以我们可以先跳过这些,通过一个小的程序场景来进行一个比较直观的认识. 模拟魂斗罗发射子&弹 相信大家小的时候玩过一款叫魂斗罗的游戏

浅谈设计模式:原型模式(Prototype Pattern)

热爱生活.享受娱乐.专注技术,欢迎关注QGer,我们一起见证成长! 什么是原型模式? 官方解释: cloning of an existing object instead of creating new one and can also be customized as per the requirement.(克隆一个现有对象来代替新建一个对象,并且可以按定制要求克隆) 通俗解释:通过新建一个原型对象(该对象实现一个具有克隆接口的抽象类.接口)指明要创建的类型,调用对象自身的克隆接口创建出更

菜鸟之路-浅谈设计模式之工厂模式

工厂模式 工厂模式是我们最经常使用的实例化对象模式了,是用工厂方法取代new操作的一种模式. 著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统能够说是随处可见. 由于工厂模式就相当于创建实例对象的new.我们经常要依据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,能否够考虑使用工厂模式,尽管这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的改动量. 工厂模式定义 我们以类Sample为例,

浅谈设计模式之七——Composite模式

同样地,先上uml图: 组合模式的意图:将对象组合合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. uml解析:leaf是叶节点,Composite可以理解为是一个多个叶节点的组合,它是非叶节点,就相当于一个元件以及一个元件容器,里面有很多元件一样.这里可以用list或者vector实现. 本来是想用模板来实现,后来发现实在是多此一举,而且反而更不好了. 这里需要说的一点就是Leaf是叶节点,因此肯定没有添加.删除等功能,因为

浅谈设计模式:迭代器模式(Iterator Pattern)

热爱生活.享受娱乐.专注技术,欢迎关注QGer,我们一起见证成长! 什么是迭代器模式? 官方解释:to access the elements of an aggregate object sequentially without exposing its underlying implementation. 顺序地访问集合对象的元素并且不暴露它的内部实现 通俗解释:假设给定一个集合对象,定义一个与之相关联的Iterator(迭代器),该迭代器能够访问集合对象的内部元素,通过迭代的方法能够按照顺

浅谈设计模式:解释器模式(Interpreter Pattern)

热爱生活.享受娱乐.专注技术,欢迎关注微信公众号QGer,我们一起见证成长! 什么是解释器模式? 官方解释:to define a representation of grammar of a given language, along with an interpreter that uses this representation to interpret sentences in the language. 定义一个给定语言的语法表达式,并用该表达式作为一个解释器来解释语言中的句子. 通俗

浅谈设计模式:命令模式(Command Pattern)

热爱生活.享受娱乐.专注技术,欢迎关注微信公众号QGer,我们一起见证成长! 什么是命令模式? 官方解释:encapsulate a request under an object as a command and pass it to invoker object. Invoker object looks for the appropriate objectwhich can handle this command and pass the command to the correspond

浅谈设计模式3-模板方法模式

模版方法模式,个人认为还是用处比较多的一个设计模式,而且也是比较好学和理解的一个.依然来通过模拟一个场景来慢慢了解. 现在我们来实现一下泡茶这个过程.首先我们需要烧开一壶水,然后往茶壶中放茶叶,加入开水,等待茶泡好. 经过前两次的分享,大家应该具备了基本的面向对象的思想了,这里就不再用面向过程的方式演示了. 首先,有一种普通人,他泡茶的方式是这样的 public class Common     { public void MakeTea()         {             Heat

浅谈设计模式的学习(下)

时间过得真快啊,不知不觉又要周末了,借这个周末时间.把<浅谈设计模式的学习(下)>补上吧. 在<浅谈设计模式的学习(中)>中,说到了保持抽象的思维.接下来说一下第四点,做一个分享,也记录一下自己的学习历程. 4.学习设计模式,就不要把它看的太认真    设计模式是一个编程思想,它不是具体的代码套路.举个例子说明一下: 由于家传,接触到了一些中国的传统武术.当我与那些不懂传统武术的人交流的时候,他们总是认为中国的传统武术都是些套路.花架子,只是用来好看.在他们认为,两人打架,别人出拳