设计模式(十)————装饰者模式(Decorator Pattern)

编程入门 行业动态 更新时间:2024-10-10 10:25:39

设计<a href=https://www.elefans.com/category/jswz/34/1771241.html style=模式(十)————装饰者模式(Decorator Pattern)"/>

设计模式(十)————装饰者模式(Decorator Pattern)

定义:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰者模式相比生成子类更加灵活。
UML类图:


C++实现:

#include<iostream>
#include<string>
using namespace std;class Beverage
{
public:string description = "Unkonw Beverage";virtual string getDescription(){return description;}virtual double cost() = 0;virtual ~Beverage() {}
};
class ComdimentDecorator :public Beverage
{
public :virtual ~ComdimentDecorator() {}
};
class Espresso : public Beverage
{
public:Espresso(){description = "Espressp Coffee";}double cost() override{return 1.99;}virtual ~Espresso() {}
};
class HouseBlend : public Beverage
{
public:HouseBlend(){description = "House Blend Coffee";}double cost() override{return 0.89;}virtual ~HouseBlend() {}
};
class DarkRoast : public Beverage
{
public:DarkRoast(){description = "Dark Roast Coffee";}double cost() override{return 0.99;}virtual ~DarkRoast() {}
};
class Decaf : public Beverage
{
public:Decaf(){description = "Decaf Coffee";}double cost() override{return 1.05;}virtual ~Decaf() {}
};
class Mocha : public ComdimentDecorator
{Beverage* beverage;
public:Mocha(Beverage* beverage){this->beverage = beverage;}double cost() override{return this->beverage->cost() + 0.2;}string getDescription() override{return this->beverage->getDescription() + ", Mocha";}virtual ~Mocha() {}
};
class Milk : public ComdimentDecorator
{Beverage* beverage;
public:Milk(Beverage* beverage){this->beverage = beverage;}double cost() override{return this->beverage->cost() + 0.1;}string getDescription() override{return this->beverage->getDescription() + ", Milk";}virtual ~Milk() {}
};
class Soy : public ComdimentDecorator
{Beverage* beverage;
public:Soy(Beverage* beverage){this->beverage = beverage;}double cost() override{return this->beverage->cost() + 0.15;}string getDescription() override{return this->beverage->getDescription() + ", Soy";}virtual ~Soy() {}
};
class Whip :public ComdimentDecorator
{Beverage* beverage;
public:Whip(Beverage* beverage){this->beverage = beverage;}double cost() override{return this->beverage->cost() + 0.1;}string getDescription() override{return this->beverage->getDescription() + ", Whip";}virtual ~Whip() {}
};int main()
{Beverage* beverage = new Espresso();cout << beverage->getDescription() << "\n" << beverage->cost() << endl;Beverage* beverage2 = new DarkRoast();beverage2 = new Mocha(beverage2);beverage2 = new Mocha(beverage2);beverage2 = new Whip(beverage2);cout << beverage2->getDescription() << "\n" << beverage2->cost() << endl;Beverage* beverage3 = new HouseBlend();beverage3 = new Soy(beverage3);beverage3 = new Mocha(beverage3);beverage3 = new Whip(beverage3);cout << beverage3->getDescription() << "\n" << beverage3->cost() << endl;return 0;
}

C#实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using static System.Console;namespace ConsoleApp1
{public abstract class Beverage{public String description = "Unkonw Beverage";virtual public String getDescription(){return description;}public abstract double cost();}public abstract class ComdimentDecorator :Beverage{}public class Espresso : Beverage{public Espresso(){description = "Espressp Coffee";}public override double cost(){return 1.99;}}public class HouseBlend : Beverage{public HouseBlend(){description = "House Blend Coffee";}public override double cost(){return 0.89;}}public class DarkRoast : Beverage{public DarkRoast(){description = "Dark Roast Coffee";}public override double cost(){return 0.99;}}public class Decaf : Beverage{public Decaf(){description = "Decaf Coffee";}public override double cost(){return 1.05;}}public class Mocha : ComdimentDecorator{Beverage beverage;public Mocha(Beverage beverage){this.beverage = beverage;}public override double cost(){return this.beverage.cost()+0.2;}public override string getDescription(){return this.beverage.getDescription() + ", Mocha";}}public class Milk : ComdimentDecorator{Beverage beverage;public Milk(Beverage beverage){this.beverage = beverage;}public override double cost(){return this.beverage.cost() + 0.1;}public override string getDescription(){return this.beverage.getDescription() + ", Milk";}}public class Soy : ComdimentDecorator{Beverage beverage;public Soy(Beverage beverage){this.beverage = beverage;}public override double cost(){return this.beverage.cost() + 0.15;}public override string getDescription(){return this.beverage.getDescription() + ", Soy";}}public class Whip : ComdimentDecorator{Beverage beverage;public Whip(Beverage beverage){this.beverage = beverage;}public override double cost(){return this.beverage.cost() + 0.1;}public override string getDescription(){return this.beverage.getDescription() + ", Whip";}}class Program{static void Main(string[] args){Beverage beverage = new Espresso();WriteLine(beverage.getDescription() + "\n" + beverage.cost()+"\n");Beverage beverage2 = new DarkRoast();beverage2 = new Mocha(beverage2);beverage2 = new Mocha(beverage2);beverage2 = new Whip(beverage2);WriteLine(beverage2.getDescription() + "\n" + beverage2.cost()+"\n");Beverage beverage3 = new HouseBlend();beverage3 = new Soy(beverage3);beverage3 = new Mocha(beverage3);beverage3 = new Whip(beverage3);WriteLine(beverage3.getDescription() + "\n" + beverage3.cost()+"\n");}}
}

 

更多推荐

设计模式(十)————装饰者模式(Decorator Pattern)

本文发布于:2024-02-26 04:39:06,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1701377.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:模式   Decorator   Pattern

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!