Decorator设计模式的一个实例

原创 2007年10月15日 11:02:00

#ifndef DECORATOR_H_
#define DECORATOR_H_
#include <string>
using namespace std;
class Paragraph
{
public:
 Paragraph(const string& inInitialText) : mText(inInitialText) {}
 virtual string getHTML() const { return mText; }
protected:
 string mText;
};

class BoldParagraph : public Paragraph
{
public:
 BoldParagraph(const Paragraph& inParagraph) :
  Paragraph(""), mWrapped(inParagraph) {}
 virtual string getHTML() const {
  return "<B>" + mWrapped.getHTML() + "</B>";
 }
protected:
 const Paragraph& mWrapped;
};

class ItalicParagraph : public Paragraph
{
public:
 ItalicParagraph(const Paragraph& inParagraph) :
  Paragraph(""), mWrapped(inParagraph) {}
 virtual string getHTML() const {
  return "<I>" + mWrapped.getHTML() + "</I>";
 }
protected:
 const Paragraph& mWrapped;
}; 
#endif

#include "Player.h"
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
 Paragraph p("A party? For me? Thanks!");
 // Bold
 cout << BoldParagraph(p).getHTML() << endl;
 // Bold and Italic
 cout<<p.getHTML()<<endl;
 cout << ItalicParagraph(BoldParagraph(p)).getHTML() << endl;
 cout<<p.getHTML()<<endl;
 cout << BoldParagraph(BoldParagraph(p)) .getHTML() << endl;
 return 0;
}

输出的结果是:
<B>A party? For me? Thanks!</B>
<I><B>A party? For me? Thanks!</B></I>
(这里为什么会输出这个结果呢?因为 BoldParagraph(BoldParagraph(p)) .getHTML() 首先进入talicParagraph的getHTML()函数,然后又调用BoldParagraph 的getHTML()函数(通过虚函数的性质))
但这里存在一个副作用
cout << BoldParagraph(BoldParagraph(p)) .getHTML() << endl;
得到的结果是:
<B>A party? For me? Thanks!</B>
这是什么原因呢?
       What’s happening here is that instead of using the BoldParagraph constructor that takes a const Paragraph reference, the compiler is using the built-in copy constructor for BoldParagraph

 

另外一个例子:
UML图:

 

/********************************************************************
 
purpose: Decorator抽象的咖啡类与抽象的修饰类
*********************************************************************/
#ifndef ABSTRACTCOFEE_H
#define ABSTRACTCOFEE_H
 
#include <string>
using namespace std;
 
class BeverageCofee
{
public:
    virtual double getCost() =0;
    virtual string getDescription () =0;
};
 
class DecoratorCofee : public BeverageCofee
{
protected:
    DecoratorCofee(BeverageCofee *pBever);
    BeverageCofee *pBeverage;
};
 
#endif

 

/********************************************************************
http://blog.csdn.net/missvip
 
purpose: Decorator具体的咖啡类与具体的修饰类
*********************************************************************/
#ifndef CONCRETECOFEE_H_H
#define CONCRETECOFEE_H_H
 
#include "AbstractCofee.h"
 
class HostBlendCofee : public BeverageCofee
{
public:
    double getCost();
    string getDescription();
};
 
class DarkHostCofee : public BeverageCofee
{
public:
    double getCost();
    string getDescription();
};
 
class Milk : public DecoratorCofee
{
public:
   Milk(BeverageCofee *pBever);
   double getCost();
   string getDescription ();
};
 
class Suger : public DecoratorCofee
{
public:
   Suger(BeverageCofee *pBever);
   double getCost();
   string getDescription ();
};
 
#endif
 

 

/********************************************************************
http://blog.csdn.net/missvip
 
*********************************************************************/
#include "AbstractCofee.h"
 
DecoratorCofee::DecoratorCofee(BeverageCofee *pBever):pBeverage(pBever)
{
 
}

 

#include "ConcreteCofee.h"
 
double HostBlendCofee::getCost()
{
   return 4.0;
}
 
string HostBlendCofee::getDescription()
{
   return "HostBlend咖啡";
}
 
double DarkHostCofee::getCost()  
{
   return 5.0;
}
 
string DarkHostCofee::getDescription()  
{
   return "DarkHost咖啡";
}
 
Milk::Milk(BeverageCofee *pBever):DecoratorCofee(pBever)
{
 
}
 
double Milk::getCost()
{
   return pBeverage->getCost()+1.5;
}
 
string Milk::getDescription()
{
   return pBeverage->getDescription()+"+牛奶";
}
 
Suger::Suger(BeverageCofee *pBever):DecoratorCofee(pBever)
{
 
}
 
double Suger::getCost()
{
   return pBeverage->getCost()+0.5;
}
 
