首页 > 其他分享 >HeadFirst设计模式-装饰者模式

HeadFirst设计模式-装饰者模式

时间:2022-11-09 19:13:54浏览次数:51  
标签:HeadFirst include const virtual public Beverage 设计模式 装饰 beverage

 

C++代码

#pragma once
#include <string>
using std::string;

class Beverage
{
public:

    Beverage()
    {
    }

    virtual ~Beverage()
    {
    }

    virtual string getDescription() const
    {
        return description;
    }

    virtual double cost() const = 0;//纯虚函数可以有函数体

protected:
    string description = "Unknown Beverage";
};

//--------------------------------------

#pragma once
#include "Beverage.h"
class DarkRoast :
    public Beverage
{
public:

    DarkRoast()
    {
        this->description = "Dark Roast Coffee";
    }

    virtual ~DarkRoast()
    {
    }

    virtual double cost() const
    {
        return 0.99;
    }
};

#pragma once
#include "Beverage.h"
class Condiment :
    public Beverage
{
public:

    Condiment()
    {
    }

    virtual ~Condiment()
    {
    }

    virtual string getDescription() const = 0; //纯虚函数可以有函数体
};
//--------------------------------------
#pragma once
#include "Beverage.h"
class Espresso :
    public Beverage
{
public:

    Espresso()
    {
        this->description = "Espresso Coffee";
    }

    virtual ~Espresso()
    {
    }

    virtual double cost() const
    {
        return 1.99;
    }
};


//--------------------------------------
#pragma once
#include "Beverage.h"
class HouseBlend :
    public Beverage
{
public:

    HouseBlend()
    {
        this->description = "House Blend Coffee";
    }

    virtual ~HouseBlend()
    {
    }

    virtual double cost() const
    {
        return 0.89;
    }
};


//--------------------------------------
#pragma once
#include "Condiment.h"
class Mocha :
    public Condiment
{

private:
    Beverage* beverage; 
public:

    Mocha(Beverage* beverage)
    {
        this->beverage = beverage;
    }

    virtual ~Mocha()
    {
    }

    virtual string getDescription() const
    {
        return beverage->getDescription() + ",Mocha";
    }

    virtual double cost() const
    {
        return 0.20 + beverage->cost();
    }

private:
    Mocha(const Mocha& m){

    }
};


//--------------------------------------
#pragma once
#include "Condiment.h"

//奶泡
class Whip :
    public Condiment
{

private:
    Beverage* beverage;
public:

    Whip(Beverage* beverage)
    {
        this->beverage = beverage;
    }

    virtual ~Whip()
    {
    }

    virtual string getDescription() const
    {
        return beverage->getDescription() + ",Whip";
    }

    virtual double cost() const
    {
        return 0.10 + beverage->cost();
    }

};


//--------------------------------------
#pragma once
#include "Condiment.h"
class Soy :
    public Condiment
{

private:
    Beverage* beverage;
public:

    Soy(Beverage* beverage)
    {
        this->beverage = beverage;
    }

    virtual ~Soy()
    {
    }

    virtual string getDescription() const
    {
        return beverage->getDescription() + ",Soy";
    }

    virtual double cost() const
    {
        return 0.15 + beverage->cost();
    }

};


//--------------------------------------
#pragma once
#include "Condiment.h"
class Milk :
    public Condiment
{

private:
    Beverage* beverage;
public:

    Milk(Beverage* beverage)
    {
        this->beverage = beverage;
    }

    virtual ~Milk()
    {
    }

    virtual string getDescription() const
    {
        return beverage->getDescription() + ",Milk";
    }

    virtual double cost() const
    {
        return 0.10 + beverage->cost();
    }

};


//--------------------------------------
#include <iostream>
#include "Condiment.h"
#include "DarkRoast.h"
#include "HouseBlend.h"
#include "Espresso.h"
#include "Mocha.h"
#include "Whip.h"
#include "Soy.h"
using namespace std;

void display(const Beverage& b){
    cout <<"name:" << b.getDescription() << "\ncost:" << b.cost() << endl;
}

void display2(const Beverage* b){
    cout << "name:" << b->getDescription() << "\ncost:" << b->cost() << endl;
}

int main(){
    //浓缩咖啡
    Espresso e;
    display(e);

    //深烘焙 + 2份摩卡 + 1份奶泡
    DarkRoast dr;
    Mocha mo(&dr);
    Mocha mo2(&mo);
    Whip w(&mo2);
    display(w);

    //混合 + 豆浆 + 摩卡 + 奶泡
    HouseBlend hb;
    Soy t1(&hb);
    Mocha t2(&t1);
    Whip t3(&t2);
    Beverage* b = &t3;
    display2(b);
}
/*
name:Espresso Coffee
cost:1.99
name:Dark Roast Coffee,Mocha,Mocha,Whip
cost:1.49
name:House Blend Coffee,Soy,Mocha,Whip
cost:1.34
*/
//--------------------------------------
View Code

 

--------------------

标签:HeadFirst,include,const,virtual,public,Beverage,设计模式,装饰,beverage
From: https://www.cnblogs.com/htj10/p/16874835.html

相关文章

  • 浅谈PHP设计模式的命令模式
    简介:命令模式,又称之为动作模式或者事务模式,属于行为型的设计模式。将不同的请求封装成不同的请求对象,以便使用不同的请求;角色都会用饭馆来举例子:命令下达者:顾客命令......
  • 设计模式利剑三--抽象工厂方法模型
    定   义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类优   点:           1、封装性,每个产品的实现类不是高层模块要关心的,他们......
  • 设计模式利剑4-模板方法模式
    定   义:定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤优   点:            1......
  • 设计模式利剑5-建造者模式
    定   义:将一个复杂对象的构建于它的表示分离,使得同样的构建过程可以创建不同的表示优   点:            1、封装性            2、建造者......
  • 设计模式利剑15-组合模式
    定     义:将对象组合成树形结构以表示“整体-部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性优     点:              1、高层......
  • 设计模式简介及单例模式
    目录设计模式简介及单例模式单例模块实现的多种方式方式一:绑定给类的方法方式二:基于元类的类名加括号方式三:基于模块的单例模式方式四:定义一个装饰器实现单例模式方法五:基......
  • 设计模式利剑14-迭代器模式
    定     义:它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对对象的内部细节,,Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以......
  • 设计模式利剑17-门面模式
    定     义:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行,门面模式提供一个高层次的接口,使得子系统更易于使用优     点:           ......
  • 设计模式利剑22--享元模式
    定     义:使用共享对象可以有效地支持大量的细粒度的对象,享元模式可以避免大量非常相似类的开销。在程序设计中有时需要生成大量细             粒度的......
  • js设计模式-类式继承
    js中怎么实现类式继承呢?首先声明父类,在声明子类,然后将父类的实例赋予给子类的原型就可以了。假设父类长这样:varBook=function(id,name,price){//私有的属性......