Beverage.h

 #ifndef BEVERAGE_H_INCLUDED
#define BEVERAGE_H_INCLUDED #include <string> class Beverage
{
public:
Beverage( std::string description = "Unknown Beverage" ) : m_description ( description ) {}
virtual std::string getDescription() { return m_description; }
virtual double cost() = ;
private:
std::string m_description;
}; #endif // BEVERAGE_H_INCLUDED

CondimentDecorator.h

 #ifndef CONDIMENTDECORATOR_H_INCLUDED
#define CONDIMENTDECORATOR_H_INCLUDED #include <string>
#include "Beverage.h" class CondimentDecorator : public Beverage
{
public:
virtual std::string getDescription() = ;
}; #endif // CONDIMENTDECORATOR_H_INCLUDED

HouseBlend.h

 #ifndef HOUSEBLEND_H_INCLUDED
#define HOUSEBLEND_H_INCLUDED #include "Beverage.h" class HouseBlend : public Beverage
{
public:
HouseBlend () : Beverage( "House Blend Coffee" ) {}
double cost() { return .; }
}; #endif // HOUSEBLEND_H_INCLUDED

Mocha.h

 #ifndef MOCHA_H_INCLUDED
#define MOCHA_H_INCLUDED #include "CondimentDecorator.h" class Mocha : public CondimentDecorator
{
public:
Mocha ( Beverage * p_beverage ) : m_p_beverage ( p_beverage ) {}
std::string getDescription() { return m_p_beverage->getDescription() + ", Mocha"; }
double cost() { return . + m_p_beverage->cost(); }
private:
Beverage *m_p_beverage;
}; #endif // MOCHA_H_INCLUDED

main.cpp

 #include <iostream>
#include "HouseBlend.h"
#include "Mocha.h"
int main()
{
HouseBlend house_blend;
std::cout << house_blend.getDescription() << ": " << house_blend.cost() << std::endl; Mocha mocha_house_blend( &house_blend );
std::cout << mocha_house_blend.getDescription() << ": " << mocha_house_blend.cost() << std::endl; Mocha mocha_mocha_house_blend( &mocha_house_blend );
std::cout << mocha_mocha_house_blend.getDescription() << ": " << mocha_mocha_house_blend.cost() << std::endl; return ;
}

一点个人理解:

起初对于为什么Mocha类要从CondimentDecorator类继承也就是CondimentDecorator类存在的意义感到疑惑,并做了一次尝试:跳过CondimentDecorator类,让Mocha类直接从Beverage类继承,发现效果是一样的。那为什么还要有CondimentDecorator类的存在呢?

原书上有这么一段解释:

“所有的调料装饰着都必须重新实现getDescription()方法。稍后我们会解释为什么......”

"我们希望叙述不只是描述饮料,而是完整的连调料都描述出来......"

我推测作者的意思是说通过CondimentDecorator类,并且把getDescription方法设置为纯虚函数就可以强制让所有调料类实现此方法。如果不通过getDescription类,那么调料类就可以不实现此方法从而不符合需求。

Headfirst设计模式的C++实现——装饰者模式(Decorater)的更多相关文章

  1. headfirst设计模式(3)—装饰者模式

    序 好久没写设计模式了,自从写了两篇之后,就放弃治疗了,主要还是工作太忙了啊(借口,都是借口),过完年以后一直填坑,填了好几个月,总算是稳定下来了,可以打打酱油了. 为什么又重新开始写设计模式呢?学习 ...

  2. HeadFirst设计模式读书笔记(3)-装饰者模式(Decorator Pattern)

    装饰者模式:动态地将责任附件到对象上.若要扩展功能,装饰者提东了比继承更有弹性的替代方案. 装饰者和被装饰对象有相同的超类型 你可以用一个或者多个装饰者包装一个对象. 既然装饰者和被装饰对象有相同的超 ...

  3. 设计模式(八)装饰器模式Decorator(结构型)

    设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法 ...

  4. php设计模式课程---7、装饰器模式如何使用

    php设计模式课程---7.装饰器模式如何使用 一.总结 一句话总结: 装饰器的核心是获取了文章类整个类,而不是获取了文章内容,有了这个文章类,我想给你加多少装饰就给你加多少装饰(将文章这个类封装进去 ...

  5. 大型Java进阶专题(八)设计模式之适配器模式、装饰者模式和观察者模式

    前言 ​ 今天开始我们专题的第八课了.本章节将介绍:三个设计模式,适配器模式.装饰者模式和观察者模式.通过学习适配器模式,可以优雅的解决代码功能的兼容问题.另外有重构需求的人群一定需要掌握装饰者模式. ...

  6. 【设计模式 - 9】之装饰者模式(Decorator)

    1      模式简介 装饰者模式允许向一个现有的对象添加新的功能,同时又不改变其结构. 装饰者模式的思路是用"调料"对象将原始对象进行层层包裹,同时其属性.动作层层传递,达到最终 ...

  7. C#设计模式(11)——装饰者模式

    1.装饰者模式介绍 装饰者顾名思义就是对一个类添加一些额外的装饰(功能).我们想给一个对象添加一些额外的功能又不改变对象内方法的签名怎么做呢?最常用的方法就是继承了,子类继承父类,然后重写父类的方法. ...

  8. 《大话设计模式》c++实现 装饰者模式

    一.UML图   介绍 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创 ...

  9. 设计模式(九)装饰者模式(Decorator Pattern)

    一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...

随机推荐

  1. BZOJ1901 - Dynamic Rankings(树状数组套主席树)

    题目大意 给定一个有N个数字的序列,然后又m个指令,指令种类只有两种,形式如下: Q l r k 要求你查询区间[l,r]第k小的数是哪个 C i t  要求你把第i个数修改为t 题解 动态的区间第k ...

  2. POJ2891 - Strange Way to Express Integers(模线性方程组)

    题目大意 求最小整数x,满足x≡a[i](mod m[i])(没有保证所有m[i]两两互质) 题解 中国剩余定理显然不行....只能用方程组两两合并的方法求出最终的解,刘汝佳黑书P230有讲~~具体证 ...

  3. 互联网挣钱info

    AdSense – Google 广告 http://www.freehao123.com/tag/mianfeiphpkongjian/ [免费资源部落;] ntpdate -u time-b.ti ...

  4. Jquery zTree的使用

    <%@ page language="java" pageEncoding="utf-8"%><%@taglib prefix="s ...

  5. java web 自定义错误页面 完整jsp错误页面代码(同时写错误日志) error.jsp

    1.首先配置web.xml  添加一下代码 <error-page> <error-code>500</error-code> <location>/e ...

  6. 浅谈android4.0开发之GridLayout布局

    作者:李响 本文重点讲述了自android4.0版本号后新增的GridLayout网格布局的一些基本内容,并在此基础上实现了一个简单的计算器布局框架.通过本文,您可以了解到一些android UI开发 ...

  7. PHP【第一篇】安装

    一.准备 1.环境 系统平台:Red Hat Enterprise Linux Server release 7.3 (Maipo) 内核版本:3.10.0-514.el7.x86_64 2.下载安装 ...

  8. JS中checkbox组件的使用

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  9. java float、double精度研究(转)

    在java中运行一下代码System.out.println(2.00-1.10);输出的结果是:0.8999999999999999很奇怪,并不是我们想要的值0.9 再运行如下代码:System.o ...

  10. cglib源码分析(一): 缓存和KEY

    cglib是一个java 字节码的生成工具,它是对asm的进一步封装,提供了一系列class generator.研究cglib主要是因为它也提供了动态代理功能,这点和jdk的动态代理类似. 一. C ...