秒懂设计模式之装饰者模式(Decorator Pattern)_ShuSheng007的博客-CSDN博客
装饰模式是在不必改变原类和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象
假设我们有一个原味咖啡的类 OriginalCoffee, 目前的需求就是要动态的给这个类的一些实例增加一些额外功能,此处就是动态的对某些咖啡制作过程增加新的流程,例如加奶,加糖,而有的咖啡却保持原味不变。

首先我们有一个ICoffee接口,里面有一个制作咖啡的接口方法makeCoffee()。要进行装饰的类 OriginalCoffee 和装饰者基类CoffeeDecorator(一般为抽象类)实现了此接口。
CoffeeDecorator类里面持有一个ICoffee引用,我们第一步会把要装饰那个原始对象赋值给这个引用,那样在装饰者类中才可以调用到那个被装饰的对象的方法。
MilkDecorator 和SugarDecorator 都继承至CoffeeDecorator, 都是具体的装饰者类。
第一步:先声明一个原始对象的接口
- public interface ICoffee {
- void makeCoffee();
- }
第二步:构建我们的原始对象,此处为原味咖啡对象,它实现了ICoffee接口。
-
- public class OriginalCoffee implements ICoffee{
- @Override
- public void makeCoffee() {
- System.out.println("原味咖啡");
- }
- }
第三步:构建装饰者抽象基类,它要实现与原始对象相同的接口ICoffee,其内部持有一个ICoffee类型的引用,用来接收被装饰的对象。
- public abstract class CoffeeDecorator implements ICoffee{
- private ICoffee coffee;
-
- public CoffeeDecorator(ICoffee coffee){
- this.coffee = coffee;
- }
-
- @Override
- public void makeCoffee() {
- coffee.makeCoffee();
- }
- }
第四步:构建各种装饰者类,他们都继承至装饰者基类 CoffeeDecorator。此处生成了两个,一个是加奶的装饰者,另一个是加糖的装饰者。
MilkDecorator
- package milk;
-
- public class MilkDecorator extends CoffeeDecorator{
- public MilkDecorator(ICoffee coffee) {
- super(coffee);
- }
-
- @Override
- public void makeCoffee() {
- super.makeCoffee();
- addMilk();
- }
-
- private void addMilk(){
- System.out.println("加奶");
- }
- }
SugarDecorator
- public class SugarDecorator extends CoffeeDecorator{
- public SugarDecorator(ICoffee coffee) {
- super(coffee);
- }
-
- @Override
- public void makeCoffee() {
- super.makeCoffee();
- addSugar();
- }
-
- private void addSugar(){
- System.out.println("加糖");
- }
- }
第五步:客户端使用
- public static void main(String[] args) {
- // 原味咖啡
- ICoffee coffee = new OriginalCoffee();
- coffee.makeCoffee();
-
- // 加奶的咖啡
- coffee = new MilkDecorator(coffee);
- coffee.makeCoffee();
-
- // 先加奶,后加糖的咖啡
- coffee = new SugarDecorator(coffee);
- coffee.makeCoffee();
-
- }
可以从客户端调用代码看出,装饰者模式的精髓在于动态的给对象增减功能。