概念
在不改变原类文件和也不使用继承的情况下,动态地扩展一个类的功能。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,为用户提供额外的功能。
优点:
- 装饰类和被装饰类可以独立发展,不会相互耦合。
- 装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点:
- 多层装饰比较复杂。
用例
public class ClientOne {
public static void main(String[] args) {
Sourceable source = new Source();
System.out.println("before decorator");
source.method();
System.out.println("after decorator");
Sourceable decorator = new Decorator(source);
decorator.method();
}
}
interface Sourceable {
void method();
}
//被装饰类
class Source implements Sourceable {
@Override
public void method() {
System.out.println("Original method()");
}
}
//装饰类
class Decorator implements Sourceable {
private Sourceable source;
public Decorator(Sourceable source){
this.source = source;
}
@Override
public void method(){
source.method();
addBehavior();
}
public void addBehavior() {
System.out.println("Extend addBehavior()");
}
}
Output:
before decorator
Original method()
after decorator
Original method()
Extend addBehavior()
或者:将装饰器类Decorator设置为abstract类型,然后创建抽象装饰器的实现类。
public class ClientOne {
public static void main(String[] args) {
Component component = new ConcreteComponent();
System.out.println("before decorator");
component.operation();
System.out.println("after decorator");
Component decorator = new ConcreteDecoratorA(component);
decorator.operation();
}
}
// Component: 抽象构件
interface Component {
void operation();
}
// ConcreteComponent: 具体构件,被装饰类
class ConcreteComponent implements Component {
@Override
public void operation() {
System.out.println("Original method()");
}
}
// Decorator: 抽象装饰类
abstract class Decorator implements Component {
protected Component component;
public Decorator(Component component){
this.component = component;
}
@Override
public void operation(){
component.operation();
}
}
// ConcreteDecorator: 具体装饰类
class ConcreteDecoratorA extends Decorator {
public ConcreteDecoratorA(Component component) {
super(component);
}
@Override
public void operation(){
component.operation();
addBehavior();
}
public void addBehavior() {
System.out.println("Extend addBehavior()");
}
}
Output:
before decorator
Original method()
after decorator
Original method()
Extend addBehavior()