如何设计可扩展的Orders类构造函数?餐厅系统项目咨询
餐厅系统Pedido类构造函数优化方案
你原来的实现存在固定参数限制点餐灵活性、空值处理繁琐的问题,下面提供两种贴合业务需求的设计方案:
方案一:分阶段订单设计(匹配“先选餐品,后确认ID和桌号”流程)
先通过ItemPedido类封装单份餐品的ID与数量,再让Pedido类用集合存储餐品项,通过方法实现餐品添加和订单确认,完全支持任意点餐数量:
1. 定义餐品项类
public class ItemPedido { private final int idPrato; private final int quantidade; public ItemPedido(int idPrato, int quantidade) { if (quantidade <= 0) { throw new IllegalArgumentException("数量必须大于0"); } this.idPrato = idPrato; this.quantidade = quantidade; } // 仅提供getter保证数据不可变性 public int getIdPrato() { return idPrato; } public int getQuantidade() { return quantidade; } }
2. 重构Pedido类
import java.util.ArrayList; import java.util.List; public class Pedido { private Integer idPedido; // 未确认时为null private Integer mesa; // 未确认时为null private final List<ItemPedido> itens; // 初始化空订单,用于用户选餐阶段 public Pedido() { this.itens = new ArrayList<>(); } // 支持多次调用,添加任意数量餐品 public void adicionarItem(int idPrato, int quantidade) { itens.add(new ItemPedido(idPrato, quantidade)); } // 用户确认餐品后,设置订单ID和桌号 public void confirmarPedido(int idPedido, int mesa) { if (this.idPedido != null) { throw new IllegalStateException("该订单已确认,不可重复操作"); } if (itens.isEmpty()) { throw new IllegalStateException("订单不能为空,请先添加餐品"); } this.idPedido = idPedido; this.mesa = mesa; } // 返回餐品列表副本,防止外部修改内部数据 public List<ItemPedido> getItens() { return new ArrayList<>(itens); } // 订单信息getter public Integer getIdPedido() { return idPedido; } public Integer getMesa() { return mesa; } }
使用示例
// 1. 用户开始点餐,创建空订单 Pedido pedido = new Pedido(); // 2. 添加任意数量餐品 pedido.adicionarItem(1, 2); // 餐品ID1,数量2 pedido.adicionarItem(3, 1); // 餐品ID3,数量1 pedido.adicionarItem(5, 3); // 餐品ID5,数量3 // 3. 用户确认后,设置订单ID和桌号 pedido.confirmarPedido(1001, 4);
方案二:建造者模式(适合一次性创建已确认的订单)
如果需要直接构建已确认的订单(比如从数据库读取、批量创建订单场景),可以用建造者模式,同样支持任意餐品数量:
重构Pedido类(添加建造者)
import java.util.ArrayList; import java.util.List; public class Pedido { private final int idPedido; private final int mesa; private final List<ItemPedido> itens; // 私有构造,仅允许建造者调用 private Pedido(Builder builder) { this.idPedido = builder.idPedido; this.mesa = builder.mesa; this.itens = new ArrayList<>(builder.itens); } // 静态建造者类 public static class Builder { private int idPedido; private int mesa; private final List<ItemPedido> itens = new ArrayList<>(); public Builder idPedido(int idPedido) { this.idPedido = idPedido; return this; } public Builder mesa(int mesa) { this.mesa = mesa; return this; } public Builder adicionarItem(int idPrato, int quantidade) { this.itens.add(new ItemPedido(idPrato, quantidade)); return this; } // 构建订单时做合法性校验 public Pedido build() { if (itens.isEmpty()) { throw new IllegalStateException("订单不能为空"); } return new Pedido(this); } } // getter方法 public int getIdPedido() { return idPedido; } public int getMesa() { return mesa; } public List<ItemPedido> getItens() { return new ArrayList<>(itens); } }
使用示例
Pedido pedido = new Pedido.Builder() .idPedido(1002) .mesa(6) .adicionarItem(2, 1) .adicionarItem(4, 2) .build();
核心优势
- 彻底摆脱固定参数限制,支持任意数量餐品
- 方案一完美贴合“先选餐、后确认ID和桌号”的业务流程
- 用
ItemPedido封装餐品信息,代码结构清晰,便于后续扩展(比如添加餐品名称、价格等字段) - 内置合法性校验,避免生成无效订单
内容的提问来源于stack exchange,提问作者Eduardo Zaduski
相关产品推荐
相关产品推荐