string Suger::getDescription()
{
   return pBeverage->getDescription()+"+糖";
}

 

/********************************************************************
purpose: 客户程序测试Decorator
*********************************************************************/
#include <iostream>
#include "ConcreteCofee.h"
using namespace std;
 
int main()
{
    BeverageCofee *OrderDarkHostCofee =new DarkHostCofee();
   cout<<OrderDarkHostCofee->getDescription()<<"价格是:"<<OrderDarkHostCofee->getCost()<<endl;
 
   //加糖后的价格
   OrderDarkHostCofee =new Suger(OrderDarkHostCofee);
   cout<<OrderDarkHostCofee->getDescription()<<"价格是:"<<OrderDarkHostCofee->getCost()<<endl;
 
   //加牛奶后的价格
   OrderDarkHostCofee =new Milk(OrderDarkHostCofee);
   cout<<OrderDarkHostCofee->getDescription()<<"价格是:"<<OrderDarkHostCofee->getCost()<<endl;
 
   return 0;
}

 最后运行结果:


可以看到DarkHost咖啡的价格是5元
加入调料糖后的价格变成5+0.5

设计模式——装饰模式(Decorator)

要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 设计模式学习笔记 ——Shulin 转载请注明出处:http://blog.csdn.net/zhshulin 1、概念 ...
  • u012909091
  • u012909091
  • 2014年08月18日 20:23
  • 17839

浅谈JAVA设计模式之——装饰模式(Decorator)

一、概述 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。 二、适用性 1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 2.处...
  • l1028386804
  • l1028386804
  • 2015年05月03日 23:56
  • 1840

JAVA设计模式之 装饰模式【Decorator Pattern】

一、概述 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继...
  • l416112167
  • l416112167
  • 2015年03月09日 21:07
  • 2014

简单Java代码实例助你通俗易懂的理解什么是装饰(者)设计模式 (Decorator)

首先抛开到处都有的文字概念。来看下面的例子。 现在以:人吃饭。这个需求为例。来讲解这个设计模式。 1.0:想当年,人们都比较朴实。吃饭就是简简单单的吃饭。 那么PersonBefore类里面一个简单的...
  • qq_27093465
  • qq_27093465
  • 2016年11月24日 15:34
  • 916

大话设计模式--装饰者模式 Decorator -- C++实现实例

1.装饰者模式 Decorator 动态地给一个对象添加一个额外的职责, 就添加功能来说, 装饰模式比生成子类更为灵活。 每个装饰对象的实现和如何使用这个对象分离,  每个装饰对象只关心自己的功能,不...
  • xj626852095
  • xj626852095
  • 2013年10月08日 14:46
  • 518

设计模式实例(Lua)笔记之七(Decorator模式)

1.描述 就说说"我"上小学的的糗事吧。我上小学的时候学习成绩非常的差,班级上 40 多个同学,我基本上都是在排名 45 名以后,按照老师给我的定义就是“不是读书的料”,但是我老爸管的很严格,明知道我...
  • my183100521
  • my183100521
  • 2015年08月21日 14:19
  • 1238

Net设计模式实例之装饰者模式(Decorator Pattern)

一、装饰模式简介(Brief Introduction) 动态地给一个对象添加一些额外的职责。 优点:把类中的装饰功能从类中搬移出去,这样可以简化原有的类。有效地把类的核心功能和装饰功能区分开了。...
  • my98800
  • my98800
  • 2017年01月14日 12:56
  • 144

设计模式与实例代码:Decorator模式

意图/定义:动态地给一个对象添加一些额外的职责,而这些职责可能以任意的顺序来添加,从而提供了比生成子类更灵活的方法来添加功能 问题:要使用的对象可以提供所需的功能,但可能要为这个对象添加某些功能,这...
  • zzulp
  • zzulp
  • 2012年04月01日 01:11
  • 701

每天一个设计模式之Decorator模式解决类间组合爆炸问题

模式动机Decorator模式是一种相对简单的对象结构性模式,动态和对象是个对应的关系,正如静态和类这样的对应关系,编译时能够决定的特质是静态特质,动态则表示在运行时进行操作,传统情况下使用的继承是静...
  • weixin_36708538
  • weixin_36708538
  • 2017年12月07日 17:45
  • 46

Android设计模式之一个例子让你彻底明白装饰者模式(Decorator Pattern)

导读这篇文章中我不会使用概念性文字来说明装饰者模式,因为通常概念性的问题都很抽象,很难懂,使得读者很难明白到底为什么要使用这种设计模式,我们设计模式的诞生,肯定是前辈们在设计程序的时候遇到了某种困难,...
  • nugongahou110
  • nugongahou110
  • 2015年12月27日 19:40
  • 2881
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Decorator设计模式的一个实例
举报原因:
原因补充:

(最多只允许输入30个字)