初步想法
想法2
装饰者模式
定义
- 装饰者模式: 动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)
- 这里提到的动态的将新功能附加到对象和ocp原则,在后面的应用实例上会以代码的形式体现,请同学们注意体会。
改进星巴克
Drink.java
public abstract class Drink {
public String des;
private float price= 0.0f;
//计算费用
public abstract float cost() ;
public String getDes() {
return des+" "+price;
}
public void setDes(String des) {
this.des = des;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
Coffee.java
public class Coffee extends Drink {
@Override
public float cost() {
return super.getPrice();
}
}
Espresso.java
public class Espresso extends Coffee {
public Espresso() {
setDes("意大利咖啡");
setPrice(6);
}
}
LongBlack.java
public class LongBlack extends Coffee {
public LongBlack() {
setDes("LongBlack");
setPrice(8);
}
}
ShortBlack .java
public class ShortBlack extends Coffee {
public ShortBlack() {
setDes("ShortBlack");
setPrice(5);
}
}
Decorator.java
public class Decorator extends Drink {
private Drink obj;
public Decorator(Drink obj) {
this.obj = obj;
}
@Override
public float cost() {
return super.getPrice() + obj.cost();
}
@Override
public String getDes() {
return super.getDes() + "\n" + obj.getDes() ;
}
}
milk.java
public class milk extends Decorator {
public milk(Drink obj) {
super(obj);
setDes("牛奶");
setPrice(2.0f);
}
}
Soy.java
public class Soy extends Decorator {
public Soy(Drink obj) {
super(obj);
setDes("豆浆");
setPrice(1.0f);
}
}
Chocolate.java
//调味
public class Chocolate extends Decorator {
public Chocolate(Drink obj) {
super(obj);
setDes("巧克力");
setPrice(3.0f);
}
}
CoffeeBar.java
public class CoffeeBar {
public static void main(String[] args) {
//2巧克力 1牛奶 LongBlack
// LongBlack
Drink order = new LongBlack();
System.out.println("费用1:" + order.cost() + "\n" + order.getDes());
//1牛奶 LongBlack
order = new milk(order);
System.out.println("费用2:" + order.cost() + "\n" + order.getDes());
//1巧克力 1牛奶 LongBlack
order = new Chocolate(order);
System.out.println("费用3:" + order.cost() + "\n" + order.getDes());
//2巧克力 1牛奶 LongBlack
order = new Chocolate(order);
System.out.println("费用4:" + order.cost() + "\n" + order.getDes());
}
}
装饰者模式在JDK应用的源码分析
Java的I0结构,FilterInputStream就是 --个装饰者
InputStream
是抽象类,类似我们前面讲的Drink
FileInputStream
是InputStream
子类,类似我们前面的DeCaf, LongBlack
FilterInputStream
类继承InputStream
类的同时,还有父类对象;类似我们前面的Decorator修饰者
DataInputStream
是FilterInputStream
子类,具体的修饰者,类似前面的Milk
分析得出在jdk的io体系中,就是使用装饰者模式