装璜者模式是一种结构型模式,它对现有的类进行包装,容许向一个现有的对象增加现有的性能,同时又不扭转其构造。
这种模式创立了一个新的装璜器类,用来包装原有的类。并在放弃类签名完整性的状况下提供了额定的性能。
用意:动静地给一个对象增加额定的职责,就新增红能来说,装璜器模式相比于生成子类更加灵便。
次要解决:通常咱们为了减少一个类的性能,常常应用继承的形式,因为继承引入动态代码的特色,并且随着扩大性能的增多,子类会很收缩。
如何应用;在不想减少子类的状况下应用。
如何解决:将具体性能职责进行划分,同时继承装璜者模式。
要害代码: Component类充当形象角色,不负责具体实现。 装璜者类继承和援用Component类,具体扩大类重写父类办法。
有点:装璜类和被装璜类能够独立倒退,不会相互耦合。装璜模式是继承很好的的一个代替模式。
形象组件:
public abstract class Beverage { String description = "Unknow Beverage"; public String getDescription(){ return description; } public abstract double cost();}
形象装璜者类
public abstract class CondimentDecorator extends Beverage { public abstract String getDescription();}
具体组件
public class Espresso extends Beverage{ public Espresso(){ description = "Espresso"; } @Override public double cost() { return 1.99; }}
具体装璜者
public class Mocha extends CondimentDecorator{ Beverage beverage; public Mocha(Beverage beverage){ this.beverage = beverage; } @Override public String getDescription() { return beverage.getDescription() + ", Mocha"; } @Override public double cost() { return 0.20 + beverage.cost(); }}
单元测试
public class MochaTest { @Test public void getDescription() { Beverage beverage = new Espresso(); beverage = new Mocha(beverage); System.out.println(beverage.getDescription()); } @Test public void cost() { Beverage beverage = new Espresso(); beverage = new Mocha(beverage); System.out.println(beverage.cost()); }}
测试后果:
2.19
Espresso, Mocha
装璜者和被装璜者必须是一样的类型,也就是有独特的超类。这是相当要害的中央,所以咱们利用继承来达到类型匹配,而不是利用继承取得“行为”。
装璜者在和组件联合时,就是在退出新的行为。所失去的行为并不是继承自超类,而是由组合对象失去的。
如果依赖继承,那么类的行为只能在编译时动态决定。换句话说,行为不是来自超类,就是来自子类笼罩后的版本。然而利用组合,能够把装璜者混合着用,而且是在“运行时".
因而这样就能够在任何时候,实现新的装璜者减少新的行为。如果依赖继承,每当须要新行为时,还得批改现有的代码。