/**
* @(#)store.java
*这是headfirst中的讲装饰模式的例子
*用不同的原料(比如mocka来丰富(装饰)咖啡)
*特别注意:抽象类可以有自己的构造函数,但不能显示的调用,可以用子类调用它
*若将Beverage类的price()函数改为普通函数,同样可以实现多态,所以多态不需要虚函数
* @author
* @version 1.00 2008/9/25
*/
abstract class Beverage {//饮料类
public Beverage() {
}
public void description(){//对饮料的描述
System.out.println("饮料的父类!");
}
abstract public double price();
}
abstract class decorate extends Beverage{//裝飾著類,跟飲料類是同一類型
Beverage beverage;
public decorate(Beverage beverage){//装饰者父类的带参构造函数
this.beverage=beverage;
System.out.println("这里是decorate类");
}
public void description(){//对饮料的描述
System.out.println("装饰的父类!");
}
}
class mocha extends decorate{//裝飾著類的子類
public mocha(Beverage beverage){
super(beverage);//在这类调用父类的带参构造函数
System.out.println("这里是mocha类");
}
public double price(){
return 0.20+beverage.price();
}
}
class Espresso extends Beverage{//濃縮咖啡類,繼承自飲料
public void description(){
System.out.println("浓缩咖啡!");
}
public double price(){
return 1.99;
}
}
class HouseBlend extends Beverage{//綜合咖啡,繼承自飲料
public void description(){
System.out.println("综合咖啡");
}
public double price(){
return 0.89;
}
}
public class store //主類
{
public static void main(String argv[]){
System.out.println("Welcome to StarBuzz!");
Espresso espresso=new Espresso();//濃縮咖啡的實例
System.out.println(espresso.price());
HouseBlend hb=new HouseBlend();//
mocha mo=new mocha(espresso);//用摩卡類來裝飾濃縮咖啡
mo=new mocha(mo);//再次裝飾
System.out.println(mo.price());
}
}