小胖子的Java设计模式-组合模式

组合模式(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() + "元");
    }
}
灵活组织食品套餐

在这个例子中,组合模式允许小胖子以一种统一的方式组织和管理不同种类的食品。通过定义食品接口,叶子节点(披萨、啤酒、炸鸡)和组合节点(套餐),小胖子可以创建出多样性的套餐,提供更多选择给顾客。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值