目的
为了对某个类的功能进行增强
定义
动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活;是一种对象结构型模式。
结构
- component:抽象组件(抽象被装饰者类,约定接口)
- concreteCompnent:具体组件(具体被装饰者,实现抽象组件约定的方法)
- decorator:抽象装饰类,持有被装饰类的引用
- concreteDecorator:具体装饰类,实现对被装饰类功能的增强
demo
component
public interface Component {
//定义被装饰对象的接口
void say();
}
concreteComponent
//具体的会被加强的组件,有简单实现
public class ConcreteComponent implements Component{
@Override
public void say() {
System.out.println("简单实现");
}
}
decorator
//定义抽象装饰类
public class Decorator implements Component {
protected Component component; //定义为protected可以让子类使用
public Decorator(Component component) {
this.component = component;
}
@Override
public void say() {
//委派给组件
component.say();
}
}
concreteDecorator
public class ConcreteDecoratorA extends Decorator {
//父类没有默认构造方法时,子类不会自动生成默认构造方法
public ConcreteDecoratorA(Component component) {
super(component);
}
@Override
public void say() {
component.say();
enhance();
}
public void enhance() {
System.out.println("这是包装A的增强功能");
}
}
public class ConcreteDecoratorB extends Decorator {
public ConcreteDecoratorB(Component component) {
super(component);
}
@Override
public void say() {
component.say();
enhance();
}
public void enhance() {
System.out.println("这是b装饰类的增强");
}
}
public class Client {
public static void main(String[] args) {
Component component = new ConcreteDecoratorA(new ConcreteComponent());
component.say();
Component componentb = new ConcreteDecoratorB(component);
componentb.say();
}
}
优点
- 扩展对象功能相对继承而言更加灵活
- concreteComponent与concreteDecorator可以独立变化无需修改现有代码,符合开闭原则。
缺点
- 会产生较多的装饰类
- 灵活的代价会造成系统复杂,相对继承而言更加难以排错
总结
在不影响其他类的情况下给对象增加新的职责