设计餐厅管理系统

2022-05-01  本文已影响0人  放开那个BUG

1、前言

餐厅管理系统,主体是 Restaurant,然后输入是 Party,输出是 Table。

2、设计

除此之外,还有 Meal,记录菜品和价格。Reservation 记录预定的信息。如果去掉 Reservation,那么餐厅不支持预定。如果支持预定,Table 需要记录 Reservation。关于预定,需要提供 search、confirm、cancel 三个方法。

类图如下:


类图

3、代码

Meal:

public class Meal {

    /**
     * 菜品名称
     */
    private String name;

    /**
     * 菜品价格
     */
    private int price;

    public Meal(String name, int price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }
}

Order:

public class Order {

    /**
     * 吃饭的团体
     */
    private Party party;

    /**
     * 占用的桌子
     */
    private Table table;

    /**
     * 点的菜
     */
    private List<Meal> meals;

    public Order(Party party, Table table, List<Meal> meals) {
        this.party = party;
        this.table = table;
        this.meals = meals;
    }

    /**
     * 获取此次订单的花费
     * @return
     */
    public int getBill(){
        int costMoney = 0;
        for (Meal meal : this.getMeals()) {
            costMoney += meal.getPrice();
        }
        return costMoney;
    }

    public Party getParty() {
        return party;
    }

    public void setParty(Party party) {
        this.party = party;
    }

    public Table getTable() {
        return table;
    }

    public void setTable(Table table) {
        this.table = table;
    }

    public List<Meal> getMeals() {
        return meals;
    }

    public void setMeals(List<Meal> meals) {
        this.meals = meals;
    }
}

``

