装饰者模式
定义
装饰者模式:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp)。
类图实例
代码实例
Drink 抽象类
public abstract class Drink {
public String des; //描述
private float price=0.0f;
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
//计算费用的抽象方法
public abstract float cost();
}
Coffee类继承了Drink并重写cost方法。
public class Coffee extends Drink{
@Override
public float cost() {
return super.getPrice();
}
}
Espresso 类继承Coffee
public class Espresso extends Coffee {
public Espresso(){
setDes("意大利咖啡");
setPrice(6.0f);
}
}
LongBlack 类继承Coffee
public class LongBlack extends Coffee {
public LongBlack(){
setDes("longBlack");
setPrice(5.0f);
}
}
ShortBlack 类继承Coffee
public class ShortBlack extends Coffee{
public ShortBlack(){
setDes("ShortBlack");
setPrice(4.0f);
}
}
Decorator 装饰者
public class Decorator extends Drink {
private Drink obj = null;
public Decorator(Drink obj) {
this.obj = obj;
}
@Override
public float cost() {
return super.getPrice() + obj.cost();
}
@Override
public String getDes() {
return super.des + " " + super.getPrice() + " && " + obj.getDes();
}
}
Milk类
public class Milk extends Decorator {
public Milk(Drink obj) {
super(obj);
setDes("牛奶");
setPrice(2.0f);
}
}
Soy 类
public class Soy extends Decorator {
public Soy(Drink obj) {
super(obj);
setDes("豆浆");
setPrice(1.5f);
}
}
Chocolate 类
public class Chocolate extends Decorator {
public Chocolate(Drink obj) {
super(obj);
setDes("巧克力");
setPrice(3.0f);
}
}
装饰者模式在JDK应用的源码分析
FilterInputStream的结构图
源码分析:
编写测试用例:
点击FileInputStream 可查看到该类继承了InputStream,InputStream包含众多子类。
InputSteam包含众多子类。
InputStream本身是一个抽象类。
FilterInputSteam继承InputStream作为一个装饰者,DataInputStream是一个具体的修饰者。
FilterInputSteam类中有 protected volatile InputStream in 即 含有被装饰者
DataInputStream通过构造器向上转型。