定义
动态地将责任附加到对象上。若要扩展功能,装饰着提供了比继承更有弹性的替代方案。
类图:
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;
};