You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于配料列表通过装饰器模式创建定制PizzaPie对象?

动态创建带指定配料的披萨实现方案

核心思路

用配料名称-装饰器工厂映射表替代冗余的条件判断,通过迭代遍历配料列表,逐层装饰基础披萨对象,实现动态组装。

具体实现

1. 构建配料与装饰器的映射关系

先定义静态映射,把配料名称和对应的装饰器构造逻辑绑定:

// 静态映射表:配料名称 -> 装饰器构造器
private static final Map<String, Function<PizzaPie, PizzaTopper>> TOPPER_FACTORIES = Map.of(
    "onions", Onions::new,
    "pineapple", Pineapple::new
    // 新增配料时只需在这里添加新的键值对
);

2. 实现动态组装方法

编写createPizzaWithUserInput方法,从基础披萨开始,遍历配料列表依次应用装饰器:

public PizzaPie createPizzaWithUserInput(List<String> toppings) {
    PizzaPie basePizza = new PizzaPieImplementation();
    return toppings.stream()
        .map(topping -> TOPPER_FACTORIES.getOrDefault(topping, p -> p)) // 未知配料直接返回原披萨
        .reduce(basePizza, (pizza, topperFactory) -> topperFactory.apply(pizza), (p1, p2) -> p1);
}

如果偏好更直观的循环写法:

public PizzaPie createPizzaWithUserInput(List<String> toppings) {
    PizzaPie pizza = new PizzaPieImplementation();
    for (String topping : toppings) {
        Function<PizzaPie, PizzaTopper> factory = TOPPER_FACTORIES.get(topping);
        if (factory != null) {
            pizza = factory.apply(pizza);
        }
    }
    return pizza;
}

3. 效果验证

当传入List.of("onions", "pineapple")时,最终披萨的输出结果为:

Pie of pizza with onions with pineapple

方案优势

  • 低冗余:彻底消除大量if/else判断,代码结构更简洁
  • 易扩展:新增配料仅需添加装饰器类和映射表条目,无需修改组装逻辑
  • 符合开闭原则:对扩展开放,对修改关闭,后续维护成本低

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:31:03