装饰模式

来源:互联网 发布:silverlight mac 编辑:程序博客网 时间:2024/04/28 07:24
/**
 * @(#)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());
}
}


原创粉丝点击