完成装饰模式的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的一个被代理的对象,不是调用者传入的。调用者不知道你找了其他人,他也不关心这些事,只要你把事情做对了即可