属于结构型模式,装饰模式就是动态的给一个对象增加一些功能。
要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。
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+"元"); } }