Java面向对象demo 模拟酒店管理系统

/*
 * 模拟酒店管理系统
 * 酒店类
 * 酒店规模为:5层 每层3个房间  二维数组
 *   其中1、2层为标准间 3、4层为双人间 5层为豪华间
 * 需要提供对应得打印房间列表的方法
 *   打印格式:【101 标准间 空闲】【102 标准间 占用】...
 * 预定房间的方法
 * 退定房间的方法
 * */

public class Hotel {
    // 酒店内所有房间
    private final Room[][] rooms;

    // 在构造方法中初始化房间对象,初始化后可在当前类中使用
    public Hotel() {
        rooms = new Room[5][3]; // 成员引用型变量初始化,可是成员方法中直接使用
        // 其中1、2层为标准间 3、4层为双人间 5层为豪华间
        for (int i = 0; i < rooms.length; i++) {
            String number;
            String type;
            if (i<2){
                for (int j = 0; j < rooms[i].length; j++) {
                    number = (i+1)*100 + (j+1) + "";
                    rooms[i][j] = new Room(number, "标准间", false);
                }
            }else if (i<4){
                for (int j = 0; j < rooms[i].length; j++) {
                    number = (i+1)*100 + (j+1) + "";
                    rooms[i][j] = new Room(number, "双人间", false);
                }
            }else {
                for (int j = 0; j < rooms[i].length; j++) {
                    number = (i+1)*100 + (j+1) + "";
                    rooms[i][j] = new Room(number, "豪华间", false);
                }
            }
        }
    }

    /**
     * 判断用户输入是否合法
     * @param i 酒店房间层数
     * @param j 酒店每层房间数
     * @return Boolean
     */
    public boolean IsLegal(int i,int j){
        if (i<0 || i>rooms.length || j<0 ||j> rooms.length){
            System.out.println("对不起,您选择的房间不存在");
            return false;
        }else return true;
    }

    /**
     * 酒店房间下标转换
     * @param num 用户输入的字符串类型房间号
     * @return 酒店房间层数 和 酒店每层房间数 对应的标号
     */
    public int[] StringToInt(String num){
        int number = Integer.parseInt(num);
        int[] arr = new int[2];
        int i = number/100 - 1;
        int j = number - (i+1)*100 - 1;
        arr[0] = i;
        arr[1] = j;
        return arr; // 使用数组返回两个值
    }

    /**
     * 退定方法(冗余)
     * @param num string类型房间号
     */
    public void subScribe(String num){

        int[] arr = StringToInt(num);
        int i = arr[0];
        int j = arr[1];

        if (IsLegal(i,j)){

            if (!rooms[i][j].isFlag()){
                System.out.println("对不起,您选择的房间"+rooms[i][j].getNumbers()+"没有预定");
                return;
            }

            if (i<2){
                    rooms[i][j].setFlag(false);
                    System.out.println("标准间" + rooms[i][j].getNumbers() + "退订成功!");
//                System.out.println("您退订的房间信息为:"+rooms[i][j].getNumbers()+
//                        " "+rooms[i][j].getType()+" "+(rooms[i][j].isFlag() ? "占用":"空闲"));
                    System.out.println("您退订的房间信息更新为:"); // 自动调用toString
                    System.out.println(rooms[i][j]); // toString的应用场景
                    System.out.println();

            }else if (i<4){
                    rooms[i][j].setFlag(false);
                    System.out.println("双人间" + rooms[i][j].getNumbers() + "退订成功!");
//                System.out.println("您退订的房间信息为:"+rooms[i][j].getNumbers()+
//                        " "+rooms[i][j].getType()+" "+(rooms[i][j].isFlag() ? "占用":"空闲"));
                    System.out.println("您退订的房间信息更新为:"); // 自动调用toString
                    System.out.println(rooms[i][j]);
                    System.out.println();

            }else if (i==4){
                    rooms[i][j].setFlag(false);
                    System.out.println("豪华间" + rooms[i][j].getNumbers() + "退订成功!");
//                System.out.println("您退订的房间信息为:"+rooms[i][j].getNumbers()+
//                        " "+rooms[i][j].getType()+" "+(rooms[i][j].isFlag() ? "占用":"空闲"));
                    System.out.println("您退订的房间信息更新为:");
                    System.out.println(rooms[i][j]); // 自动调用toString
                    System.out.println();

            }
        }
    }


