1.需求
基于文本界面的《房屋出租软件》,能够实现对房屋信息的添加、删除、和修改,并且能打印房屋的详细信息。
2.房屋出租系统架构图
3.实现
0.新建一个项目并创建包和运行类
1.准备工具类utilty,并进行测试
2.编写House.java类
package HouseRent.domain;
/*House的对象表示一个房屋信息*/
public class House {
private int id; //编号
private String name;//房主
private String phone;//电话
private String address;
private int rent;
private String status;
public House(int id, String name, String phone, String address, int rent, String status) {
this.id = id;
this.name = name;
this.phone = phone;
this.address = address;
this.rent = rent;
this.status = status;
}
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 getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
@Override
public String toString() {
return id + "\t"
+ name + "\t"
+ phone +"\t"
+ address + "\t"
+ rent + "\t"
+ status + "\t" ;
}
}
3.实现显示主菜单和完成退出软件功能
package HouseRent.view;
import HouseRent.utils.Utility;
import java.util.Scanner;
public class HouseView {
private boolean loop = true; // 控制菜单循环显示
private char key = ' ';//接收用户入
Scanner scanner = new Scanner(System.in); //定义一个输入类型的变量。在首页获得不同的功能
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 = Utility.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);
}
}
4.实现显示房屋列表的功能
编写HouseView.java和HouseService.java
在HouseView里添加一个houseList()方法,来显示数据内容
在HouseService里添加一个List()方法获得数据内容。
然后在houseList()里调用List()就可以了
但是数据是需要存放到一个位置里的,为了存放这些数据,则需要定义一个数组。
HouseService
定义一个数组后,但是数组的大小是不确定的,所以这个时候需要一个构造器,在构造器里定义出数组的大小
package HouseRent.service;
import HouseRent.domain.House;
/**
* HouseService类:业务层
* 1、定义House[],保存House[]对象
* 2、响应HouseView的调用
* 3、完成对房屋信息的各种操作(增改删查 CRUD)
* */
public class HouseService {
private House[] houses;//保存house对象
public HouseService(int size) {
houses = new House[size];//创建HouseSerive对象,指定数组大小
//配合测试信息,初始化一个对象
houses[0] = new House(1,"jack","112","海淀区",2000,"未出租");
}
//list方法,返货houses
public House[] list(){
return houses;
}
}
HouseView
public class HouseView {
private boolean loop = true; // 控制菜单循环显示
private char key = ' ';//接收用户入
private HouseService houseService = new HouseService(10);//设置数组的大小为10
//编写ListHouses,显示房屋列表
public void listHouses(){
System.out.println("========= 房 屋 列 表 ==========");
System.out.println("编号\t房主\t\t电话\t地址\t月租\t状态(未出租/已出租)");
House[] houses = houseService.list();//得到所有房屋信息
for (int i = 0; i<houses.length; i++){
if (houses[i]==null){
break;
}
System.out.println(houses[i]);
}
}
5.实现添加房屋信息功能
- 修改之前写的HouseView和HouseService。在HouseView里面完成接收用户输入的功能,但真正的执行,还是在HouseService里进行的。所以需要我们在service里添加一个方法,参数就是传进来的信息,把它加入到我们的数组里面。
- 添加的方法定义为add,在houseService里添加
HouseView
public void addHouse(){
System.out.println("----------添加房屋-----------");
System.out.println("姓名:");
String name = Utility.readString(8);
System.out.println("电话:");
String phone = Utility.readString(12);
System.out.println("地址:");
String address = Utility.readString(16);
System.out.println("月租:");
int rent = Utility.readInt(3);
System.out.println("状态");
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
/**
* HouseService类:业务层
* 1、定义House[],保存House[]对象
* 2、响应HouseView的调用
* 3、完成对房屋信息的各种操作(增改删查 CRUD)
* */
public class HouseService {
private House[] houses;//保存house对象
private int houseNum = 1;//记录当前有多少个房屋信息
private int idCounter = 1;//记录当前id自增到那个值了
public HouseService(int size) {
houses = new House[size];//创建HouseSerive对象,指定数组大小
//配合测试信息,初始化一个对象
houses[0] = new House(1,"jack","112","海淀区",2000,"未出租");
}
//add方法,添加新对象,返回boolean
public boolean add(House newHouse){
//判断是否可以继续添加,暂时不考虑数组的扩容问题。
if(houseNum == houses.length){
System.out.println("数组已经满了,不能再添加了");
return false;
}else{
//newHouse对象加到house数组最后
houses[houseNum++] = newHouse;//先赋值后自增
//DidCounter++;//设计一个id自增长机制,更新newHouse的id
newHouse.setId(++idCounter);
return true;
}
}
//list方法,返货houses
public House[] list(){
return houses;
}
}
6.实现删除房屋信息的功能
还是需要改动HouseView和HouseService两个文件。
在HouseView里编写delHouse,因为要接收用户的输入,然后在HouseService里完成真正的功能。(HouseView调用HouseService里的函数来实现相关的功能)
HouseView
//编写delHouse(),接收输入的id,调用Service的del()方法
public void delHouse(){
System.out.println("=========删 除 房 屋 信 息==========");
System.out.println("请输入待删除房屋的编号(-1退出):");
int delId = Utility.readInt();
if (delId==-1){
System.out.println("=========删 除 房 屋 信 息==========");
return;
}
//该方法本身就含有循环的逻辑判断,必须输出Y/N
char choice = Utility.readConfirmSelection();
if (choice == 'Y'){//真的删除
//调用HouseServie里的delHouse()方法
}else{
System.out.println("=========删 除 房 屋 信 息==========");
}
}
HouseService
//del方法,删除一个房屋信息
public boolean del(int delId){
//应当先找到要删除房屋信息对应的下标
//下标和房屋的编号不是一回事,因为在数组中会执行各种操作
int index = -1;
for (int i =0;i<houseNum;i++){
if (delId==houses[i].getId()){//需要删除的房屋if是数组下标为i的元素
index = i;
}
}
if(index == -1){//说名delId在数组中不存在
return false;
}
for (int i =index;i<houseNum-1;i++){
houses[i] = houses[i+1];
}
houses[--houseNum ] = null;//把当前存在的
return true;
}
7.完善退出确认功能
HouseService
//根据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不存在============");
}
}
8.修改房屋信息功能
HouseView
//根据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("=============修改房屋信息成功============");
}