装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时不改变其结构。它是一种结构型设计模式。以下是一些装饰器模式的应用场景:
- 扩展对象的功能:当需要为一个对象动态地添加一些额外的功能时,可以使用装饰器模式。这些功能可以独立地添加或删除,而不会影响到原始对象的代码。
- 处理不同类型的职责:如果一个对象需要承担多种不同类型的职责,而这些职责可以独立地变化,那么可以使用装饰器模式将这些职责分离出来,每个职责作为一个装饰器。
- 增强现有类的功能:当需要在不修改现有类的情况下,增强其功能时,可以使用装饰器模式。
以下是一个简单的装饰器模式的 Java 代码示例:
// 组件接口
interface Component {
void operation();
}
// 具体组件
class ConcreteComponent implements Component {
@Override
public void operation() {
System.out.println("执行具体组件的操作");
}
}
// 装饰器抽象类
abstract class Decorator implements Component {
protected Component component;
public Decorator(Component component) {
this.component = component;
}
@Override
public void operation() {
component.operation();
}
}
// 具体装饰器 A
class ConcreteDecoratorA extends Decorator {
public ConcreteDecoratorA(Component component) {
super(component);
}
@Override
public void operation() {
super.operation();
System.out.println("执行具体装饰器 A 的额外操作");
}
}
// 具体装饰器 B
class ConcreteDecoratorB extends Decorator {
public ConcreteDecoratorB(Component component) {
super(component);
}
@Override
public void operation() {
super.operation();
System.out.println("执行具体装饰器 B 的额外操作");
}
}
public class DecoratorPatternExample {
public static void main(String[] args) {
Component component = new ConcreteComponent();
Component decoratedComponentA = new ConcreteDecoratorA(component);
Component decoratedComponentB = new ConcreteDecoratorB(decoratedComponentA);
decoratedComponentB.operation();
}
}
在上述代码中,我们定义了一个Component
接口,ConcreteComponent
类实现了这个接口。Decorator
类是一个抽象装饰器类,它也实现了Component
接口,并持有一个Component
对象的引用。ConcreteDecoratorA
和ConcreteDecoratorB
类是具体的装饰器类,它们分别扩展了Decorator
类,并在operation
方法中添加了自己的额外操作。在main
方法中,我们首先创建了一个ConcreteComponent
对象,然后使用ConcreteDecoratorA
和ConcreteDecoratorB
对其进行装饰,并调用装饰后的对象的operation
方法。
然后我就在想,我直接用一个类去继承上面的组件类,然后比如重写operation方法,在该方法中调用super.operation()方法不就可以,后面想想如果直接继承的话,会把父类中所有方法都继承了,所以这种想法不可取。