定义:向一个现有的对象添加新的功能,同时又不改变其结构,动态地给一个对象添加一些额外的职责。
个人理解:比如说奶茶吧,它的原料就是奶和茶的融合体(被装饰对象),现在有一个装饰器(可以添加珍珠、布丁、红豆),给被装饰对象装饰一下(添加不同的食材),就变成了新的对象(珍珠奶茶···),但是它的底层奶和茶的底层没有被改变。
UML图解:
优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。
缺点:如果给被装饰类多层装饰,比较复杂。
代码:
用奶茶举例
public class Main {
public static void main(String[] args) {
//只要一杯奶茶,不加任何材料
Component component = new ComponentImpl();
component.createMilkTea();
//来一杯布丁奶茶
Component component2 = new PuddingDecorator(new ComponentImpl());
component2.createMilkTea();
}
}
//被装饰类(主体)的抽象
interface Component {
//生产奶茶
void createMilkTea();
}
//被装饰类的具体实现
class ComponentImpl implements Component{
@Override
public void createMilkTea() {
System.out.println("我在制作奶茶底料");
}
}
//装饰器的抽象类,实现了Component,从外类来扩展Component类的功能
abstract class Decorator implements Component{
Component component;
public Decorator(Component component) {
this.component = component;
}
//重写被装饰类的方法
@Override
public void createMilkTea(){
System.out.println("这是装饰器");
component.createMilkTea();
}
}
//具体的装饰器
class PuddingDecorator extends Decorator{
//添加要装饰的东西
private String material;
//构造方法
public PuddingDecorator(Component component) {
super(component);
}
//具体的方法
@Override
public void createMilkTea() {
super.createMilkTea();
//添加材料
material = "布丁";
System.out.println("我现在是一杯布丁奶茶了");
}
}
总结:装饰器模式使用的场景,多用于动态的添加,动态的撤销,只需要把具体的职责划分好,同时继承装饰者模式即可。
最后感谢:https://blog.csdn.net/zaoan_2010/article/details/83308891 所提供的UML图