装饰器模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
-
主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。
-
何时使用:在不想增加很多子类的情况下扩展类。
-
优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
-
缺点:多层装饰比较复杂。
-
使用场景:
1、扩展一个类的功能。
2、动态增加功能,动态撤销。
实现
-
类图
-
抽象组件类和具体组件类:
abstract class Component {
public abstract void operation();
}
class ConcreteComponent extends Component {
public void operation(){
System.out.println("ConcreteComponent say");
}
}
- 抽象装饰器类和具体装饰器类:
abstract class Decorator extends Component {
protected Component component;
public Decorator(Component component) {
this.component = component;
}
public void operation(){
component.operation();
}
}
class ConcreteDecoratorA extends Decorator {
public ConcreteDecoratorA(Component component){
super(component);
}
private void operationFirst(){
System.out.println("operationFirst say");
}
private void operationLast(){
System.out.println("operationLast say");
}
public void operation() {
operationFirst();
super.operation();
operationLast();
}
//新功能
public void anotherOperation() {
System.out.println("another operation");
}
}
- 客户端类
public class Client{
public static void main(String[] args){
Component c1 = new ConcreteComponent ();
Decorator decoratorA = new ConcreteDecoratorA(c1);
decoratorA .operation();
System.out.println("------------------------------------------------");
Decorator decoratorBandA = new ConcreteDecoratorA(decoratorA);
decoratorBandA.operation();
}
}
- 运行结果