一、需求分析

  星巴克咖啡订单项目:

  1、咖啡种类/单品咖啡:Espresso(意大利咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡);

  2、调料:Milk、Soy(豆浆)、Chocolate;

  3、要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便;

  4、使用 OO 的来计算不同种类咖啡的费用:客户可以点单品咖啡,也可以单品咖啡+调料组合。

  

二、方案一

  

 

   分析:

  (1)Drink 是一个抽象类,表示饮料;

  (2)des 就是对咖啡的描述,比如咖啡的名字;

  (3)cost() 方法就是计算费用,Drink 类中做成一个抽象方法;

  (4)Decaf 就是单品咖啡,继承 Drink,并实现 cost;

  (5)Espress && Milk 就是单品咖啡 + 调料,这个组合情况很多;

  (6)问题:这样设计,会有很多类,当我们增加一个单品咖啡,或者增加一个调料,类的数量就会倍增,就会出现 类爆炸;

 

三、方案二

  

 

   1、分析到方案1因为 咖啡单品 + 调料组合会造成类的倍增,因此可以做改进,将调料内置到 Drink 类,这样就不会造成类数量过多,从而提高项目的维护性;

  2、说明:milk、soy、chocolate 可以设计为 Boolean,表示是否要添加相应的调料。

   分析:

  (1)方案2可以控制类的数量,不至于造成很多的类;

  (2)在增加或者删除调料种类时,代码的维护量很大;

  (3)考虑到用户可以添加多分调料时,可以将 hasMilk 返回一个对应  int 值;

  (4)考虑使用 装饰者模式;

 

posted on 2021-01-23 18:49  格物致知_Tony  阅读(74)  评论(0编辑  收藏  举报