属于结构型模式,装饰模式就是动态的给一个对象增加一些功能。
要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。
java的IO流的实现就是装饰模式。可以轻松的把一种流装饰成为另一种流。
举个例子:计算牛奶的价格。 纯牛奶3.0元。加糖1.0元,加食用颜料2.0元。等等。
我们需要根据顾客点的内容,动态的计算价格。下面看代码:(借用了一个很流行的例子)
package com.pattern.struct.decorator;
public interface Milk {
public float price();
}
package com.pattern.struct.decorator;
public class PureMilk implements Milk {//纯牛奶
@Override
public float price() {
return 3.0f;
}
}
package com.pattern.struct.decorator;
public class Decorator implements Milk {
private Milk milk;
public Decorator(Milk milk){
this.milk = milk;
}
@Override
public float price() {
return this.milk.price();
}
}
package com.pattern.struct.decorator;
public class ColorDecorator extends Decorator {//颜料
public ColorDecorator(Milk milk){
super(milk);
}
@Override
public float price() {
return super.price()+2.0f;
}
}
package com.pattern.struct.decorator;
public class SugarDecotator extends Decorator{//糖
public SugarDecotator(Milk milk){
super(milk);
}
@Override
public float price() {
return super.price()+1.0f;
}
}
package com.pattern.struct.decorator;
public class Client {
public static void main(String[] args) {
Milk milk = new SugarDecotator(new ColorDecorator(new PureMilk()));//是不是很像 IO流
float price = milk.price();
System.out.println("一共"+price+"元");
}
}