如何基于配料列表通过装饰器模式创建定制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
相关产品推荐
相关产品推荐

