要实现的功能如下
来源于 跟着韩老师学java,https://www.bilibili.com/video/BV1fh411y7R8
- 实现基于文本界面的《房屋出租软件》。
- 能够实现对房屋信息的添加、修改和删除(用数组实现),并能够打印房屋明细表
系统设计
- 在系统设计阶段,需要从用户的角度去从上往下的分析
- 需要对复杂的项目进行分层管理
系统实现
- 先编写数据层,设计房屋类,用于保存房屋信息
package com.zut.houseRent.domain;
/**
* house的对象表示一个房屋信息
*
* @author wzl
* @create 2021--09-07 17:33
*/
public class House {
private int id;
private String name;
private String phone;
private String address;
private int rent;
private String state;
//构造器
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\t" + phone +
"\t\t" + address +
"\t\t" + rent +
"\t\t" + state;
}
}
- 编写业务层,实现增删改查房屋信息的功能
package com.zut.houseRent.service;
import com.zut.houseRent.domain.House;
/**
* 1.定义house【】保存house对象
* 2.完成对house的各种操作,crud
*
* @author wzl
* @create 2021--09-07 17:53
*/
public class HouseService {
private House[] houses; //保存house对象
private int houseNums = 1; //记录当前有多少个房屋信息
private int idCounter=1; //记录id增长的值
//构造器
public HouseService(int sizes) {
houses = new House[sizes];
//为了配合测试,初始化一个house对象
houses[0] = new House(1, "jack", "112", "北京市", 20000, "未出租");
}
//find方法
public House findHouseById(int findId){
//遍历数组
for (int i = 0; i < houseNums; i++) {
if(findId==houses[i].getId()){
return houses[i];
}
}
return null;
}
//del方法,删除房屋信息
public boolean del(int deIId){
//先找到删除房屋信息对应的下标
int index=-1;
for (int i = 0; i < houseNums; i++) {
if(deIId==houses[i].getId()){//要删除的房屋id,是数组下表为i的元素
index=i; //就是用index记录i
}
}
if (index == -1) {//说明delid在数组中不存在
return false;
}
//如果找到、
for (int i = index; i < houseNums-1; i++) {
houses[i] = houses[i+1];
}
//将最后一个房屋信息置null
houses[--houseNums]=null;
return true;
}
//list 方法,返回房屋列表
public House[] list() {
return houses;
}
//add方法
public boolean add(House newHouse) {
//判读是否还可以继续添加(暂时不考虑数组扩容问题) 需要当前房屋有多少个
if (houseNums == houses.length) {
System.out.println("房屋已满,不能添加。。。");
return false;
}
//把房屋加入数组之后
houses[houseNums++] = newHouse;
//程序员设计id自增长
newHouse.setId(++idCounter);
return true;
}
}
- 编写界面层,接受用户的输入,调用业务层不同的功能
package com.zut.houseRent.view;
import com.zut.houseRent.domain.House;
import com.zut.houseRent.service.HouseService;
import com.zut.houseRent.utils.Utility;
/**
* //1.显示主菜单
* //2.接受用户的输入
* //3.调用相应的功能
*
* @author wzl
* @create 2021--09-07 17:42
*/
public class HouseView {
private boolean loop = true; //控制显示菜单
private char key = ' '; //接受用户的输入
private HouseService houseService = new HouseService(10); //设置数组大小为10
//根据id修改房屋信息
public void update(){
System.out.println("===============修改房屋信息=================");
System.out.println("请选择待修改房屋编号(-1表示退出)");
int updateId = Utility.readInt();
if (updateId == -1) {
System.out.println("===========放弃修改房屋信息=============");
return;
}else {
//根据updateid查找对象
House house = houseService.findHouseById(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("============修改房屋信息成功===============");
}
}
//通过id查询房屋信息
public void findHouseById(){
System.out.println("==========查找房屋信息=========");
System.out.println("请输入要查找的id");
int findId = Utility.readInt();
//调用方法
House house = houseService.findHouseById(findId);
if (house != null) {
System.out.println(house);
}else {
System.out.println("============查找房屋的id不存在==============");
}
}
//完成退出确认
public void exit() {
char confirmSelection = Utility.readConfirmSelection();
if (confirmSelection == 'Y') {
loop = false;
}
}
//删除房屋delHouse()界面
public void delHouse() {
System.out.println("============删除房屋信息============");
System.out.println("请输入待删除房屋的编号(-1退出):");
int delId = Utility.readInt();
if (delId == -1) {
System.out.println("============放弃删除房屋信息============");
return;
}
char choice = Utility.readConfirmSelection();
if (choice == 'Y') {
if (houseService.del(delId)) {
System.out.println("============删除房屋信息成功=============");
} else {
System.out.println("============房屋编号不存在,删除房屋信息失败=============");
}
} else {
System.out.println("=============放弃删除房屋信息==============");
}
}
//添加房屋addHouse()界面
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("==============添加房屋成功============");
}
System.out.println("============添加房屋失败===========");
}
//编写listHouses()界面
public void listHouses() {
System.out.println("========房屋列表=========");
System.out.println("编号\t\t房主\t\t电话\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]);
}
System.out.println("======房屋显示完毕=======");
}
//显示主菜单
public void mainMenu() {
do {
System.out.println("----------------房屋出租系统-----------------");
System.out.println("----------------1 新增房源-----------------");
System.out.println("----------------2 查找房屋-----------------");
System.out.println("----------------3 删除房屋信息-----------------");
System.out.println("----------------4 修改房屋信息-----------------");
System.out.println("----------------5 显示房屋列表-----------------");
System.out.println("----------------6 退 出-----------------");
System.out.print("请输入选择(1-6):");
key = Utility.readChar();
switch (key) {
case '1': {
this.addHouse();
break;
}
case '2': {
findHouseById();
break;
}
case '3': {
this.delHouse();
break;
}
case '4': {
update();
break;
}
case '5': {
this.listHouses();
break;
}
case '6': {
exit();
break;
}
}
} while (loop);
}
}
- 编写测试类,调用界面层
package com.zut.houseRent;
import com.zut.houseRent.view.HouseView;
/**
* @author wzl
* @create 2021--09-07 17:24
*/
public class HouseRentApp {
public static void main(String[] args) {
//创建houseView对象,并且显示主菜单,是整个程序的入口
new HouseView().mainMenu();
System.out.println("====你退出房屋出租系统====");
}
}
总结
- 需求分析从用户角度出发,从上往下分析业务功能,即采用分层设计模式,从界面层出发,通过界面层调用业务层的功能,业务层所使用的数据需要由数据层进行提供。
- 万物皆对象,每个业务功能就对应着一个方法,深刻体会到面向对象编程的内涵。