设计模式3-装饰者模式

定义
动态地将责任附加到对象上。若要扩展功能,装饰着提供了比继承更有弹性的替代方案。

类图:
类图
C++实现(有问题待解决)
Example part0, Decorator.cpp

// Decorator.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include "Beverage.h"
#include "Espresso.h"
#include "Mocha.h"

int main()
{
    Beverage beverage = Espresso();
    beverage = Mocha(beverage);

    std::cout << beverage.getDescritpion() << std::endl;
    std::cout << beverage.cost() << std::endl;

    return 0;
}

Beverage.h

#pragma once

#include <string>
#include <istream>

using namespace std;

class Beverage // interface class
{
public:
	Beverage();
	Beverage(string s, double p);
	Beverage(const Beverage &beverage);
	~Beverage();
	string getDescritpion();
	void setDescritpion(string);
	double cost();
	void setPrice(double);

protected:
	string description;
	double price;
};


Beverage.cpp

#include "Beverage.h"

Beverage::Beverage()
	: description("Unknow Beverage"), price(0.0) {}

Beverage::Beverage(string s, double p)
	: description(s), price(p) {}

Beverage::~Beverage() {}

string Beverage::getDescritpion() {
	return description;
}

void Beverage::setDescritpion(string s) {
	description = s;
}

double Beverage::cost() {
	return price;
}

void Beverage::setPrice(double v) {
	price = v;
}

Beverage::Beverage(const Beverage& b) {
	description = b.description;
	price = b.price;
}

Example part1, Espresso.h

#pragma once

#include "Beverage.h"

using namespace std;

class Espresso : public Beverage
{
public:
	Espresso();
	~Espresso();
};



Espress.cpp

#include "Espresso.h"

Espresso::Espresso()
	: Beverage("Espresso", 1.77) {}

Espresso::~Espresso() {}

Example part2, CondimentDecorator.h

#pragma once

#include "Beverage.h"

using namespace std;

class CondimentDecorator : public Beverage
{
public:
	string getDescription();
};


CondimentDecorator.cpp

#include "CondimentDecorator.h"

string CondimentDecorator::getDescription() {
	return description;
}

Example part3, Mocha.h

#pragma once

#include "CondimentDecorator.h"

using namespace std;

class Mocha : public CondimentDecorator
{
public:
	Mocha(Beverage b) {
		beverage.setDescritpion(b.getDescritpion());
		beverage.setPrice(b.cost());
	}

	string getDescription() {
		return description;
	}

	double cost() {
		return 0.2 + beverage.cost();
	}

private:
	Beverage beverage;
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值