装饰模式( Decorator ):动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
模式中的角色:
public abstract class Component {
public abstract void Operation( );
}
- 抽象构建(Component):定义一个抽象接口,用以给这些对象动态地添加职责。
public ConcreteComponent extends Component {
public void Operation( ) {
System.out.println("具体对象的操作");
}
}
- 具体构建(ConcreteComponent):定义一个具体的对象,也可以给这个对象添加一些职责。
public class Decorator extends Component {
protected Component component;
public void Decorate (Component component){
this.component = component;
}
public void Operation(){
if (component != null){
component.Operation();
}
}
}
- 装饰类(Decorator): 装饰抽象类,继承了Component,从外类来扩展Component类的功能。
public class ConcreteDecorator extends Decorator {
private String addedState;
public void Operation(){
addedState = "New State";
System.out.println("具体装饰对象的操作");
}
}
- 具体装饰者(ConcretorDecorator):负责给构建对象添加职责。
如果只有一个 ConcreteComponent 类,没有抽象的 Component 类,那么 Decorator 类可以是 ConcreteComponent 类的子类。
若只有一个 ConcreteDecorator 类,没有必要建立单独的 Decorator,将 Decorator 和 ConcreteDecorator 类的责任合并成一个类。
接下来,看一个具体实例:
Component 类:
public interface Coffee {
public double cost();
}
ConcreteComponent 类:
public class Espresso implements Coffee {
public double cost(){
return 2.5;
}
}
Decorator 类:
public class Dressing implements Coffee {
private Coffee coffee;
public Dressing(Coffee coffee){
this.coffee = coffee;
}
public double cost(){
return coffee.cost();
}
}
ConcretorDecorator 类:
public class Whip extends Dressing {
public Whip(Coffee coffee){
super(coffee);
}
public double cost(){
return super.cost() + 0.1;
}
}
public class Mocha extends Dressing {
public Mocha(Coffee coffee){
super(coffee);
}
public double cost(){
return super.cost() + 0.5;
}
}
装饰模式是为已有功能动态地添加更多功能的一种方式。当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加的代码(新的字段、方法、逻辑)通常装饰了原有类的核心职责或主要行为,增加了主类的复杂度。
这些新加入的东西仅仅是满足一些只在某种特定情况下才会执行的特殊行为的需要。
装饰模式提供了非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这些类包装它所要装饰的对象。因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序的使用装饰功能包装对象。
优点:
- 把类的装饰功能从类中搬移去除,这样可以简化原有的类。
- 有效的将类的核心职责和装饰功能区分开。而且可以去除相关类中重复的装饰逻辑。
需要注意的是:
- 装饰模式的装饰顺序很重要。
- 加密数据、过滤词汇→数据持久化的装饰功能。
- 保证装饰类之间彼此独立。