需求
实现基于文本界面的房屋出租系统
能够实现对房屋信息的添加、修改和删除(数组),并能够展示房屋明细
设计
项目设计-程序框架图(分层模式-->当软件比较复杂,需要模式管理)逐渐理解设计模式
(1,系统有哪些类【文件】 2,明确类与类的调用关系)
实现
准备1:工具类Utility.java
便于获取输入,提高开发效率
在实际开发中,公司都会提供相应的工具类和开发库,可以提高开发效率,程序员也需要看懂别人写的代码,并能够正确使用。
准备2:对象类House.java生成setter和getter方法、构造器,重写toString()方法,便于使用
/** * House的对象表示一个房屋信息 */ 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\t" + name + "\t" + phone + "\t\t" + address + "\t" + rent + "\t" + state ; } }
技巧1:化繁为简,逐步实现
技巧2:实现功能三部曲:明确功能【需求】->思路分析【确定需求细节】->代码实现
实现1-显示主菜单和完成退出软件功能
需求:用户打开软件,可以看到主菜单,退出软件
思路:在HouseView.java类中,编写一个方法mainMenu(),显示菜单,并有退出选项
代码:
//显示主菜单 public void mainMenu() { do { System.out.println("\n=============房屋出租系统菜单============"); 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.print("请输入你的选择(1-6): "); key = Utility.readChar(); switch (key) { case '1': addHouse(); break; case '2': findHouse(); break; case '3': delHouse(); break; case '4': update(); break; case '5': listHouses(); break; case '6': exit(); break; } } while (loop); }
实现2-完成显示房屋列表的功能
需求:用户可以以列表的形式查看房屋信息,编号 房主 电话 地址 月租 状态(未出租/已出租)
思路:在HouseView.java类中,编写展示房屋列表信息界面的方法,在HouseService.java类中,编写返回房屋信息的方法
代码:
//HouseView.java //编写listHouses()显示房屋列表 public void listHouses() { System.out.println("=============房屋列表============"); System.out.println("编号\t房主\t电话\t地址\t月租\t状态(未出租/已出租)"); House[] houses = houseService.list();//调用houseService类的list()方法,获取所有房屋信息 for (int i = 0; i < houses.length; i++) { if (houses[i] == null) {//过滤空信息,展示已有全部房屋信息 break; } System.out.println(houses[i]); } System.out.println("=============房屋列表显示完毕============"); }
//HouseService.java //list方法,返回houses public House[] list() { return houses; }
实现3-添加房屋信息的功能
需求:用户可以添加房屋信息至系统
思路:在HouseView.java类中,编写展示添加房屋信息界面的方法,在HouseService.java类中,编写添加房屋信息至House对象数组的方法。(注意:新添加的房屋的id以自增长方式增加;增加了数组扩容机制)
代码:
//HouseView.java //编写addHouse() 接收输入,创建House对象,调用add方法 public void addHouse() { System.out.println("=============添加房屋============"); System.out.print("姓名: "); String name = Utility.readString(8); System.out.print("电话: "); String phone = Utility.readString(12); System.out.print("地址: "); String address = Utility.readString(16); System.out.print("月租: "); int rent = Utility.readInt(); System.out.print("状态: "); String state = Utility.readString(3); //创建一个新的House对象, 注意id 是系统分配的, House newHouse = new House(0, name, phone, address, rent, state); if (houseService.add(newHouse)) { System.out.println("=============添加房屋成功============"); } else { System.out.println("=============添加房屋失败============"); } }
//HouseService.java //add方法,添加新对象,返回boolean public boolean add(House newHouse) { //判断是否还可以继续添加(我们暂时不考虑数组扩容的问题) => 能否自己加入数组扩容机制(~~) if(houseNums == houses.length) {//不能再添加 houses = addLengthArray(houses);//作者增加了数组扩容机制 houses[houseNums++] = newHouse; newHouse.setId(++idCounter); return true; }else { //把newHouse对象加入到,新增加了一个房屋 houses[houseNums++] = newHouse; //我们程序员需要设计一个id自增长的机制, 然后更新newHouse的id newHouse.setId(++idCounter); return true; } } //数组动态扩容机制,可以将数组类型修改应用到其他类型的数组动态扩容 public static House[] addLengthArray(House[] house){ House [] newHouse = new House [house.length*2];//以原数组的二倍扩容 System.arraycopy(house,0,newHouse,0,house.length);//复制house数组从0位置至house.length位置到newHouse数组0位置到array.length位置 return newHouse; }
实现4-完成删除房屋信息功能
需求:用户可以选择删除房屋,以标号为依据,为防止用户误删,系统提示是否确认删除
思路:在HouseView.java类中,编写展示删除房屋信息的方法,在HouseService.java类中,编写删除Houses对象数组中房屋信息的方法。
代码:
//HouseView.java //编写delHouse() 接收输入的id,调用Service 的del方法 public void delHouse() { System.out.println("=============删除房屋信息============"); System.out.print("请输入待删除房屋的编号(-1退出):"); int delId = Utility.readInt(); if (delId == -1) { System.out.println("=============放弃删除房屋信息============"); return; } //注意该方法本身就有循环判断的逻辑,必须输出Y/N char choice = Utility.readConfirmSelection(); if (choice == 'Y') {//用户确认删除 if (houseService.del(delId)) { System.out.println("=============删除房屋信息成功============"); } else { System.out.println("=============房屋编号不存在,删除失败============"); } } else { System.out.println("=============放弃删除房屋信息============"); } }
//HouseService.java //del方法,根据用户输入的id,删除该id房屋信息 public boolean del(int delId) { //首先找到要删除的房屋信息对应的下标 int index = -1; for(int i = 0; i < houseNums; i++) { if(delId == houses[i].getId()) {//要删除的房屋(id),是数组下标为i的元素 index = i;//使用index记录i } } if(index == -1) {//index依然是初始值,说明delId在数组中不存在 return false; } for(int i = index; i < houseNums - 1; i++) {//找到指定id对应的数组下标 index ,将index后的每个数组值覆盖到该数组值的前一位,以达到删除下标为index的数组值的目的 houses[i] = houses[i+1]; } houses[--houseNums] = null;//覆盖之后,数组存储的最后一个房屋信息多余,所以把当下存在的房屋信息的最后一个置为null return true; }
实现5-完善退出确认功能
需求:用户在退出时提示“确认是否退出(Y/N):”,必须输入y/n,否则循环提示
思路:在HouseView.java类中,编写退出确认方法
代码:
//完成退出确认 public void exit() { //这里我们使用Utility提供方法,完成确认 char c = Utility.readConfirmSelection(); if (c == 'Y') { loop = false; } }
实现6-完成根据id查找房屋信息的功能
需求:用户输入房屋id,查找房屋信息
思路:在HouseView.java类中,编写展示查找房屋信息的方法,获取房屋id,在HouseService.java类中,编写查找并返回Houses对象数组中房屋信息的方法。
代码:
//HouseView.java //根据id查找房屋信息 public void findHouse() { System.out.println("=============查找房屋信息============"); System.out.print("请输入要查找的id: "); int findId = Utility.readInt(); //调用方法 House house = houseService.findById(findId); if (house != null) { System.out.println(house); } else { System.out.println("=============查找房屋信息id不存在============"); } }
//HouseService.java //findById方法,返回House对象或者null public House findById(int findId) { //遍历数组 for(int i = 0; i < houseNums; i++) { if(findId == houses[i].getId()) { return houses[i]; } } return null; }
实现-完成修改房屋信息的功能
需求:用户输入房屋id,修改房屋信息
思路:在HouseView.java类中,编写展示修改房屋信息的方法,获取用户输入的id,根据id调用findById()方法,查找到House对象,修改指定属性。
代码:
//HouseView.java //根据id修改房屋信息 public void update() { System.out.println("=============修改房屋信息============"); System.out.println("请选择待修改房屋编号(-1表示退出)"); int updateId = Utility.readInt(); if (updateId == -1) { System.out.println("=============你放弃修改房屋信息============"); return; } //根据输入得到updateId,查找对象 //老师特别提示:返回的是引用类型[即:就是数组的元素] //因此老师在后面对house.setXxx() ,就会修改HouseService中houses数组的元素!!!!!!!!!! House house = houseService.findById(updateId); if (house == null) { System.out.println("=============修改房屋信息编号不存在..============"); return; } System.out.print("姓名(" + house.getName() + "): "); String name = Utility.readString(8, "");//这里如果用户直接回车表示不修改该信息,默认"" if (!"".equals(name)) {//修改 house.setName(name); } System.out.print("电话(" + house.getPhone() + "):"); String phone = Utility.readString(12, ""); if (!"".equals(phone)) { house.setPhone(phone); } System.out.print("地址(" + house.getAddress() + "): "); String address = Utility.readString(18, ""); if (!"".equals(address)) { house.setAddress(address); } System.out.print("租金(" + house.getRent() + "):"); int rent = Utility.readInt(-1); if (rent != -1) { house.setRent(rent); } System.out.print("状态(" + house.getState() + "):"); String state = Utility.readString(3, ""); if (!"".equals(state)) { house.setState(state); } System.out.println("=============修改房屋信息成功============"); }