房屋出租系统
- 需求说明:实现基于文本界面的《房屋出租软件》
- 能够实现对房屋信息的添加,修改,删除(用数组实现),能够打印房屋明细表
分层设计
为了理解业务逻辑和方便编写代码,可以将程序分成多个层面,理清思路后再进行编写代码
程序入口
HouseRentApp类:main方法{程序入口,创建HoeseView对象,调用对象显示主菜单}
界面层
HouseView类:1.显示界面 2.接收用户的输入3.调用HouseService类完成对房屋的操作
业务层
HouseService类:1.响应HouseView类的调用 2. 完成对房屋的增删改查CRUD
其他工具类:完成获取用户的各种输入:待会会使用老师写的Utiltty工具类
domain/模型model
House类:一个House类表示一个房屋信息
House类编写
- 首先定义好房屋的各个属性,编号 房主 电话 地址 月租 状态(已出租/未出租)
- 将属性编写到构造器中给出 对应的set get方法。
- 重写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 ;
}
}
HouseView菜单编写
- 显示菜单
- 根据用户的输入执行不同的操作
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);
}
}
编写房屋列表功能
- 在Service类定义house数组且通过构造器确定数组大小
- 编写List方法,用于返回创建的数组
- 在View类菜单类,创建HouseList方法,接收list传过来的数组。且通过循环输出信息
- 将菜单中显示列表执行区域,变成调用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);
}
}
编写新增房源
- 在Service类,编写add方法接收一个新的房源对象
- 在add方法中,创建比原数组空间大1的新数组,依次将前面的数组复制进去
- 复制完成后,将传进来的新房源对象信息给新数组的最后一个空间
- 最后将原数组的引用指向新数组
- 再回到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;
}
}
删除房源
- 在View类编写HouseDle方法:接收用户要删除的ID,调用Del方法
- 在Service类编写Del方法,创建一个比当前数组小1空间的新数组,除了要删除的元素,其他都依次赋值。
- 最后引用变更。
//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;
}
编写退出功能
- 直接在View类中编写一个是否确认退出的方法,调用即可
//View类
public void exit(){
char key = Utils.readConfirmSelection();
if (key == 'Y'){
loop = false;
}
}
编写查找功能
- 在View类中编写houseFind方法:接收用户要查找的ID
- 在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;
}
编写修改功能
- 在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. 退 出
请输入你的选择(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
退出
已退出房屋系统