    /**
     * 预定方法
     * @param num string类型房间号
     */
    public void order(String num){

        int[] array = StringToInt(num);
        int i = array[0];
        int j = array[1];

        if (IsLegal(i,j)){

            if (rooms[i][j].isFlag()){
                System.out.println("对不起,您选择的房间"+rooms[i][j].getNumbers()+"已被预定");
                return;
            }

            if (i<2){ // 每一项里面都是重复代码,是否可以改进?使用循环
                    rooms[i][j].setFlag(true);
                    System.out.println("标准间" + rooms[i][j].getNumbers() + "预订成功!");
//                System.out.println("您预订的房间信息为:"+rooms[i][j].getNumbers()+
//                        " "+rooms[i][j].getType()+" "+(rooms[i][j].isFlag() ? "占用":"空闲"));
                    System.out.println("您预订的房间信息更新为:"); // 自动调用toString
                    System.out.println(rooms[i][j]);
                    System.out.println();
            }else if (i<4){
                    rooms[i][j].setFlag(true);
                    System.out.println("双人间" + rooms[i][j].getNumbers() + "预订成功!");
//                System.out.println("您预订的房间信息为:"+rooms[i][j].getNumbers()+
//                        " "+rooms[i][j].getType()+" "+(rooms[i][j].isFlag() ? "占用":"空闲"));
                    System.out.println("您预订的房间信息更新为:"); // 自动调用toString
                    System.out.println(rooms[i][j]);
                    System.out.println();
            }else if (i==4){
                    rooms[i][j].setFlag(true);
                    System.out.println("豪华间" + rooms[i][j].getNumbers() + "预订成功!");
//                System.out.println("您预订的房间信息为:"+rooms[i][j].getNumbers()+
//                        " "+rooms[i][j].getType()+" "+(rooms[i][j].isFlag() ? "占用":"空闲"));
                    System.out.println("您预订的房间信息更新为:"); // 自动调用toString
                    System.out.println(rooms[i][j]);
                    System.out.println();
            }
        }
    }

    /**
     * 预定方法 (优化),退订方法类似
     * @param num 输入房间号(字符串类型)
     */
    public void orderRoom(String num){

        int[] arr = StringToInt(num);
        int i = arr[0];
        int j = arr[1];

        if (IsLegal(i,j)){
            if (rooms[i][j].isFlag()){
                System.out.println("对不起,您选择的房间"+rooms[i][j].getNumbers()+"已被预定");
            }else {
                rooms[i][j].setFlag(true);
                System.out.println("房间:" + rooms[i][j].getNumbers() + "预订成功!");
//            System.out.println("您预订的房间信息为:"+rooms[i][j].getNumbers()+
//                    " "+rooms[i][j].getType()+" "+(rooms[i][j].isFlag() ? "占用":"空闲"));
                System.out.println("您预订的房间信息更新为:"); // 自动调用toString
                System.out.println(rooms[i][j]);
                System.out.println();
            }
        }
    }

    /**
     * 打印方法(遍历二维数组以指定格式打印)
     */
    public void look(){
        for (Room[] room : rooms) {
            for (Room value : room) {
//                System.out.println("房间号:" + value.getNumbers() + "  房间类型:"
//                        + value.getType() + "  是否占用:" + (value.isFlag() ? "占用":"空闲"));
                // 输出时引用类型对象Room,自动调用该对象的toString方法
                // 避免多处输出时 存在重复底代码,更加简洁
                System.out.println(value);
            }
        }
    }
}

