[设计模式] 浅谈装饰模式
装饰模式
模式功能说明:它可以让你动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性。
模式思路与原理
装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件,这样它可以装饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰者之上,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被装饰者的方法实现,从而也保留了被装饰者的功能。
案例
// Component组件 -> Pizza接口
public interface Pizza {
String getDescription();
double getCost();
}
// ConcreteComponent具体组件 -> BasicPizza实现类
public class BasicPizza implements Pizza {
@Override
public String getDescription() {
return "Basic Pizza";
}
@Override
public double getCost() {
return 5.0;
}
}
// Decorator装饰者 - > CheeseDecorator
public class CheeseDecorator implements Pizza {
private Pizza pizza;
public CheeseDecorator(Pizza pizza) {
this.pizza = pizza;
}
@Override
public String getDescription() {
return pizza.getDescription() + ", Cheese";
}
@Override
public double getCost() {
return pizza.getCost() + 1.5;
}
}
// Decorator装饰者 - > TomatoSauceDecorator
public class TomatoSauceDecorator implements Pizza {
private Pizza pizza;
public TomatoSauceDecorator(Pizza pizza) {
this.pizza = pizza;
}
@Override
public String getDescription() {
return pizza.getDescription() + ", Tomato Sauce";
}
@Override
public double getCost() {
return pizza.getCost() + 0.5;
}
}
我们可以通过装饰者为Pizza添加新的行为,而无需修改Pizza接口或BasicPizza类。
总结
装饰模式的主要原则是开闭原则,即对扩展开放,对修改关闭。在装饰模式中,我们可以通过创建新的装饰类来增加新的行为,而无需修改现有的类。
装饰者和被装饰者之间必须是一样的类型,也就是要有共同的超类。在这里应用继承并不是实现方法的复制,而是实现类型的匹配。因为装饰者和被装饰者是同一个类型,因此装饰者可以取代被装饰者,这样就使被装饰者拥有了装饰者独有的行为。根据装饰者模式的理念,我们可以在任何时候,实现新的装饰者增加新的行为。