共计 1527 个字符,预计需要花费 4 分钟才能阅读完成。
装璜者模式是一种结构型模式,它对现有的类进行包装,容许向一个现有的对象增加现有的性能,同时又不扭转其构造。
这种模式创立了一个新的装璜器类,用来包装原有的类。并在放弃类签名完整性的状况下提供了额定的性能。
用意:动静地给一个对象增加额定的职责,就新增红能来说,装璜器模式相比于生成子类更加灵便。
次要解决:通常咱们为了减少一个类的性能,常常应用继承的形式,因为继承引入动态代码的特色,并且随着扩大性能的增多,子类会很收缩。
如何应用; 在不想减少子类的状况下应用。
如何解决:将具体性能职责进行划分,同时继承装璜者模式。
要害代码: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
装璜者和被装璜者必须是一样的类型,也就是有独特的超类。这是相当要害的中央,所以咱们利用继承来达到类型匹配,而不是利用继承取得“行为”。
装璜者在和组件联合时,就是在退出新的行为。所失去的行为并不是继承自超类,而是由组合对象失去的。
如果依赖继承,那么类的行为只能在编译时动态决定。换句话说,行为不是来自超类,就是来自子类笼罩后的版本。然而利用组合,能够把装璜者混合着用,而且是在“运行时 ”.
因而这样就能够在任何时候,实现新的装璜者减少新的行为。如果依赖继承,每当须要新行为时,还得批改现有的代码。
正文完