装饰者模式定义:动态地将责任附加到对象上,如要扩展功能,装饰者提供了比继承更有弹性的替代方案。
在java的io中用的比较多
这里我们以蛋糕为例:
一、我们新建一个Cake接口
package com.kaishengit.decorator; public interface Cake { public float cost(); }
二、新建一个蛋糕类(实现Cake接口)和一个装饰接口(继承Cake接口)
1>蛋糕类:
package com.kaishengit.decorator; public class MilkCake implements Cake{ @Override public float cost() { return 100f; } }
2>装饰接口:
扫描二维码关注公众号,回复:
713422 查看本文章
package com.kaishengit.decorator; public interface CakeDecorator extends Cake{ }
三、新建两个装饰类,实现装饰接口
1>加草莓
package com.kaishengit.decorator; public class Berry implements CakeDecorator{ private Cake cake; public Berry(Cake cake){ this.cake = cake; } @Override public float cost() { float berryPrice = 5f; return cake.cost() + berryPrice; } }
2>加巧克力
package com.kaishengit.decorator; public class Chocolate implements CakeDecorator{ private Cake cake; public Chocolate(Cake cake){ this.cake = cake; } @Override public float cost() { float chocolatePrice = 20f; return cake.cost() + chocolatePrice; } }
四、测试
package com.kaishengit.decorator; public class Test { public static void main(String[] args) { //牛奶蛋糕 MilkCake mc = new MilkCake(); //草莓牛奶蛋糕 Berry b = new Berry(mc); System.out.println("付款:" + b.cost()); //草莓巧克力牛奶蛋糕 Chocolate c = new Chocolate(b); System.out.println("付款:" + c.cost()); } }
运行结果:
付款:105.0
付款:125.0
装饰者模式特点:
1>继承属于扩展形式之一,但并不见得是弹性最好的最佳方式
2>在我们的设计中,应该允许行为可以被扩展,而无需修改现有的代码(开闭原则)
3>除了继承,使用装饰者模式也可以让我们扩展行为
4>装饰者可以在被装饰者的行为前面、后面加上自己的行为,甚至可以将被装饰者的行为取代,而达到特定的目的
5>装饰者模式会导致设计中出现许多小对象,如果过度使用,会让程序变得复杂
ok...