设计模式之 - 装饰者模式

一、什么是装饰者模式

 

装饰着模式:简单的一句话理解就是,动态的给一个对象添加一些额外的功能,装饰者模式相对于生成子类更加的灵活。

 

我们来看下装饰者模式的UML图:

 

 

二、装饰者模式的构成

 

  • Component(抽象构件):它是装饰类和具体构件的公共父类;

  • ConcreteComponent(具体构件):具它是抽象构件对象的子类,用来定义具体的构件对象;

  • Decorator(抽象装饰类):进继承抽象构件,用于给具体的构件添加一些新的职责;

  • ConcreteDecoraror(具体装饰类):实现了抽象装饰类,它负责向构件添加新的职责;

 

三、实例演示

业务场景:现我们现在模拟这样一个场景,我们点了一杯奶茶,然后给奶茶中加了冰块,加了珍珠,最后我们还想再给加点红豆,这里加红豆就使用了装饰者。

 

我们下来创建一个奶茶的抽象类,想到于Component

public interface MilkyTea {

   public void recipe();
}

 

我们再来创建要给奶茶的具体子类,相当于ConcreteComponent

public class MilkyTeaA implements MilkyTea {
   
   @Override
   public void recipe() {

       System.out.println("老板来一杯奶茶,加冰块");
   }
}

 

接下来创建一个装饰类,相当于Decorator

public class Decorator implements MilkyTea {

   private MilkyTea milkyTea;

   public void setMilkyTea(MilkyTea milkyTea) {

       this.milkyTea = milkyTea;
   }

   @Override
   public void recipe() {

       milkyTea.recipe();
   }
}


创建装饰类的子类,添加珍珠,相当于ConcreteDecorator

public class MilkyTeaADecorator extends Decorator {

   @Override
   public void recipe() {
       super.recipe();
       recipeZZ();
   }

   // 加珍珠
   public void recipeZZ() {

       System.out.println("老板再加点珍珠吧");
   }
}

 

创建装饰者的子类,添加红豆,相当于ConcreteDecorator

public class MilkyTeaBDecorator extends Decorator {

   @Override
   public void recipe() {

       super.recipe();
       recipeHD();
   }

   public void recipeHD() {

       System.out.println("老板你再给加点红豆吧");
   }
}

 

最后我们测试一下看下结果:

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();
   }
}

 

 

 

四、模式总结

通过这个小例子我们可以发现,装饰者模式是为了已有的功能动态的添加更多功能的一种方式。

 

装饰模式的优点:把类中的装饰功能从类中搬移去除,这样可以简化原有的类;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值