/*
 * 模拟酒店管理系统
 * 房间类
 *   房间编号:格式 101、102  201、202  int/string
 *   房间类型:12标准 34双人 5豪华  string
 *   是否占用:true表示占用,false空闲,默认所有房间均空闲  boolean
 *
 * Bean
 *   1 成员变量私有化
 *   2 无参构造
 *   3 全参构造
 *   4 根据需求提供构造方法重载
 *   5 每个变量对用getter/setter
 * */

public class Room {

    // 房间编号
    private String numbers;
    // 房间类型
    private String type;
    // 是否占用
    private boolean flag;


    public Room(String numbers, String type, boolean flag) {
        this.numbers = numbers;
        this.type = type;
        this.flag = flag;
    }

    public String getNumbers() {
        return numbers;
    }

    public void setNumbers(String numbers) {
        this.numbers = numbers;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

/*
此处相当于实现 三目运算符
// (value.isFlag() ? "占用" : "空闲") 用三目运算符输出是否占用
    public String isFlag() {
        String flagPrint;
        if (flag) {
           flagPrint = "占用";
           return flagPrint;
        }else{
            flagPrint = "空闲";
            return flagPrint;
        }
    }
*/

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    // toString描述房间信息,不同实例化后的对象有共同的三个属性
    @Override
    public String toString() {
        // (value.isFlag() ? "占用" : "空闲") 用三目运算符输出是否占用
        return "房间号:" + numbers + "  房间类型:"
                + type + "  是否占用:" + (flag ? "占用":"空闲");
    }
}

/*
* 模拟酒店管理系统
* 客户端类
* 开始打印所有房间
* 等待控制台输入,输入格式:预定101 或 退订101
* 根据输入内容,做相应操作,预定或退订完成之后,再次打印所有房间列表
*
* */
public class Client {
    public static void main(String[] args) {

        // 开始打印所有房间

        Hotel hotel = new Hotel();

        // 调用打印方法。展示房间列表
        System.err.println("当前房间信息为:");
        hotel.look();

        // 死循环 start
        order(hotel);


    }
    public static void order(Hotel hotel){

        // 接收控制台输入
        Scanner scanner = new Scanner(System.in);

        // 接收控制台输入
        System.err.println("请输入办理业务:预订/退定");
        String business = scanner.nextLine();
        System.err.println("请输入房间号:格式:x01-x10 x=1~5");
        String number = scanner.nextLine();

        // 一行中同时输入 op 和 num
        // String op = scanner.next();
        // int num = scanner.nextInt(); // 也可以输入字符

        // 预定退订操作
        if (business.equals("预定")){
            System.out.println("您办理的业务为预定房间!");
            hotel.order(number);
        }else if (business.equals("退订")){
            System.out.println("您办理的业务为退定房间!");
            hotel.subScribe(number);
        }else {
            System.out.println("输入业务类型错误!办理业务失败!");
        }

        // 判断是否继续办理业务
        System.err.println("是否继续办理业务?");
        System.err.println("输入2打印房间信息,输入1继续,输入0退出");
        String user = scanner.nextLine();
        if (user.equals("2")){
            // 打印所有房间号
            System.out.println("酒店房间信息更新为:");
            hotel.look();
            System.err.println("是否继续办理业务?");
            System.err.println("输入1继续,输入0退出");
            String type = scanner.nextLine();
            if (type.equals("1")){
                order(hotel);
            } else {
                scanner.close();
                System.exit(0);
            }
        } else if (user.equals("1")){
            order(hotel);
        } else {
            scanner.close();
            System.exit(0);
        }
        // 死循环 end
    }
}

效果如下
Java面向对象demo 模拟酒店管理系统Java面向对象demo 模拟酒店管理系统

上一篇:路径规划 | 随机采样算法:PRM、RRT、RRT-Connect、RRT*


下一篇:ST算法详解