一、需求分析
星巴克咖啡订单项目:
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)考虑使用 装饰者模式;