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

如何设计可扩展的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 20:21:04