在实践生产中,新需求老是不断的出现。咱们能够直接修改已有的组件代码而且添加相应的功能,这显然破坏了已有组件的稳定性,修改完成后,整个组件须要从新测试。违背了开闭原则。设计模式
咱们可使用继承方式,经过建立子类添加新功能实扩展。这种方法是静态的,用户不能控制增长行为的方式和时机。并且有些状况下继承是不可行的,例若有些组件被final修饰。另外,若是待添加的新功能存在多种组合方式 ,会致使大量的子类出现。例若有4个待添加的新功能,系统须要动态使用任意多个功能的组合,则须要添加15个子类才能知足需求。ide
装饰器模式可以帮助咱们解决上述问题。类图以下测试
假如如今有一块蛋糕,其它什么都不加,就是奶油蛋糕。若是加上草莓就是草莓蛋糕,若是加上巧克力,而后插上蜡烛,就变成了一块生日蛋糕了。不管是奶油蛋糕,草莓蛋糕,仍是生日蛋糕,它们的核心都是蛋糕。像这样不断的为对象添加装饰的设计模式被称为Decorator模式。UML 类图以下ui
代码以下this
package decorator; /** * Created by dingshuangkun on 2018/1/27. * 蛋糕接口 */ public interface Cake { /** * 涂抹奶油 */ void makeCream(); /** * 包装 */ void pack(); /** * 生产蛋糕 */ void make(); }
package decorator.imp; import decorator.Cake; /** * Created by dingshuangkun on 2018/1/27.蛋糕 * 奶油蛋糕 */ public class CreamCake implements Cake{ @Override public void makeCream() { System.out.println("-------涂抹奶油-----"); } @Override public void pack() { System.out.println("------包装----------"); } @Override public void make() { makeCream(); pack(); } }
package decorator.imp; import decorator.Cake; /** * Created by dingshuangkun on 2018/1/27. */ public class Decorator implements Cake { private Cake cake; public Decorator(Cake cake) { this.cake = cake; } @Override public void makeCream() { cake.makeCream(); } @Override public void pack() { cake.pack(); } @Override public void make() { cake.make(); } }
package decorator.imp; import decorator.Cake; /** * Created by dingshuangkun on 2018/1/27. */ public class ChocolateCake extends Decorator { public ChocolateCake(Cake cake) { super(cake); } private void addChocolate(){ System.out.println("-----添加巧克力-----"); } @Override public void make() { addChocolate(); } }
package decorator.imp; import decorator.Cake; /** * Created by dingshuangkun on 2018/1/27. * * 水果蛋糕 */ public class FruitCake extends Decorator { public FruitCake(Cake cake) { super(cake); } private void addFruit(){ System.out.println("---添加水果---"); } @Override public void make() { super.makeCream(); addFruit(); } }
package decorator.imp; import decorator.Cake; /** * Created by dingshuangkun on 2018/1/27. * 生日蛋糕 */ public class BirthdayCake extends Decorator { public BirthdayCake(Cake cake) { super(cake); } private void addCandle(){ System.out.println("-----添加蜡烛-------"); } @Override public void make() { addCandle(); super.pack(); } }
package decorator.imp; import decorator.Cake; /** * Created by dingshuangkun on 2018/1/27. */ public class Client { public static void main(String[] args) { Cake cake = new CreamCake(); cake = new Decorator(new FruitCake(cake)); cake.make(); cake = new Decorator(new ChocolateCake(cake)); cake.make(); cake = new Decorator(new BirthdayCake(cake)); cake.make(); } }
运行结果设计
-------涂抹奶油-----
---添加水果---
-----添加巧克力-----
-----添加蜡烛-------
------包装----------code
Process finished with exit code 0
对象