decorator
This commit is contained in:
parent
e815172862
commit
90c1b88af9
|
@ -0,0 +1,35 @@
|
||||||
|
module decorator.coffee.app;
|
||||||
|
|
||||||
|
import decorator.coffee.beverage;
|
||||||
|
import decorator.coffee.espresso;
|
||||||
|
import decorator.coffee.darkroast;
|
||||||
|
import decorator.coffee.houseblend;
|
||||||
|
import decorator.coffee.decaf;
|
||||||
|
import decorator.coffee.mocha;
|
||||||
|
import decorator.coffee.milk;
|
||||||
|
import decorator.coffee.soy;
|
||||||
|
import decorator.coffee.whip;
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
void print(Beverage beverage)
|
||||||
|
{
|
||||||
|
writeln(beverage.getDescription(), " $", beverage.cost());
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
Beverage beverage = new Espresso();
|
||||||
|
print(beverage);
|
||||||
|
|
||||||
|
Beverage beverage2 = new DarkRoast();
|
||||||
|
beverage2 = new Mocha(beverage2);
|
||||||
|
beverage2 = new Mocha(beverage2);
|
||||||
|
beverage2 = new Whip(beverage2);
|
||||||
|
print(beverage2);
|
||||||
|
|
||||||
|
Beverage beverage3 = new HouseBlend();
|
||||||
|
beverage3 = new Soy(beverage3);
|
||||||
|
beverage3 = new Mocha(beverage3);
|
||||||
|
beverage3 = new Whip(beverage3);
|
||||||
|
print(beverage3);
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
module decorator.coffee.beverage;
|
||||||
|
|
||||||
|
abstract class Beverage
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
string description = "Unknown Beverage";
|
||||||
|
public:
|
||||||
|
string getDescription()
|
||||||
|
{
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
double cost();
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
module decorator.coffee.condimentdecorator;
|
||||||
|
|
||||||
|
import decorator.coffee.beverage;
|
||||||
|
|
||||||
|
abstract class CondimerDecorator : Beverage
|
||||||
|
{
|
||||||
|
override string getDescription();
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
module decorator.coffee.darkroast;
|
||||||
|
|
||||||
|
import decorator.coffee.beverage;
|
||||||
|
|
||||||
|
class DarkRoast : Beverage
|
||||||
|
{
|
||||||
|
this()
|
||||||
|
{
|
||||||
|
description = "Dark Roast Coffee";
|
||||||
|
}
|
||||||
|
|
||||||
|
override double cost()
|
||||||
|
{
|
||||||
|
return .99;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
module decorator.coffee.decaf;
|
||||||
|
|
||||||
|
import decorator.coffee.beverage;
|
||||||
|
|
||||||
|
class Decaf : Beverage
|
||||||
|
{
|
||||||
|
this()
|
||||||
|
{
|
||||||
|
description = "Decaf Coffee";
|
||||||
|
}
|
||||||
|
|
||||||
|
override double cost()
|
||||||
|
{
|
||||||
|
return 1.05;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
module decorator.coffee.espresso;
|
||||||
|
|
||||||
|
import decorator.coffee.beverage;
|
||||||
|
|
||||||
|
class Espresso : Beverage
|
||||||
|
{
|
||||||
|
this()
|
||||||
|
{
|
||||||
|
description = "Espresso";
|
||||||
|
}
|
||||||
|
|
||||||
|
override double cost()
|
||||||
|
{
|
||||||
|
return 1.99;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
module decorator.coffee.houseblend;
|
||||||
|
|
||||||
|
import decorator.coffee.beverage;
|
||||||
|
|
||||||
|
class HouseBlend : Beverage
|
||||||
|
{
|
||||||
|
this()
|
||||||
|
{
|
||||||
|
description = "House Blend Coffee";
|
||||||
|
}
|
||||||
|
|
||||||
|
override double cost()
|
||||||
|
{
|
||||||
|
return .89;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
module decorator.coffee.milk;
|
||||||
|
|
||||||
|
import decorator.coffee.beverage;
|
||||||
|
import decorator.coffee.condimentdecorator;
|
||||||
|
|
||||||
|
class Milk : CondimerDecorator
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Beverage beverage;
|
||||||
|
public:
|
||||||
|
this(Beverage beverage)
|
||||||
|
{
|
||||||
|
this.beverage = beverage;
|
||||||
|
}
|
||||||
|
|
||||||
|
override string getDescription()
|
||||||
|
{
|
||||||
|
return beverage.getDescription() ~ ", Milk";
|
||||||
|
}
|
||||||
|
|
||||||
|
override double cost()
|
||||||
|
{
|
||||||
|
return .10 + beverage.cost();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
module decorator.coffee.mocha;
|
||||||
|
|
||||||
|
import decorator.coffee.beverage;
|
||||||
|
import decorator.coffee.condimentdecorator;
|
||||||
|
|
||||||
|
class Mocha : CondimerDecorator
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Beverage beverage;
|
||||||
|
public:
|
||||||
|
this(Beverage beverage)
|
||||||
|
{
|
||||||
|
this.beverage = beverage;
|
||||||
|
}
|
||||||
|
|
||||||
|
override string getDescription()
|
||||||
|
{
|
||||||
|
return beverage.getDescription() ~ ", Mocha";
|
||||||
|
}
|
||||||
|
|
||||||
|
override double cost()
|
||||||
|
{
|
||||||
|
return .20 + beverage.cost();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
module decorator.coffee.soy;
|
||||||
|
|
||||||
|
import decorator.coffee.beverage;
|
||||||
|
import decorator.coffee.condimentdecorator;
|
||||||
|
|
||||||
|
class Soy : CondimerDecorator
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Beverage beverage;
|
||||||
|
public:
|
||||||
|
this(Beverage beverage)
|
||||||
|
{
|
||||||
|
this.beverage = beverage;
|
||||||
|
}
|
||||||
|
|
||||||
|
override string getDescription()
|
||||||
|
{
|
||||||
|
return beverage.getDescription() ~ ", Soy";
|
||||||
|
}
|
||||||
|
|
||||||
|
override double cost()
|
||||||
|
{
|
||||||
|
return .15 + beverage.cost();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
module decorator.coffee.whip;
|
||||||
|
|
||||||
|
import decorator.coffee.beverage;
|
||||||
|
import decorator.coffee.condimentdecorator;
|
||||||
|
|
||||||
|
class Whip : CondimerDecorator
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Beverage beverage;
|
||||||
|
public:
|
||||||
|
this(Beverage beverage)
|
||||||
|
{
|
||||||
|
this.beverage = beverage;
|
||||||
|
}
|
||||||
|
|
||||||
|
override string getDescription()
|
||||||
|
{
|
||||||
|
return beverage.getDescription() ~ ", Whip";
|
||||||
|
}
|
||||||
|
|
||||||
|
override double cost()
|
||||||
|
{
|
||||||
|
return .10 + beverage.cost();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
module decorator.coffeewithsize.app;
|
||||||
|
|
||||||
|
import decorator.coffeewithsize.beverage;
|
||||||
|
import decorator.coffeewithsize.espresso;
|
||||||
|
import decorator.coffeewithsize.darkroast;
|
||||||
|
import decorator.coffeewithsize.houseblend;
|
||||||
|
import decorator.coffeewithsize.decaf;
|
||||||
|
import decorator.coffeewithsize.mocha;
|
||||||
|
import decorator.coffeewithsize.milk;
|
||||||
|
import decorator.coffeewithsize.soy;
|
||||||
|
import decorator.coffeewithsize.whip;
|
||||||
|
import std.stdio : writeln;
|
||||||
|
|
||||||
|
alias Size = Beverage.Size;
|
||||||
|
|
||||||
|
void print(Beverage beverage)
|
||||||
|
{
|
||||||
|
writeln(beverage.getDescription(), " $", beverage.cost());
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
Beverage beverage = new Espresso();
|
||||||
|
print(beverage);
|
||||||
|
|
||||||
|
Beverage beverage2 = new DarkRoast();
|
||||||
|
beverage2 = new Mocha(beverage2);
|
||||||
|
beverage2 = new Mocha(beverage2);
|
||||||
|
beverage2 = new Whip(beverage2);
|
||||||
|
print(beverage2);
|
||||||
|
|
||||||
|
Beverage beverage3 = new HouseBlend();
|
||||||
|
beverage3.setSize(Size.VENTI);
|
||||||
|
beverage3 = new Soy(beverage3);
|
||||||
|
beverage3 = new Mocha(beverage3);
|
||||||
|
beverage3 = new Whip(beverage3);
|
||||||
|
print(beverage3);
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
module decorator.coffeewithsize.beverage;
|
||||||
|
|
||||||
|
abstract class Beverage
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
string description = "Unknown Beverage";
|
||||||
|
public:
|
||||||
|
enum Size { TALL, GRANDE, VENTI }
|
||||||
|
Size size = Size.TALL;
|
||||||
|
|
||||||
|
string getDescription()
|
||||||
|
{
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setSize(Size size)
|
||||||
|
{
|
||||||
|
this.size = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
Size getSize()
|
||||||
|
{
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
double cost();
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
module decorator.coffeewithsize.condimentdecorator;
|
||||||
|
|
||||||
|
import decorator.coffeewithsize.beverage;
|
||||||
|
|
||||||
|
abstract class CondimerDecorator : Beverage
|
||||||
|
{
|
||||||
|
override string getDescription();
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
module decorator.coffeewithsize.darkroast;
|
||||||
|
|
||||||
|
import decorator.coffeewithsize.beverage;
|
||||||
|
|
||||||
|
class DarkRoast : Beverage
|
||||||
|
{
|
||||||
|
this()
|
||||||
|
{
|
||||||
|
description = "Dark Roast Coffee";
|
||||||
|
}
|
||||||
|
|
||||||
|
override double cost()
|
||||||
|
{
|
||||||
|
return .99;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
module decorator.coffeewithsize.decaf;
|
||||||
|
|
||||||
|
import decorator.coffeewithsize.beverage;
|
||||||
|
|
||||||
|
class Decaf : Beverage
|
||||||
|
{
|
||||||
|
this()
|
||||||
|
{
|
||||||
|
description = "Decaf Coffee";
|
||||||
|
}
|
||||||
|
|
||||||
|
override double cost()
|
||||||
|
{
|
||||||
|
return 1.05;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
module decorator.coffeewithsize.espresso;
|
||||||
|
|
||||||
|
import decorator.coffeewithsize.beverage;
|
||||||
|
|
||||||
|
class Espresso : Beverage
|
||||||
|
{
|
||||||
|
this()
|
||||||
|
{
|
||||||
|
description = "Espresso";
|
||||||
|
}
|
||||||
|
|
||||||
|
override double cost()
|
||||||
|
{
|
||||||
|
return 1.99;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
module decorator.coffeewithsize.houseblend;
|
||||||
|
|
||||||
|
import decorator.coffeewithsize.beverage;
|
||||||
|
|
||||||
|
class HouseBlend : Beverage
|
||||||
|
{
|
||||||
|
this()
|
||||||
|
{
|
||||||
|
description = "House Blend Coffee";
|
||||||
|
}
|
||||||
|
|
||||||
|
override double cost()
|
||||||
|
{
|
||||||
|
return .89;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
module decorator.coffeewithsize.milk;
|
||||||
|
|
||||||
|
import decorator.coffeewithsize.beverage;
|
||||||
|
import decorator.coffeewithsize.condimentdecorator;
|
||||||
|
|
||||||
|
class Milk : CondimerDecorator
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Beverage beverage;
|
||||||
|
public:
|
||||||
|
this(Beverage beverage)
|
||||||
|
{
|
||||||
|
this.beverage = beverage;
|
||||||
|
}
|
||||||
|
|
||||||
|
override string getDescription()
|
||||||
|
{
|
||||||
|
return beverage.getDescription() ~ ", Milk";
|
||||||
|
}
|
||||||
|
|
||||||
|
override double cost()
|
||||||
|
{
|
||||||
|
return .10 + beverage.cost();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
module decorator.coffeewithsize.mocha;
|
||||||
|
|
||||||
|
import decorator.coffeewithsize.beverage;
|
||||||
|
import decorator.coffeewithsize.condimentdecorator;
|
||||||
|
|
||||||
|
class Mocha : CondimerDecorator
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Beverage beverage;
|
||||||
|
public:
|
||||||
|
this(Beverage beverage)
|
||||||
|
{
|
||||||
|
this.beverage = beverage;
|
||||||
|
}
|
||||||
|
|
||||||
|
override string getDescription()
|
||||||
|
{
|
||||||
|
return beverage.getDescription() ~ ", Mocha";
|
||||||
|
}
|
||||||
|
|
||||||
|
override double cost()
|
||||||
|
{
|
||||||
|
return .20 + beverage.cost();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
module decorator.coffeewithsize.soy;
|
||||||
|
|
||||||
|
import decorator.coffeewithsize.beverage;
|
||||||
|
import decorator.coffeewithsize.condimentdecorator;
|
||||||
|
|
||||||
|
class Soy : CondimerDecorator
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Beverage beverage;
|
||||||
|
public:
|
||||||
|
this(Beverage beverage)
|
||||||
|
{
|
||||||
|
this.beverage = beverage;
|
||||||
|
}
|
||||||
|
|
||||||
|
override string getDescription()
|
||||||
|
{
|
||||||
|
return beverage.getDescription() ~ ", Soy";
|
||||||
|
}
|
||||||
|
|
||||||
|
override double cost()
|
||||||
|
{
|
||||||
|
double cost = beverage.cost();
|
||||||
|
if (beverage.getSize() == Size.TALL)
|
||||||
|
{
|
||||||
|
cost += .10;
|
||||||
|
}
|
||||||
|
else if (beverage.getSize() == Size.GRANDE)
|
||||||
|
{
|
||||||
|
cost += .15;
|
||||||
|
}
|
||||||
|
else if (beverage.getSize() == Size.VENTI)
|
||||||
|
{
|
||||||
|
cost += .20;
|
||||||
|
}
|
||||||
|
return cost;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
module decorator.coffeewithsize.whip;
|
||||||
|
|
||||||
|
import decorator.coffeewithsize.beverage;
|
||||||
|
import decorator.coffeewithsize.condimentdecorator;
|
||||||
|
|
||||||
|
class Whip : CondimerDecorator
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Beverage beverage;
|
||||||
|
public:
|
||||||
|
this(Beverage beverage)
|
||||||
|
{
|
||||||
|
this.beverage = beverage;
|
||||||
|
}
|
||||||
|
|
||||||
|
override string getDescription()
|
||||||
|
{
|
||||||
|
return beverage.getDescription() ~ ", Whip";
|
||||||
|
}
|
||||||
|
|
||||||
|
override double cost()
|
||||||
|
{
|
||||||
|
return .10 + beverage.cost();
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue