阅读本文大概需要4分钟
一、什么是装饰者模式
装饰着模式:简单的一句话理解就是,动态的给一个对象添加一些额外的功能,装饰者模式相对于生成子类更加的灵活。
我们来看下装饰者模式的UML图:
二、装饰者模式的构成
- Component(抽象构件):它是装饰类和具体构件的公共父类;
- ConcreteComponent(具体构件):具它是抽象构件对象的子类,用来定义具体的构件对象;
- Decorator(抽象装饰类):进继承抽象构件,用于给具体的构件添加一些新的职责;
- ConcreteDecoraror(具体装饰类):实现了抽象装饰类,它负责向构件添加新的职责;
三、实例演示
业务场景:现我们现在模拟这样一个场景,我们点了一杯奶茶,然后给奶茶中加了冰块,加了珍珠,最后我们还想再给加点红豆,这里加红豆就使用了装饰者。
我们下来创建一个奶茶的抽象类,想到于Component
代码语言:javascript复制public interface MilkyTea {
public void recipe();
}
我们再来创建要给奶茶的具体子类,相当于ConcreteComponent
代码语言:javascript复制public class MilkyTeaA implements MilkyTea {
@Override
public void recipe() {
System.out.println("老板来一杯奶茶,加冰块");
}
}
接下来创建一个装饰类,相当于Decorator
代码语言:javascript复制public class Decorator implements MilkyTea {
private MilkyTea milkyTea;
public void setMilkyTea(MilkyTea milkyTea) {
this.milkyTea = milkyTea;
}
@Override
public void recipe() {
milkyTea.recipe();
}
}
创建装饰类的子类,添加珍珠,相当于ConcreteDecorator
代码语言:javascript复制public class MilkyTeaADecorator extends Decorator {
@Override
public void recipe() {
super.recipe();
recipeZZ();
}
// 加珍珠
public void recipeZZ() {
System.out.println("老板再加点珍珠吧");
}
}
创建装饰者的子类,添加红豆,相当于ConcreteDecorator
代码语言:javascript复制public class MilkyTeaBDecorator extends Decorator {
@Override
public void recipe() {
super.recipe();
recipeHD();
}
public void recipeHD() {
System.out.println("老板你再给加点红豆吧");
}
}
最后我们测试一下看下结果:
代码语言:javascript复制public class Test {
public static void main(String[] args) {
MilkyTeaA milkyTea = new MilkyTeaA();
MilkyTeaADecorator milkyTeaA = new MilkyTeaADecorator();
MilkyTeaBDecorator milkyTeaB = new MilkyTeaBDecorator();
milkyTeaA.setMilkyTea(milkyTea);
milkyTeaB.setMilkyTea(milkyTeaA);
milkyTeaB.recipe();
}
}
四、模式总结
通过这个小例子我们可以发现,装饰者模式是为了已有的功能动态的添加更多功能的一种方式。