Pattern Decorateur:
Beverage->HouseBlend DarkRoast Decaf Espresso
今天我们学习了装修者模式。 根据字面上的意义我们可以想象到,它应该是由一个被装修者和一些个装修者所组成的。事实也是如此,下面我们通过例子来学习吧。
在茶馆(cafétéria),有一些饮品。比如 茶,咖啡。 但是有时候客人需要加一些额外的调味料,比如 糖,牛奶,柠檬等等,这时候就需要在饮品费用的基础上加上这些调味料的费用。 而我们的菜单虽然只有5个项目,但是他们可以有多种不同的组合。 比如 茶,茶加糖,咖啡,咖啡加牛奶,咖啡加牛奶加糖 等等。 在这里 主饮料有且只能有一个(被装饰者),调味料可以有0或多个(装饰者)。
首先我们创建两个基本类(我称之为基本类),就是Boisson(被装饰者) 和 Condiment(装饰者)。 糖或牛奶,必须加在茶或者牛奶里面当成饮品来卖,而不能直接单独卖,所以Condiment 必然也是 Boisson,看代码。
Boisson类,有两个方法,是描述产品和计算价格:
package decorateur;
public interface Boisson {
public String Description();
public int cout();
}
Condiment 类,继承了Boisson 以说明它也是饮品。并且有一个Boisson成员变量,说明它是被加到哪个基饮品:
package decorateur;
public abstract class Condiment implements Boisson {
Boisson b;
public Condiment(Boisson b){
this.b = b;
}
}
cafe 类,继承Boisson,它的价格是3,描述是 “cafe”:
package decorateur;
public class Cafe implements Boisson {
public int cout(){
return 3;
}
public String Description(){
return "Cafe";
}
}
The类,茶的单价是2,描述是“The”,同样继承了Boisson:
package decorateur;
public class The implements Boisson{
public int cout(){
return 2;
}
public String Description(){
return "The";
}
}
AvecLait 类,加了牛奶。它的单价是2,总价是在基饮品的基础上加上自身价格,描述是 在基饮品的基础上说“ 加 牛奶”:
package decorateur;
public class AvecLait extends Condiment {
public AvecLait(Boisson b) {
super(b);
// TODO Auto-generated constructor stub
}
public int cout(){
return b.cout() + 2;
}
public String Description(){
return b.Description().concat(" Avec Lait");
}
}
AvecSure类,加糖。 原理跟加牛奶的一样:
package decorateur;
public class AvecSucre extends Condiment {
public AvecSucre(Boisson b) {
super(b);
// TODO Auto-generated constructor stub
}
public int cout(){
return b.cout()+ 1;
}
public String Description(){
return b.Description().concat(" Avec Sucre");
}
}
AvecMile类,加蜂蜜。:
package decorateur;
public class AvecMile extends Condiment{
public AvecMile(Boisson b) {
super(b);
// TODO Auto-generated constructor stub
}
public int cout(){
return b.cout()+ 3;
}
public String Description(){
return b.Description().concat(" Avec Miel");
}
}
test类,我们来测试一下:
package decorateur;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Boisson b = new The();
System.out.println(b.cout()+b.Description());
Boisson b1 = new AvecSucre(new Cafe());
System.out.println(b1.cout()+b1.Description());
Boisson b2 = new AvecSucre(new The());
System.out.println(b2.cout()+b2.Description());
}
}
Beverage beverage = new AvecLait(new AvecCitron(new The()));
is a sucre(decorateur) qui has a The(decore).