深入浅出设计模式笔记 -----Decorator

原创 2007年10月12日 22:50:00
读了深入浅出设计模式Decorator篇,对于Decorator有了新的了解与认识,决定将Decorator模式实现一遍,下面用C++语言将咖啡馆的例子重现。
UML图:

 

/********************************************************************

created: 2007/10/12

filename:   AbstractCofee.h

author:     凌剑

http://blog.csdn.net/missvip

 

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

 

/********************************************************************

created: 2007/10/12

filename:   ConcreteCofee.h

author:     凌剑

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

 

 

/********************************************************************

created: 2007/10/12

filename:   AbstractCofee.cpp

author:     凌剑

http://blog.csdn.net/missvip

 

purpose: Decorator抽象的咖啡类与抽象的修饰类

*********************************************************************/

#include "AbstractCofee.h"

 

DecoratorCofee::DecoratorCofee(BeverageCofee *pBever):pBeverage(pBever)

{

 

}

 

/********************************************************************

created: 2007/10/12

filename:   ConcreteCofee.cpp

author:     凌剑

http://blog.csdn.net/missvip

 

purpose: Decorator具体的咖啡类与具体的修饰类

*********************************************************************/

#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()+"+糖";

}

 

/********************************************************************

created: 2007/10/12

filename:   Main.cpp

author:     凌剑

http://blog.csdn.net/missvip

 

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
  • 17903

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

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

深入浅出设计模式(十四):23种设计模式概念总结

创建型模式 5种1.单例模式(Singleton)单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。eg.数据库。连...
  • liuquan0071
  • liuquan0071
  • 2016年02月25日 17:47
  • 3794

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

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

C++设计模式::装饰模式or代理模式or面向切片编程(AOP)

一个实例 装饰模式:动态地给一个对象(而非一个类)添加一些额外的职责。就增加功能来说,装饰模式比创建子类更加灵活,因为有时我们的需求是给某个对象而不是整个类添加一些功能,比如为一部手机添加增加挂...
  • lanchunhui
  • lanchunhui
  • 2015年11月20日 21:16
  • 1325

Python的decorator学习笔记

今天将python的decorator系统地学习了一下,自己也试着写了下,共有三种类型,第一种是普通装饰器,不带参数也不带返回值的。只需要将func(*args, **kwargs)在闭包函数块儿里执...
  • lulongfei172006
  • lulongfei172006
  • 2015年11月26日 14:46
  • 622

Java与模式之装饰(Decorator)模式

装饰(Decorator)模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。     装饰模式以对客户透明的方式动态地给一个对象附加上更多的...
  • hintcnuie
  • hintcnuie
  • 2016年12月29日 13:36
  • 527

深入浅出设计模式(七):9.代理模式

代理模式(Proxy)我们买房子办理贷款时可以自己到银行办理,但是手续很多,也可以找相应的代理公司,这样我们什么都不用管。代理模式就是给一个对象提供一个代理对象,由这个代理对象控制对原对象的引用代理模...
  • liuquan0071
  • liuquan0071
  • 2016年01月15日 15:35
  • 388

深入浅出设计模式之模板方法模式、迭代器模式、组合模式

模板方法模式
  • u011531613
  • u011531613
  • 2017年03月22日 21:31
  • 210

深入浅出设计模式(1)

故学然后知不足,教然后知困。知不足,然后能自反也;知困,然后能自强也,故曰:教学相长也。——礼记⋅\cdot学记 OOD(面向对象设计)如何才算是好的呢?我们可以用GRASP模式原则指导。 GRAS...
  • dudubird90
  • dudubird90
  • 2015年12月31日 15:55
  • 199
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深入浅出设计模式笔记 -----Decorator
举报原因:
原因补充:

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