组合模式(Composite Pattern)
背景介绍:
小胖子不满足于仅卖披萨,他想要提供更多的选择,搭配啤酒和炸鸡。为了方便管理和组织这些不同种类的食品,小胖子决定引入组合模式。
设计模式应用:
组合模式
为了实现披萨、啤酒和炸鸡的组织与管理,小胖子引入了组合模式。他创建了一个统一的食品接口,披萨、啤酒和炸鸡分别作为叶子节点,而套餐(Combo)作为组合节点。这样,小胖子可以将不同种类的食品组合成各种套餐供顾客选择。
代码示例:
import java.util.ArrayList;
import java.util.List;
// 食品接口
interface FoodItem {
double getPrice();
String getDescription();
}
// 叶子节点 - 披萨类
class PizzaLeaf implements FoodItem {
private double price;
private String description;
public PizzaLeaf(double price, String description) {
this.price = price;
this.description = description;
}
@Override
public double getPrice() {
return price;
}
@Override
public String getDescription() {
return description;
}
}
// 叶子节点 - 啤酒类
class BeerLeaf implements FoodItem {
private double price;
private String description;
public BeerLeaf(double price, String description) {
this.price = price;
this.description = description;
}
@Override
public double getPrice() {
return price;
}
@Override
public String getDescription() {
return description;
}
}
// 叶子节点 - 炸鸡类
class FriedChickenLeaf implements FoodItem {
private double price;
private String description;
public FriedChickenLeaf(double price, String description) {
this.price = price;
this.description = description;
}
@Override
public double getPrice() {
return price;
}
@Override
public String getDescription() {
return description;
}
}
// 组合节点 - 套餐类
class Combo implements FoodItem {
private List<FoodItem> items = new ArrayList<>();
public void addItem(FoodItem item) {
items.add(item);
}
@Override
public double getPrice() {
double totalPrice = 0;
for (FoodItem item : items) {
totalPrice += item.getPrice();
}
return totalPrice;
}
@Override
public String getDescription() {
StringBuilder comboDescription = new StringBuilder("Combo包含:\n");
for (FoodItem item : items) {
comboDescription.append("- ").append(item.getDescription()).append("\n");
}
return comboDescription.toString();
}
}
// 客户端
public class CompositePatternExample {
public static void main(String[] args) {
// 创建叶子节点 - 披萨
FoodItem pizza = new PizzaLeaf(25.0, "特色披萨");
// 创建叶子节点 - 啤酒
FoodItem beer = new BeerLeaf(8.0, "冰镇啤酒");
// 创建叶子节点 - 炸鸡
FoodItem friedChicken = new FriedChickenLeaf(18.0, "香辣炸鸡");
// 创建组合节点 - 套餐1
Combo combo1 = new Combo();
combo1.addItem(pizza);
combo1.addItem(beer);
// 创建组合节点 - 套餐2
Combo combo2 = new Combo();
combo2.addItem(pizza);
combo2.addItem(friedChicken);
// 创建组合节点 - 总套餐
Combo totalCombo = new Combo();
totalCombo.addItem(combo1);
totalCombo.addItem(combo2);
// 打印总套餐信息
System.out.println("总套餐信息:");
System.out.println(totalCombo.getDescription());
System.out.println("总价格:" + totalCombo.getPrice() + "元");
}
}
灵活组织食品套餐
在这个例子中,组合模式允许小胖子以一种统一的方式组织和管理不同种类的食品。通过定义食品接口,叶子节点(披萨、啤酒、炸鸡)和组合节点(套餐),小胖子可以创建出多样性的套餐,提供更多选择给顾客。