完成裝飾模式的demo,要求:按照自己的理解完成,有註釋.
java實現代碼如下:
詳細見:https://gitee.com/AlphF/homework
1.整體結構
2.運行結果:轉存失敗重新上傳取消
3.部分重點類代碼展示
- 3.1 測試類:Decorator
package homewordTao;
import homewordTao.coffee.MeiShi;
import homewordTao.coffee.Moka;
import homewordTao.coffee.Zuoliao.Mocha;
import homewordTao.coffee.Zuoliao.XiangCao;
import homewordTao.coffee.abstract1.Coffee;
/**
* @author jiangfeng 2018/7/25 16:36
*/
public class Decorator {
/**
* 公司樓下的咖啡吧出售有各種咖啡, 咖啡中可以加不同的配料–摩卡、牛奶、糖、奶泡;或者風味咖啡加香草和抹茶.
*
* 咖啡種類小知識
* [濃縮咖啡] 咖啡鼻祖,是一種具有強烈口感的咖啡類型,發明及發展於意大利. 咖啡的風味濃縮後,口感尤爲強烈.濃縮咖啡常作爲其他風味調製咖啡的基礎,如摩卡,拿鐵,瑪奇朵等
* [美式咖啡] 就是加了水的意式濃縮
* [卡布奇諾] 是三分之一濃縮咖啡,三分之一蒸汽牛奶和三分之一泡沫牛奶,卡布奇諾是一種泡沫咖啡.
* [馬琪雅朵] 在濃縮中加上兩大勺綿密的奶泡就做好了一杯馬琪雅朵.
* [拿鐵咖啡] 是由一小杯濃縮和一杯牛奶製作而成,比卡布奇諾多了鮮奶味道,味道也更香醇。
* [摩卡咖啡] 摩卡通常是由三分之一的意式濃縮和三分之二的奶泡配成,再加入少許巧克力,通常會以巧克力糖漿加入)因爲有巧克力和牛奶的關係,摩卡的味道稍甜
* [白咖啡] 白咖啡採用特級脫脂奶精原料將咖啡的苦酸和咖啡因含量降到最低,不傷胃,口感絲滑,香濃,不帶一絲苦澀。
*/
public static void main(String[] args) {
// 1. 美式加抹茶
Coffee coffee = new MeiShi();
System.out.println(coffee.getDesc()+" 價格:"+coffee.price());
coffee = new Mocha(coffee);
System.out.println(coffee.getDesc()+" 價格:"+coffee.price());
// 2.摩卡加抹茶加香草
Coffee coffee2 = new Moka();
System.out.println(coffee2.getDesc()+" 價格:"+coffee2.price());
coffee2 = new Mocha(coffee2);
coffee2 = new XiangCao(coffee2);
System.out.println(coffee2.getDesc()+" 價格:"+coffee2.price());
}
}
- 3.2 抽象父類: Coffee
package homewordTao.coffee.abstract1;
/**
* @author jiangfeng 2018/7/25 17:41
* 父類咖啡
*/
public abstract class Coffee {
public String desc = "我是咖啡鼻祖:意式濃縮咖啡!";
public String getDesc() {
return desc;
}
public abstract double price();
}
- 3.3 子類:美式咖啡
package homewordTao.coffee;
import homewordTao.coffee.abstract1.Coffee;
/**
* @author jiangfeng 2018/7/25 18:10
* 子類美式咖啡,繼承抽象父類咖啡
*/
public class MeiShi extends Coffee {
public MeiShi() {
desc = "美式";
}
@Override
public double price() {
return 20.00d;
}
}
- 3.4 子類:香草
package homewordTao.coffee.Zuoliao;
import homewordTao.coffee.abstract1.Coffee;
import homewordTao.coffee.abstract1.Zuoliao;
/**
* @author jiangfeng 2018/7/25 18:28
* 子類香草,繼承抽象父類佐料
*/
public class XiangCao extends Zuoliao {
private Coffee coffee;
public XiangCao(Coffee coffee){
this.coffee = coffee;
}
@Override
public String getDesc() {
return coffee.getDesc() + ", 加香草";
}
@Override
public double price() {
return coffee.price() + 6;
}
}
4.裝飾器模式和代理模式的區別
裝飾器模式是使用的調用者從外部傳入的被裝飾對象(coffee),調用者只想要你把他給你的對象裝飾(加強)一下。而代理模式使用的是代理對象在自己的構造方法裏面new的一個被代理的對象,不是調用者傳入的。調用者不知道你找了其他人,他也不關心這些事,只要你把事情做對了即可