• 第9章:项目实战


    1. 房屋出租系统

    1.1 房屋出租系统-需求

    1.1.1 项目需求说明

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

    1.2 房屋出租系统-界面

    1.2.1 项目界面 - 主菜单

    在这里插入图片描述

    1.2.2 项目界面 - 新增房源

    在这里插入图片描述

    1.2.3 项目界面 - 查找房源

    在这里插入图片描述

    1.2.4 项目界面 - 删除房源

    在这里插入图片描述

    1.2.5 项目界面 - 修改房源

    如果不希望修改某个信息,继续保留原有的信息,则直接回车
    在这里插入图片描述

    1.2.6 项目界面 - 房屋列表

    在这里插入图片描述

    1.2.7 项目界面 - 退出系统

    在这里插入图片描述

    1.3 房屋出租系统 - 设计(!!!)

    项目设计 - 程序框架图 (分层模式=>当软件比较复杂,需要模式管理)

    为什么采用分层模式呢?使得程序结构更加清晰,扩展性,可读性等都会大大提高。之后也会涉及其他模式,比如MVC。

    下面将该项目画出框架图:(我们分析是从上往下分析的,而实现就要从下往上实现(逻辑问题))
    在这里插入图片描述

    在这里插入图片描述

    1.4 房屋出租系统-实现

    1.4.1 准备工具类 Utility,提高开发效率

    在实际开发中,公司都会提供相应的工具类和开发库,可以提高开发效率,程序员也需要能够看懂别人写的代码, 并能够正确的调用。

    1. 了解 Utility 类的使用
      2) 测试 Utility 类

    【Utility类,之后的工具类都可以从GitHub或Git中下载导入即可用,就不用重复造轮子】
    在这里插入图片描述

    package com.aimoyudett.houserent.utils;
    
    
    /**
    	工具类的作用:
    	处理各种情况的用户输入,并且能够按照程序员的需求,得到用户的控制台输入。
    */
    
    import java.util.*;
    
    public class Utility {
       
    	//静态属性。。。
        private static Scanner scanner = new Scanner(System.in);
    
        /**
         * 功能:读取键盘输入的一个菜单选项,值:1——5的范围
         * @return 1——5
         */
    	public static char readMenuSelection() {
       
            char c;
            //死循环
            for (; ; ) {
       
                String str = readKeyBoard(1, false);//包含一个字符的字符串
                c = str.charAt(0);//将字符串转换成字符char类型
                if (c != '1' && c != '2' && 
                    c != '3' && c != '4' && c != '5') {
       
                    System.out.print("选择错误,请重新输入:");
                } else break;
            }
            return c;
        }
    
    	/**
    	 * 功能:读取键盘输入的一个字符
    	 * @return 一个字符
    	 */
        public static char readChar() {
       
            String str = readKeyBoard(1, false);//就是一个字符
            return str.charAt(0);
        }
    
        /**
         * 功能:读取键盘输入的一个字符,如果直接按回车,则返回指定的默认值;否则返回输入的那个字符
         * @param defaultValue 指定的默认值
         * @return 默认值或输入的字符
         */
        
        public static char readChar(char defaultValue) {
       
            String str = readKeyBoard(1, true);//要么是空字符串,要么是一个字符
            return (str.length() == 0) ? defaultValue : str.charAt(0);
        }
    	
        /**
         * 功能:读取键盘输入的整型,长度小于10位
         * @return 整数
         */
        public static int readInt() {
       
            int n;
            for (; ; ) {
       
                String str = readKeyBoard(10, false);//一个整数,长度<=10位
                try {
       
                    n = Integer.parseInt(str);//将字符串转换成整数
                    break;
                } catch (NumberFormatException e) {
       
                    System.out.print("数字输入错误,请重新输入:");
                }
            }
            return n;
        }
    
        /**
         * 功能:读取键盘输入的 整数或默认值,如果直接回车,则返回默认值,否则返回输入的整数
         * @param defaultValue 指定的默认值
         * @return 整数或默认值
         */
        public static int readInt(int defaultValue) {
       
            int n;
            for (; ; ) {
       
                String str = readKeyBoard(10, true);
                if (str.equals("")) {
       
                    return defaultValue;
                }
    			
    			//异常处理...
                try {
       
                    n = Integer.parseInt(str);
                    break;
                } catch (NumberFormatException e) {
       
                    System.out.print("数字输入错误,请重新输入:");
                }
            }
            return n;
        }
    
        /**
         * 功能:读取键盘输入的指定长度的字符串
         * @param limit 限制的长度
         * @return 指定长度的字符串
         */
        public static String readString(int limit) {
       
            return readKeyBoard(limit, false);
        }
    
        /**
         * 功能:读取键盘输入的指定长度的字符串或默认值,如果直接回车,返回默认值,否则返回字符串
         * @param limit 限制的长度
         * @param defaultValue 指定的默认值
         * @return 指定长度的字符串
         */
        public static String readString(int limit, String defaultValue) {
       
            String str = readKeyBoard(limit, true);
            return str.equals("")? defaultValue : str;
        }
        
    	/**
    	 * 功能:读取键盘输入的确认选项,Y或N
    	 * 将小的功能,封装到一个方法中.
    	 * @return Y或N
    	 */
        public static char readConfirmSelection() {
       
            System.out.println("请输入你的选择(Y/N),请小心选择");
            char c;
            for (; ; ) {
       //无限循环
            	//在这里,将接受到字符,小写字母转成了大写字母【toUpperCase()】
            	//y => Y n=>N
                String str = readKeyBoard(1, false).toUpperCase();
                c = str.charAt(0);
                if (c == 'Y' || c == 'N') {
       
                    break;
                } else {
       
                    System.out.print("选择错误,请重新输入:");
                }
            }
            return c;
        }
    
        /**
         * 功能: 读取一个字符串
         * @param limit 读取的长度
         * @param blankReturn 如果为true ,表示 可以读空字符串。 
         * 					  如果为false表示 不能读空字符串。
         * 			
    	 *	如果输入为空,或者输入大于limit的长度,就会提示重新输入。
         * @return
         */
        private static String readKeyBoard(int limit, boolean blankReturn) {
       
            
    		//定义了字符串
    		String line = "";
    
    		//scanner.hasNextLine() 判断有没有下一行
            while (scanner.hasNextLine()) {
       
                line = scanner.nextLine();//读取这一行
               
    			//如果line.length=0, 即用户没有输入任何内容,直接回车
    			if (line.length() == 0) {
       
                    if (blankReturn) return line;//如果blankReturn=true,可以返回空串
                    else continue; //如果blankReturn=false,不接受空串,必须输入内容
                }
    
    			//如果用户输入的内容大于了 limit,就提示重写输入  
    			//如果用户如的内容 >0 <= limit ,我就接受
                if (line.length() < 1 || line.length() > limit) {
       
                    System.out.print("输入长度(不能大于" + limit + ")错误,请重新输入:");
                    continue;
                }
                break;
            }
    
            return line;
        }
    }
    
    • 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
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197

    【TestUtility类(在实际项目中不需要该类,该类只是用于初接触的小伙伴进行测试验证)】

    package com.aimoyudett.houserent.utils;
    
    public class TestUtility {
       
        public static void main(String[] args) {
       
    
            //这是一个测试类,使用完毕,就可以删除了
            //要求输入一个字符串,长度最大为3
            System.out.println("请输入字符串:");
            String s = Utility.readString(3);
            System.out.println("s=" + s);
    
            System.out.println("==========================");
            //要求输入一个字符串,长度最大为10, 如果用户直接回车,就给一个默认值
            //爱摸鱼的TT~提示:就把该方法当做一个api使用即可
            //默认值:"爱摸鱼的TT~"
            System.out.println("请输入字符串:");
            String s2 = Utility.readString(10, "爱摸鱼的TT~");
            System.out.println("s2=" + s2);
    
    
            //爱摸鱼的TT~解释一个问题
            //这里爱摸鱼的TT~是直接使用 类.方法() => 因为当一个方法是static时,就是一个静态方法
            //注意:静态方法可以直接通过类名调用. => 具体细节爱摸鱼的TT~后面在说.
        }
    }
    
    • 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

    运行结果:
    在这里插入图片描述

    1.4.2 项目功能实现-完成 House 类

    属性列表:编号 房主 电话 地址 月租 状态(未出租/已出租)

    package com.aimoyudett.houserent.domain;
    
    /**
     * @Author: 爱摸鱼的TT~
     * @Description: House的对象表示一个房屋信息
     * @Date Created in 2021-12-14 11:47
     * @Modified By:
     */
    public class House {
       
        //编号 房主 电话 地址 月租 状态(未出租/已出租)
        private int id;
        private String name;
        private String phone;
        private String address;
        private int rent;
        private String state;
        //构造器和setter及getter方法
    
        public House(int id, String name, String phone, String address, int rent, String state) {
       
            this.id = id;
            this.name = name;
            this.phone = phone;
            this.address = address;
            this.rent = rent;
            this.state = state;
        }
    
        public int getId() {
       
            return id;
        }
    
        public void setId(int id) {
       
            this.id = id;
        }
    
        public String getName() {
       
            return name;
        }
    
        public void setName(String name) {
       
            this.name = name;
        }
    
        public String getPhone() {
       
            return phone;
        }
    
        public void setPhone(String phone) {
       
            this.phone = phone;
        }
    
        public String getAddress() {
       
            return address;
        }
    
        public void setAddress(String address) {
       
            this.address = address;
        }
    
        public int getRent() {
       
            return rent;
        }
    
        public void setRent(int rent) {
       
            this.rent = rent;
        }
    
        public String getState() {
       
            return state;
        }
    
        public void setState(String state) {
       
            this.state = state;
        }
    
        //为空方便的输出对象信息,我们实现toString方法
        //编号 房主 电话 地址 月租 状态(未出租/已出租)
        @Override
        public String toString() {
       
            return 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
    • 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
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102

    有个问题:就是重写toString方法时,输出格式问题,用什么方法代替"\t"呢?

    1.4.3 项目功能实现-显示主菜单和完成退出软件功能

    化繁为简(一个一个功能逐步实现)、先死后活

    • 说明:

      • 实现功能的三部曲 【 明确完成功能(一般从用户角度开始)-> 思路分析 -> 代码实现 】
    • 功能说明:

      • 用户打开软件, 可以看到主菜单,可以退出软件,就是显示这些界面。
    • 思路分析:

      • 在 HouseView.java 中,编写一个方法 mainMenu,显示菜单。
    • 代码实现:

    【HouseView类】

    package com.aimoyudett.houserent.view;
    
    import com.aimoyudett.houserent.utils.Utility;
    
    /**
     * @Author: 爱摸鱼的TT~
     * @Description: 1. 显示界面
     *               2. 接收用户的输入
     *               3. 调用HouseService完成对房屋信息的各种操作
     * @Date Created in 2021-12-14 12:18
     * @Modified By:
     */
    public class HouseView {
       
    
        private boolean loop = true; // 控制显示菜单
        private char key = ' '; // 接收用户输入
        //显示主菜单
        public void mainMenu(){
       
            do{
       
                System.out.println("==============房屋出租系统==============");
                System.out.println("\t\t\t1 新 增 房 源");
                System.out.println("\t\t\t2 查 找 房 屋")<
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
  • 相关阅读:
    城商行本地高可用建设实践与落地效果分享
    Mybatis-Plus 快速入门
    【问题思考】为什么SCAN CSCAN会导致磁臂黏着而FCFS不会导致磁臂黏着?
    CPU GPU TPU NPU 的一些概念 和 使用
    WiFi在Settings中的热点开启流程小结
    迁移使用 GH-ost/PT-osc 的源数据库
    数据结构-带头双向循环链表(增删查改)(2)
    ROS 2边学边练(31)-- 管理大工程
    Web版Photoshop来了,用到了哪些前端技术?
    [python]将多张图片合并为单个pdf文件
  • 原文地址:https://blog.csdn.net/weixin_46312449/article/details/126692895