Party:
```java
public class Party {

    /**
     * 人数
     */
    private int size;

    public Party(int size) {
        this.size = size;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }
}

Reservation:

public class Reservation {

    /**
     * 要预定的桌子
     */
    private Table table;


    /**
     * 要预定的时间范围,这里就不做检验了,一般来说会做一个时间间隔校验
     */
    private TimePeroid timePeroid;

    public Reservation(Table table, TimePeroid timePeroid) {
        this.table = table;
        this.timePeroid = timePeroid;
    }

    /**
     * 当前时间是否在范围内
     * @param date
     * @return
     */
    public boolean containsCurrentDate(Date date) {
        return date.after(timePeroid.getReserveStartTime()) && date.before(timePeroid.getReserveEndTime());
    }

    @Override
    public boolean equals(Object o) {
        Reservation that = (Reservation) o;
        return this.timePeroid.equals(that);
    }

    public Table getTable() {
        return table;
    }

    public void setTable(Table table) {
        this.table = table;
    }

    public TimePeroid getTimePeroid() {
        return timePeroid;
    }

    public void setTimePeroid(TimePeroid timePeroid) {
        this.timePeroid = timePeroid;
    }
}

Table:

public class Table implements Comparable<Table>{

    /**
     * 桌子能容纳的人数
     */
    private int capacity;

    /**
     * 是否可用
     */
    private boolean avaliable;

    /**
     * 编号
     */
    private int No;

    /**
     * 预定区间
     */
    private List<Reservation> reservations;

    public Table(int No, int capacity) {
        this.No = No;
        this.capacity = capacity;
        this.avaliable = true;
        this.reservations = new ArrayList<>();
    }

    /**
     * 当前桌子是否可用
     * @param party
     * @return
     */
    public boolean isAvaliable(Party party){
        return avaliable && capacity >= party.getSize() && this.noReservation(new Date());
    }

    /**
     * 标记桌子不可用
     */
    public void markUnAvaliable() {
        this.avaliable = false;
    }

    /**
     * 标记桌子可用
     */
    public void markAvaliable() {
        this.avaliable = true;
    }

    /**
     * 当前时间是否在预定区间
     * @param date
     * @return
     */
    private boolean noReservation(Date date) {
        for (Reservation reservation : reservations) {
            if(reservation.containsCurrentDate(date)){
                return false;
            }
        }
        return true;
    }

    public int getCapacity() {
        return capacity;
    }

    public void setCapacity(int capacity) {
        this.capacity = capacity;
    }

    public int getNo() {
        return No;
    }

    public void setNo(int no) {
        No = no;
    }

    public List<Reservation> getReservations() {
        return reservations;
    }

    public void setReservations(List<Reservation> reservations) {
        this.reservations = reservations;
    }

    @Override
    public int compareTo(Table o) {
        return this.capacity - o.capacity;
    }
}

TimePeroid:

public class TimePeroid {

    private Date reserveStartTime;

    private Date reserveEndTime;

    public TimePeroid(Date reserveStartTime, Date reserveEndTime) {
        this.reserveStartTime = reserveStartTime;
        this.reserveEndTime = reserveEndTime;
    }

    @Override
    public boolean equals(Object o) {
        TimePeroid that = (TimePeroid) o;
        return this.reserveStartTime.equals(that.reserveStartTime)
                && this.reserveEndTime.equals(that.reserveEndTime);
    }


    public Date getReserveStartTime() {
        return reserveStartTime;
    }

    public void setReserveStartTime(Date reserveStartTime) {
        this.reserveStartTime = reserveStartTime;
    }

    public Date getReserveEndTime() {
        return reserveEndTime;
    }

    public void setReserveEndTime(Date reserveEndTime) {
        this.reserveEndTime = reserveEndTime;
    }
}

Restaurant:

public class Restaurant {

    /**
     * 拥有的桌子,按容量从小到大排序
     */
    private List<Table> tables;

    /**
     * 饭店的菜单
     */
    private List<Meal> meals;

    public Restaurant() {
        this.tables = new ArrayList<>();
        this.meals = new ArrayList<>();

        Random random = new Random();
        for(int i = 1; i <= 4; i++){
            this.tables.add(new Table(i, random.nextInt(3) + 3));
        }
        Collections.sort(this.tables);

        for(int i = 1; i <= 10; i++){
            this.meals.add(new Meal("公保鸡丁_" + i, i));
        }
    }

    /**
     * 找到相应的 table
     * @param party
     * @return
     */
    public Table findTable(Party party){
        for (Table table : this.tables) {
            if(table.isAvaliable(party)){
                return table;
            }
        }
        return null;
    }

    /**
     * 在当前桌子下单
     * @param order
     */
    public void takeOrder(Order order){
        order.getTable().markUnAvaliable();
    }

    /**
     * 对当前订单结算
     * @param order
     */
    public void checkOut(Order order){
        System.out.println("花费了:" + order.getBill());
        order.getTable().markAvaliable();
    }

    // 后面的都是为预定服务的
    public Reservation findTableForReversation(Party party, TimePeroid timePeroid) throws Exception {
        if(timePeroid.getReserveStartTime().after(timePeroid.getReserveEndTime())){
            throw new Exception("时间区间不合法");
        }
        for (Table table : this.tables) {
            if(table.isAvaliable(party)){
                Reservation reservation = new Reservation(table, timePeroid);
                table.getReservations().add(reservation);
                return reservation;
            }
        }
        return null;
    }

    /**
     * 确认订购
     * @param reservation
     */
    public void confirmReversation(Reservation reservation){
        reservation.getTable().markUnAvaliable();
    }

    /**
     * 取消预定
     * @param reservation
     */
    public void cancelReservation(Reservation reservation){
        Table table = reservation.getTable();
        table.getReservations().remove(reservation);
        table.markAvaliable();
    }

    public static void main(String[] args) {
        Restaurant restaurant = new Restaurant();
        Party party = new Party(3);

        // 找到桌子
        Table table = restaurant.findTable(party);

        // 浏览菜单
        List<Meal> meals = restaurant.meals;

        // 下单
        Order order = new Order(party, table, meals);
        restaurant.takeOrder(order);

        // 结算
        restaurant.checkOut(order);
    }
}

上一篇下一篇

猜你喜欢

热点阅读