• 项目练习:房屋出租系统


    房屋出租系统

    • 需求说明:实现基于文本界面的《房屋出租软件》
    • 能够实现对房屋信息的添加,修改,删除(用数组实现),能够打印房屋明细表

    分层设计

    为了理解业务逻辑和方便编写代码,可以将程序分成多个层面,理清思路后再进行编写代码

    程序入口
    HouseRentApp类:main方法{程序入口,创建HoeseView对象,调用对象显示主菜单}

    界面层
    HouseView类:1.显示界面 2.接收用户的输入3.调用HouseService类完成对房屋的操作

    业务层
    HouseService类:1.响应HouseView类的调用 2. 完成对房屋的增删改查CRUD
    其他工具类:完成获取用户的各种输入:待会会使用老师写的Utiltty工具类

    domain/模型model
    House类:一个House类表示一个房屋信息

    House类编写

    1. 首先定义好房屋的各个属性,编号 房主 电话 地址 月租 状态(已出租/未出租)
    2. 将属性编写到构造器中给出 对应的set get方法。
    3. 重写toString方法,根据菜单界面编辑好格式
    public class House {
        private int id;
        private String name;
        private int phone;
        private String address;
        private double rent;
        private String state;
        public House(int id, String name, int phone, String address, double rent, String state) {
            this.id = id;
            this.name = name;
            this.phone = phone;
            this.address = address;
            this.rent = rent;
            this.state = state;
        }
    //set get.....
        @Override
        public String toString() {
            return  "id=" + id +
                    "\t" + name +
                    "\t" + phone +
                    "\t" + address +
                    "\t" + rent +
                    "\t" + state ;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    HouseView菜单编写

    1. 显示菜单
    2. 根据用户的输入执行不同的操作
    public class HouseView {
        public void mainMenu(){
            boolean loop = true;//菜单显示控制
            char key = ' ';//用户选择
            do {
                System.out.println("==========房屋出租系统==========");
                System.out.println("\t\t\t1. 新 增 房 源");
                System.out.println("\t\t\t2. 查 找 房 屋");
                System.out.println("\t\t\t3. 删 除 房 屋 信 息");
                System.out.println("\t\t\t4. 修 改 房 屋 信 息");
                System.out.println("\t\t\t5. 房 屋 列 表");
                System.out.println("\t\t\t6. 退 出");
                System.out.println("请输入你的选择(1-6):");
                key = Utils.readChar();
                switch(key){
                    case '1':
                        System.out.println("新增");
                        break;
                    case '2':
                        System.out.println("查找");
                        break;
                    case '3':
                        System.out.println("删除");
                        break;
                    case '4':
                        System.out.println("修改");
                        break;
                    case '5':
                        System.out.println("列表");
                        break;
                    case '6':
                        System.out.println("退出");
                        loop = false;
                        break;
                }
    
            }while(loop);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    编写房屋列表功能

    1. 在Service类定义house数组且通过构造器确定数组大小
    2. 编写List方法,用于返回创建的数组
    3. 在View类菜单类,创建HouseList方法,接收list传过来的数组。且通过循环输出信息
    4. 将菜单中显示列表执行区域,变成调用Houselist方法
    //Service类
    public class HouseService {
        private House[] houses;//声明一个House类的数组,用于保存对象
    
        public HouseService(int size) {//构造器创建数组空间
            houses = new House[size];//使创建Service对象时,指定数组大小
            //先测试赋值一个数组
            houses[0] = new House(1,"李三",1867925,"比尔吉沃特",5000,"未出租");
        }
        //list方法返回前面创建的数组
        public House[] list(){
            return houses;
        }
    }
    //菜单类
    public class HouseView {
        boolean loop = true;//菜单显示控制
        char key = ' ';//用户选择
        private HouseService houseService = new HouseService(5);//实例化Service对象,设置数组大小
        public void houseList(){
            System.out.println("===========房屋出租列表=================");
            System.out.println("编号\t\t房主\t\t电话\t\t地址\t\t月租\t\t状态");
            House[] houses = houseService.list();//将创建好的数组给house
            for (int i = 0; i < houses.length; i++) {
                if (houses [i] == null){
                    break;
                }
                System.out.println(houses[i]);//自动调用toString方法输出
            }
        }
        public void mainMenu(){
            do {
                System.out.println("==========房屋出租系统==========");
                System.out.println("\t\t\t1. 新 增 房 源");
                System.out.println("\t\t\t2. 查 找 房 屋");
                System.out.println("\t\t\t3. 删 除 房 屋 信 息");
                System.out.println("\t\t\t4. 修 改 房 屋 信 息");
                System.out.println("\t\t\t5. 房 屋 列 表");
                System.out.println("\t\t\t6. 退 出");
                System.out.println("请输入你的选择(1-6):");
                key = Utils.readChar();
                switch(key){
                    case '1':
                        System.out.println("新增");
                        break;
                    case '2':
                        System.out.println("查找");
                        break;
                    case '3':
                        System.out.println("删除");
                        break;
                    case '4':
                        System.out.println("修改");
                        break;
                    case '5':
                        houseList();
                        break;
                    case '6':
                        System.out.println("退出");
                        loop = false;
                        break;
                }
    
            }while(loop);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    编写新增房源

    1. 在Service类,编写add方法接收一个新的房源对象
    2. 在add方法中,创建比原数组空间大1的新数组,依次将前面的数组复制进去
    3. 复制完成后,将传进来的新房源对象信息给新数组的最后一个空间
    4. 最后将原数组的引用指向新数组
    5. 再回到View类定义HouseAdd方法,让用户输入新房源的信息,实例化成新的House类,调用add方法将新对象传入

    注意点:id的自增 和 对象数组的复制方法
    难点:对象数组扩容

    //View类
        public void addHouse(){
            System.out.println("========添加房屋======");
            System.out.println("姓名");
            String name = Utils.readString(4);
            System.out.println("电话");
            int phone = Utils.readInt();
            System.out.println("地址");
            String ress = Utils.readString(16);
            System.out.println("月租");
            int rent = Utils.readInt();
            System.out.println("状态");
            String state = Utils.readString(3);
            House newHouse = new House(0,name,phone,ress,rent,state);
            houseService.add(newHouse);
    
        }
    //Service类
        public House[] add(House newHouse){
            House [] houses1 = new House[houses.length+1];
            int idcount = 1;
            for (int i = 0; i < houses.length; i++) {//依次赋值给新对象数组
                houses1[i] = new House(idcount++,houses[i].getName(),houses[i].getPhone(),houses[i].getAddress(),houses[i].getRent(),houses[i].getState());
            }
            //把最新的也给扩容的数组
            houses1[houses1.length-1] = new House(idcount,newHouse.getName(),newHouse.getPhone(),newHouse.getAddress(),newHouse.getRent(),newHouse.getState());
            houses = houses1;//将原数组的引用指向扩容后的数组
            houses1 = null;
            return houses;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    删除房源

    1. 在View类编写HouseDle方法:接收用户要删除的ID,调用Del方法
    2. 在Service类编写Del方法,创建一个比当前数组小1空间的新数组,除了要删除的元素,其他都依次赋值。
    3. 最后引用变更。
    //View类
    public void delHouse(){
            System.out.println("========删除房屋======");
            System.out.println("请输入要删除的ID(-1退出):");
            int delID = Utils.readInt();
            if (delID == -1){
                System.out.println("已退出删除信息");
                return;
            }
            char choice = Utils.readConfirmSelection();//只有输入Y或者N才能出来
            if (choice == 'Y'){
                //调用del方法
                houseService.del(delID);
            }else{
                System.out.println("已退出删除信息");
            }
        }
    //Service类
    public void del(int delID){
            int indx = -1;
            House[] houses2 = new House[houses.length-1];//创建一个比原数组小一个空间的数组
            for (int i = 0; i < houses.length; i++) {
                if (delID == houses[i].getId()){//得到要删除的下标
                   indx = i;
                }
            }
            for (int i = 0; i < indx ; i++) {//前面的元素正常赋值
                houses2 [i] = houses [i] ;
            }
            for (int i = indx; i < houses.length-1; i++) {//将后面的元素前移
                houses2 [i] = houses[i+1];
            }
                 houses = houses2;
                  houses2 = null;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    编写退出功能

    1. 直接在View类中编写一个是否确认退出的方法,调用即可
    //View类
    public void exit(){
            char key = Utils.readConfirmSelection();
            if (key == 'Y'){
                loop = false;
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    编写查找功能

    1. 在View类中编写houseFind方法:接收用户要查找的ID
    2. 在Service类中编写find方法:根据传入的ID对数组进行匹配,匹配成功则返回这这个对象
    //View类
    public void findHouse(){
            System.out.println("请输入要查找的ID:");
            int findID = Utils.readInt();
            System.out.println("查找信息如下:");
            System.out.println(houseService.find(findID));
        }
    //Service类
    public House find(int findID){
            for (int i = 0; i < houses.length; i++) {
                if (findID == houses[i].getId()){
                    return houses[i];
                }
            }
            System.out.println("没有找到此ID");
            return null;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    编写修改功能

    1. 在View类中借用之前写过的find方法,查找到对应的元素,将新的引用指向这个元素。然后输出信息,使用set方法修改
      注意点:动态绑定机制。回车是不修改if(!” “.equals(name)){set方法}。表示如果是输入为空,就跳过,不为空就进入就修改。!取反符号
    //View类
    public void date(){
            System.out.println("请输入要修改的ID:");
            int findID = Utils.readInt();
            House house = houseService.find(findID);
            System.out.println("房主("+house.getName()+"):");
            String name = Utils.readString(4,"");
            if (!"".equals(name)){//如果不为空就修改
                house.setName(name);
            }
            System.out.println("电话("+house.getPhone()+"):");
            int phone = Utils.readInt(-1);
            if (phone != -1){//如果不为-1就修改
                house.setPhone(phone);
            }
            System.out.println("地址("+house.getAddress()+"):");
            String ress = Utils.readString(4,"");
            if (!"".equals(ress)){//如果不为空就修改
                house.setName(ress);
            }
            System.out.println("租金("+house.getRent()+"):");
            int rent = Utils.readInt(-1);
            if (rent != -1){//如果不为-1就修改
                house.setRent(rent);
            }
            System.out.println("状态("+house.getState()+"):");
            String state = Utils.readString(4,"");
            if (!"".equals(name)){//如果不为空就修改
                house.setState(state);
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    大概框架

    在这里插入图片描述

    运行检验

    ---------------房屋出租系统---------------
    1. 新 增 房 源
    2. 查 找 房 屋
    3. 删 除 房 屋 信 息
    4. 修 改 房 屋 信 息
    5. 房 屋 列 表
    6. 退 出
    请输入你的选择(1-6):
    5
    ---------------房屋出租系统---------------
    编号 房主 电话 地址 月租 状态
    1 李三 1867925 比尔吉沃特 5000.0 未出租
    ---------------房屋出租系统---------------
    1. 新 增 房 源
    2. 查 找 房 屋
    3. 删 除 房 屋 信 息
    4. 修 改 房 屋 信 息
    5. 房 屋 列 表
    6. 退 出
    请输入你的选择(1-6):
    1
    ---------------添加房屋---------------
    姓名
    李五
    电话
    112
    地址
    海定区
    月租
    1800
    状态
    未出租
    添加成功
    ---------------房屋出租系统---------------
    1. 新 增 房 源
    2. 查 找 房 屋
    3. 删 除 房 屋 信 息
    4. 修 改 房 屋 信 息
    5. 房 屋 列 表
    6. 退 出
    请输入你的选择(1-6):
    1
    ---------------添加房屋---------------
    姓名
    王思
    电话
    900
    地址
    新洲区
    月租
    1000
    状态
    已出租
    添加成功
    ---------------房屋出租系统---------------
    1. 新 增 房 源
    2. 查 找 房 屋
    3. 删 除 房 屋 信 息
    4. 修 改 房 屋 信 息
    5. 房 屋 列 表
    6. 退 出
    请输入你的选择(1-6):
    3
    ---------------删除房屋---------------
    请输入要删除的ID(-1退出):
    2
    请输入你的选择(Y/N): 请小心选择
    Y
    删除完成
    ---------------房屋出租系统---------------
    1. 新 增 房 源
    2. 查 找 房 屋
    3. 删 除 房 屋 信 息
    4. 修 改 房 屋 信 息
    5. 房 屋 列 表
    6. 退 出
    请输入你的选择(1-6):
    5
    ---------------房屋出租系统---------------
    编号 房主 电话 地址 月租 状态
    1 李三 1867925 比尔吉沃特 5000.0 未出租
    3 王思 900 新洲区 1000.0 已出租
    ---------------房屋出租系统---------------
    1. 新 增 房 源
    2. 查 找 房 屋
    3. 删 除 房 屋 信 息
    4. 修 改 房 屋 信 息
    5. 房 屋 列 表
    6. 退 出
    请输入你的选择(1-6):
    2
    请输入要查找的ID:
    2
    查找信息如下:
    没有找到此ID
    null
    ---------------房屋出租系统---------------
    1. 新 增 房 源
    2. 查 找 房 屋
    3. 删 除 房 屋 信 息
    4. 修 改 房 屋 信 息
    5. 房 屋 列 表
    6. 退 出
    请输入你的选择(1-6):
    2
    请输入要查找的ID:
    1
    查找信息如下:
    1 李三 1867925 比尔吉沃特 5000.0 未出租
    ---------------房屋出租系统---------------
    1. 新 增 房 源
    2. 查 找 房 屋
    3. 删 除 房 屋 信 息
    4. 修 改 房 屋 信 息
    5. 房 屋 列 表
    6. 退 出
    请输入你的选择(1-6):
    4
    请输入要修改的ID:
    3
    房主(王思):万斯
    电话(900):100
    地址(新洲区):
    租金(1000.0):1200
    状态(已出租):
    修改完成
    ---------------房屋出租系统---------------
    1. 新 增 房 源
    2. 查 找 房 屋
    3. 删 除 房 屋 信 息
    4. 修 改 房 屋 信 息
    5. 房 屋 列 表
    6. 退 出
    请输入你的选择(1-6):
    5
    ---------------房屋出租列表---------------
    编号 房主 电话 地址 月租 状态
    1 李三 1867925 比尔吉沃特 5000.0 未出租
    3 万斯 100 新洲区 1200.0
    ---------------房屋出租系统---------------
    1. 新 增 房 源
    2. 查 找 房 屋
    3. 删 除 房 屋 信 息
    4. 修 改 房 屋 信 息
    5. 房 屋 列 表
    6. 退 出
    请输入你的选择(1-6):
    6
    请输入你的选择(Y/N): 请小心选择
    Y
    退出
    已退出房屋系统


  • 相关阅读:
    【栈和队列OJ】一、有效的括号
    光模块故障的主要原因及解决办法
    爬取基金收盘价并用pyecharts进行展现
    必背积分表
    独立站投放谷歌广告是应该找代理商
    圣经投屏Java+sqlite3极速版
    【深度学习】Transformer、GPT、BERT、Seq2Seq什么区别?
    windows逆向的工具 (没有Android工具)
    顺序表和ArrayList
    SpringBoot——》集成Kafka示例
  • 原文地址:https://blog.csdn.net/WINorYU/article/details/127476316