天天看点

14/11/2014 上课笔记 Pattern Decorator

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).