代碼實現:
代碼實現:
Drink.java 被裝飾者對象的接口【豆奶繼承該接口 :飲品接口,未來可能還有其它類繼承該接口也是飲品類如汽水】
SoyaBeanMilk.java 具體的被裝飾者對象【豆奶是用下面的:雞蛋、糖、黑豆 來裝飾】
EggDecorator.java 具體裝飾者對象
SugarDecorator.java 具體裝飾者對象
BlackBeanDecorator.java 具體裝飾者對象
Decorator.java 裝飾者基類 【一般定義為抽象類:即具體的裝飾者類(雞蛋、糖、黑豆)分別是繼承它的】
Test.java 測試
Drink.java
//被裝飾者的接口(接口就是基類)
public interface Drink {
float cost(); //計算價格的方法 (接口的抽象方法)
String description(); //返回描述信息的方法(接口的抽象方法)
}
SoyaBeanMilk.java
//具體的被裝飾者類:豆漿類
public class SoyaBeanMilk implements Drink {
@Override
public float cost() { //豆漿繼承Drink接口,必須實現接口的抽象方法
return 10f;
}
@Override
public String description() { //豆漿繼承Drink接口,必須實現接口的抽象方法
return "純豆漿";
}
}
Decorator.java
//裝飾者的基類(是抽象類)
public abstract class Decorator implements Drink {
private Drink drink; //維護一個要裝飾的對象【用到適配器的知識點】
public Decorator(Drink drink) { //通過構造方法傳進來【抽象類可以有構造方法】
this.drink=drink;
}
@Override
public float cost() { //Decorator也是繼承了接口Drink,必須實現接口的方法
return drink.cost();
}
@Override
public String description() { //Decorator也是繼承了接口Drink,必須實現接口的方法
return drink.description();
}
}
SugarDecorator.java
//具體的裝飾者類:糖類
public class SugarDecorator extends Decorator {
public SugarDecorator(Drink drink) { //構造方法;因為父類構造方法傳入了參數,所有子類構造方法要傳入參數時,類型一定是和父類構造的傳參構造一致
super(drink); //用到繼承的概念:必須顯示的調用父類的構造方法,當父類的構造方法有傳參時,無論子類構造有傳參還是無傳參
}
public float cost() { //重寫父類的方法
return super.cost()+1.0f; //super.cost()表示調用父類的方法,即調用Decorator類的cost方法
}
public String description() { //重寫父類的方法
return super.description()+"糖"; //super.description()表示調用父類的方法,即調用Decorator類的cost方法
}
}
BlackBeanDecorator.java
//具體的裝飾者類:黑豆類
public class BlackBeanDecorator extends Decorator {
public BlackBeanDecorator(Drink drink) { //構造方法;因為父類構造方法傳入了參數,所有子類構造方法要傳入參數時,類型一定是和父類構造的傳參構造一致
super(drink); //用到繼承的概念:必須顯示的調用父類的構造方法,當父類的構造方法有傳參時,無論子類構造有傳參還是無傳參
}
public float cost() { //重寫父類的方法
return super.cost()+2.0f; //super.cost()表示調用父類的方法,即調用Decorator類的cost方法
}
public String description() { //重寫父類的方法
return super.description()+"黑豆"; //super.description()表示調用父類的方法,即調用Decorator類的cost方法
}
}
EggDecorator.java
//具體的裝飾者類:雞蛋類
public class EggDecorator extends Decorator {
public EggDecorator(Drink drink) { //構造方法;因為父類構造方法傳入了參數,所有子類構造方法要傳入參數時,類型一定是和父類構造的傳參構造一致
super(drink); //用到繼承的概念:必須顯示的調用父類的構造方法,當父類的構造方法有傳參時,無論子類構造有傳參還是無傳參
}
public float cost() { //重寫父類的方法
return super.cost()+3.0f; //super.cost()表示調用父類的方法,即調用Decorator類的cost方法
}
public String description() { //重寫父類的方法
return super.description()+"雞蛋"; //super.description()表示調用父類的方法,即調用Decorator類的cost方法
}
}
Test.java
public class Test {
public static void main(String[] args) {
// OutputStream out = new FileOutputStream("xxx");
// BufferedOutputStream bos = new BufferedOuputStream(out);
// PrintStream ps = new PrintStream(bos);
// ps.print(...);
Drink drink = new SoyaBeanMilk();
SugarDecorator sugar = new SugarDecorator(drink);
EggDecorator egg = new EggDecorator(sugar);
BlackBeanDecorator black = new BlackBeanDecorator(egg);
System.out.println("你點的豆漿是:"+black.description());
System.out.println("一共花了"+black.cost()+"元");
}
}