装饰模式:动态的给一个对象添加一些额外的功能,就增加功能来说,装饰模式比生成子类更为灵活。装饰模式是一种结构型模式。是一种对象结构型模式。
使用继承机制是添加功能的一种有效途径。
装饰模式的参与者:抽象构件类(Component),具体构件类(ConcreteComponent),装饰抽象类(Decorator),具体装饰类(ConcreteDecorator)。
抽象构件类(Component):定义一个对象接口,可以给这个接口动态的添加职责。
具体构件类(ConcreteComponent):定义一个对象,可以给这个对象添加一些职责。
装饰抽象类(Decorator):持有一个指向Component对象的指针,并定义了一个与Component接口一致的接口。
具体装饰类(ConcreteDecorator):负责给Component添加职能。
Component类:
public interface Component{
void sampelOperation();
}
ConcreteComponent类:
public class ConcreteComponent implements Component{
public ConcreteComponent (){
//构造函数
}
public void sampelOperation(){
}
Decorator类
public abstract class Decorator implements Component{
private Component component;
public Decorator (Component component){
this.component=component;
}
public abstract void Decorator();
public void sampelOperation(){
//重写
}
}
ConcreteDecorator类
使用装饰模式应该注意:
(1)接口的一致性。装饰对象的接口必须与它所装饰的对象的接口是一致的。因此所有的ConcreteDecorator必须有一个公共的父类。
(2)当只需增加一项功能时,没必要定义抽象的Decorator类,可以省略它。
(3)保持Component的简单性,为了保证接口的一致性,装饰的类和被装饰的类必须有一个公共的Component类。它应集中定义接口而不是存储数据。对数据表示的定义应该延迟到子类去实现。否则Component会过于庞大和复杂,而难以大量使用。
(4)Decorator模式只是改变对象的外壳,并不改变内核。改变内核一般使用策略模式。
在以下情况下使用装饰模式:
(1)需要扩展一个类的功能,或给一个类添加附加责任。
(2)需要动态给一个对象的添加附加功能,这些功能可以撤销。
(3)需要增加由一些基本功能排列组合产生非常强大的功能,而使用继承关系不能实现。
public class ConcreteDecorator extends Decorator{
private Component component;
public ConcreteDecorator (Component component){
super(component);
}
public void Decorator(){
//添加的功能写在这里
}
public void sampelOperation(){
//重写,在这里也可以添加功能
}
}
装饰模式呈链状。如:假设有具体的三个装饰类:Decorator1,Decorator2,Decorator3.
则可写成:new Decorator1(
new Decorator2(
new Decorator3(
new ConcreteComponent)))
//重写
}