Headfirst设计模式的C++实现——装饰者模式(Decorater)
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)的更多相关文章
- headfirst设计模式(3)—装饰者模式
序 好久没写设计模式了,自从写了两篇之后,就放弃治疗了,主要还是工作太忙了啊(借口,都是借口),过完年以后一直填坑,填了好几个月,总算是稳定下来了,可以打打酱油了. 为什么又重新开始写设计模式呢?学习 ...
- HeadFirst设计模式读书笔记(3)-装饰者模式(Decorator Pattern)
装饰者模式:动态地将责任附件到对象上.若要扩展功能,装饰者提东了比继承更有弹性的替代方案. 装饰者和被装饰对象有相同的超类型 你可以用一个或者多个装饰者包装一个对象. 既然装饰者和被装饰对象有相同的超 ...
- 设计模式(八)装饰器模式Decorator(结构型)
设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法 ...
- php设计模式课程---7、装饰器模式如何使用
php设计模式课程---7.装饰器模式如何使用 一.总结 一句话总结: 装饰器的核心是获取了文章类整个类,而不是获取了文章内容,有了这个文章类,我想给你加多少装饰就给你加多少装饰(将文章这个类封装进去 ...
- 大型Java进阶专题(八)设计模式之适配器模式、装饰者模式和观察者模式
前言 今天开始我们专题的第八课了.本章节将介绍:三个设计模式,适配器模式.装饰者模式和观察者模式.通过学习适配器模式,可以优雅的解决代码功能的兼容问题.另外有重构需求的人群一定需要掌握装饰者模式. ...
- 【设计模式 - 9】之装饰者模式(Decorator)
1 模式简介 装饰者模式允许向一个现有的对象添加新的功能,同时又不改变其结构. 装饰者模式的思路是用"调料"对象将原始对象进行层层包裹,同时其属性.动作层层传递,达到最终 ...
- C#设计模式(11)——装饰者模式
1.装饰者模式介绍 装饰者顾名思义就是对一个类添加一些额外的装饰(功能).我们想给一个对象添加一些额外的功能又不改变对象内方法的签名怎么做呢?最常用的方法就是继承了,子类继承父类,然后重写父类的方法. ...
- 《大话设计模式》c++实现 装饰者模式
一.UML图 介绍 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创 ...
- 设计模式(九)装饰者模式(Decorator Pattern)
一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).A ...
随机推荐
- ffmpeg编解码音频AAC
本次项目的需求:手机端和PC端共享同一个音视频网络源. 所以编解码需要满足手机上编码和解码原来PC端的音视频流. 这里先封装安卓手机端音频的编解码. 编译工作依然是在linux下 ubuntu 12. ...
- 大型网站应用中MySQL的架构演变史
没有什么东西是一成不变的,包含我们的理想和生活!MySQL作为一个免费的开源的关系型数据库,深受大家喜爱,从最初的无人问津到当下的去IOE,都体现出了MySQL举足轻重的作用.今天我们就从淘宝的发展来 ...
- 多组radio传值注意事项
多组radio传值,每组的radio name必须不同,否则所有的radio将被视为一组,传值时只会传其中一组的值到后台,如果这时你用数组接收从前台传过来的值并使用,就会报数组越界异常
- PowerDesigner实用技巧小结(2)
PowerDesigner实用技巧小结 1.ORACLE数据库建模时,由于ORACLE的表名.字段名如果是小写会有一定的麻烦,需要将小写转化为大写? (1)在打开pdm的情况下,进入Tools-Mod ...
- [ATL/WTL]_[0基础]_[CBitmap复制图片-截取图片-平铺图片]
场景: 1.当你须要截取图片部分区域作为某个控件的背景. 2.须要平铺图片到一个大区域让他自己主动放大时. 3.或者须要合并图片时. 代码: CDC sdc; CDC ddc; sdc.CreateC ...
- java并发 使用ScheduledExecutor的温室控制器--thinking in java 21.7.5
package org.rui.thread.newc; import java.text.DateFormat; import java.text.SimpleDateFormat; import ...
- SQL Server 2008 游标使用实例
本文使用以下两张数据库表作为演示对象. 1 游标初探--使用游标进行遍历 declare @classAndStudent table( class_id int, --班级ID class_name ...
- [React] React Fundamentals: Owner Ownee Relationship
The owner-ownee relationship is used to designate a parent-child relationship with React components ...
- lambda显式声明返回值
10.21 编写一个lambda,捕获一个局部int变量,并递减变量值,直至它变为0.一旦变量变为0,再调用lambda应该不再递减变量.lambda应该返回一个bool值,指出捕获的变量是否为0. ...
- MVC - 布局
布局类似于APSX视图的母版页 用的是Razor的语法 创建布局 布局页面默认放在Shared目录 有几个自动生成的cshtml文件 删除它们 然后创建一个视图 命名为MyLayOut 取消勾选使用母 ...