模拟一个房屋出租系统。
分了四个包去装不同功能的实现类
视图类(HouseView)用来存放每一个功能界面
工具类(Tool)用来存放普通的底层工具方法
功能服务(Service)用来存放每一个界面的主要功能代码
主类(domain)用来构建一个系统对象
HouseRent是测试类
1、在写这个系统的时候,我们应该要先显示系统的主界面(包含有些什么功能),只需要在视图包里面去构建就行
代码:
public void Menu(){//菜单显示方法
do {
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("\t\t\t请输入你的选择:");
//接收用户所选择的字符,下面是功能方法已经写好直接调用实现
key = DetailedTool.readChar();//调用了Tool工具的方法,因为在Tool里面定义为了static属性。所以可以直接进行调用
switch (key){
case '1':
addHouses();
break;
case '2':
findHouse();
break;
case '3':
delHouses();
break;
case '4':
updateHouse();
break;
case '5':
listHouses();
break;
case '6':
closeHouse();
}
}while (loop);
}
2、新增房源功能,界面如下
服务功能层代码:
//添加一个add方法去添加新对象,返回bool值
public boolean add(House newHouse){
//得先判断还能不能添加,因为有可能满了,还未考虑扩容问题
if(houseNum == houses.length){
System.out.println("信息已满,不能添加。");
return false;
}
//相当于将添加的信息添加到数组首位空的地址
houses[houseNum++]=newHouse;
//id是系统自增长的,设计一个自增长的id,系统就可以自动添加id序号了
newHouse.setId(++idCount);
return true;
}
视图层代码:
//新增房源功能
public void addHouses(){
System.out.println("--------------添加房屋---------------");
System.out.print("姓名:");
String name = DetailedTool.readString();
System.out.print("电话:");
String phone = DetailedTool.readString();
System.out.print("地址:");
String address =DetailedTool.readString();
System.out.print("月租:");
int rent = DetailedTool.readInt();
System.out.print("状态:");
String state = DetailedTool.readString();
//创建一个house对象来接收房屋信息,系统id是系统自增长来确定的
House newHouse = new House(0,name, phone, address, rent, state);
if (houseService.add(newHouse)){
System.out.println("--------------添加成功---------------");
}else {
System.out.println("--------------添加失败---------------");
}
}
3、查找房屋信息功能,界面如下:
服务功能层代码:
//查找房屋信息
public House find(int findId){
//遍历一遍数组,去判断id和输入的findId一不一样
for (int i = 0; i <houseNum ; i++) {
if (findId == houses[i].getId()){
return houses[i];
}
}
return null;
}
视图层代码:
//查找房屋信息
public void findHouse(){
System.out.println("--------------查找房屋---------------");
System.out.println("请输入你要查找的id:");
int findId =DetailedTool.readInt();
House house = houseService.find(findId);
if (house !=null){
System.out.println(house);
}else{
System.out.println("--------------没有该房屋---------------");
}
}
4、删除房屋功能,界面如下:
服务功能层代码:
//删除一个房屋信息
public boolean del(int delId){
//应当先找到要删除的房屋信息对应的下标,下标和房屋编号不一样
int index =-1 ;//用来记录所要删除的房屋下标
for (int i = 0; i < houseNum; i++) {
if (delId == houses[i].getId()){
index = i;
}
}
if (index == -1){//说明房屋列表中没有要删除的这个信息
return false;
}
//如果找到则删除,删除的话可以用后面一个对象信息去覆盖当前对象信息
for (int i = index; i <houseNum-1; i++) {
houses[i]=houses[i+1];
houses[i].setId(houses[i].getId()-1);//前面一个对象被删除后,后面的对象向前移动,其id肯定也会变化
}
// houses[--houseNum] = null; 和下面两句话的功能一样
houses[houseNum-1] = null;//因为被删除后,后面对象依次往前移动,则原本的最后一个对象被置空
houseNum--;//少了一个对象指定要对象数少一
return true;
}
视图层代码:
//删除房屋功能
public void delHouses(){
System.out.println("--------------删除房屋信息---------------");
System.out.println("请选择待删除房屋编号(-1退出):");
int delId = DetailedTool.readInt();
if (delId == -1){
System.out.println("--------------放弃删除房屋信息-------------");
}
//调用工具中的删除方法,其中已经包含循环,所以这里不需要再循环
char choice = DetailedTool.readConfirmSelection();
if (choice == 'Y' || choice =='y' ){
if (houseService.del(delId)){
System.out.println("--------------删除房屋信息成功-------------");
}else {
System.out.println("--------------房屋编号不正确,删除失败-------------");
}
}else {
System.out.println("--------------放弃删除房屋信息-------------");
}
}
5、修改房屋信息功能,界面如下:
服务功能层代码:
因为在查找房屋信息的时候就已经有功能去判断房屋是否存在了,所以直接调用findHouse()方法然后再视图层去修改房屋信息就行,同样也可以自己再去写一个修改方法。
视图层代码:
//修改房屋信息
public void updateHouse(){
System.out.println("--------------修改房屋---------------");
System.out.print("请选择要修改的房屋编号(-1退出):");
int updateId =DetailedTool.readInt();
if (updateId == -1){
System.out.println("--------------放弃修改房屋-------------");
return;
}
House house = houseService.find(updateId);
if (house != null){
System.out.print("姓名("+house.getName()+"):");
house.setName(DetailedTool.readString());
System.out.print("电话("+house.getPhone()+"):");
house.setPhone(DetailedTool.readString());
System.out.print("地址("+house.getAddress()+"):");
house.setAddress(DetailedTool.readString());
System.out.print("租金("+house.getRent()+"):");
house.setRent(DetailedTool.readInt());
System.out.print("状态("+house.getState()+"):");
house.setState(DetailedTool.readString());
System.out.println(house);
} else {
System.out.println("------------房屋不存在,修改失败-----------");
}
}
6、房屋列表查看功能,界面如下:
这里不需要哟特俗的功能所以直接视图层可以搞定
视图层代码:
//显示信息列表
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]);//输出房屋信息。因为前面有toString方法,所以直接可以输出
}
System.out.println("--------------房屋信息显示完毕--------------");
}
7、退出功能,界面如下
视图层代码:
//退出系统功能
public void closeHouse(){
char c = DetailedTool.readConfirmSelection();
if (c == 'Y' || c == 'y'){
loop = false;
}else {
System.out.println("------------放弃退出系统-----------");
}
}
综合代码:
所有基础工具(Tool)有:
package com.xiaowang.HouseRent.Tool;
import java.util.Scanner;
public class DetailedTool {
private static Scanner scanner = new Scanner(System.in);
public static char readChar(){
char number = scanner.next().charAt(0);
return number;
}
public static int readInt(){
int number = scanner.nextInt();
return number;
}
public static String readString(){
String name = scanner.next();
return name;
}
//判断工具
public static char readConfirmSelection(){
System.out.println("请输入你的选择(Y/N): 请小心选择");
char c;
for (;;){//无限循环
//将接收的字符转换成大写字母
String str = readKeyBoard(1,false).toUpperCase();//使用toUpperCase()字符转换的时候要记得接收类型是String
c= str.charAt(0);
if (c =='Y' || c=='N'){
break;
}else {
System.out.println("选择错误,请重新输入:");
}
}
return c;
}
private static String readKeyBoard(int i, boolean b) {
String line = "";
while (scanner.hasNextLine()) {
line = scanner.nextLine();
if(line.length() == 0) {
if(b)
return line;
else continue; }
if (line.length() < 1 || line.length() > i) {
System.out.print("输入长度(不大于" + i + ")错误,请重新输入:");
continue;
} break;
} return line;
}
//判断输入的字符串是不是空串
public static String readString(int limit,String defaultValue){
String str = readKeyBoard(limit,true);
return str.equals("") ? defaultValue : str;
}
}
视图(HouseView)
所有代码:
package com.xiaowang.HouseRent.HouseView;
import com.xiaowang.HouseRent.Service.HouseService;
import com.xiaowang.HouseRent.Tool.DetailedTool;
import com.xiaowang.HouseRent.domain.House;
import javax.tools.Tool;
import java.util.IllegalFormatCodePointException;
import java.util.Scanner;
//显示系统主界面菜单
public class HouseMenu {
boolean loop = true;
private char key = ' ';
private HouseService houseService = new HouseService(10);//定义一个对象数组并初始化大小
//修改房屋信息
public void updateHouse(){
System.out.println("--------------修改房屋---------------");
System.out.print("请选择要修改的房屋编号(-1退出):");
int updateId =DetailedTool.readInt();
if (updateId == -1){
System.out.println("--------------放弃修改房屋-------------");
return;
}
House house = houseService.find(updateId);
if (house != null){
System.out.print("姓名("+house.getName()+"):");
house.setName(DetailedTool.readString());
System.out.print("电话("+house.getPhone()+"):");
house.setPhone(DetailedTool.readString());
System.out.print("地址("+house.getAddress()+"):");
house.setAddress(DetailedTool.readString());
System.out.print("租金("+house.getRent()+"):");
house.setRent(DetailedTool.readInt());
System.out.print("状态("+house.getState()+"):");
house.setState(DetailedTool.readString());
System.out.println(house);
} else {
System.out.println("------------房屋不存在,修改失败-----------");
}
}
//退出系统功能
public void closeHouse(){
char c = DetailedTool.readConfirmSelection();
if (c == 'Y' || c == 'y'){
loop = false;
}else {
System.out.println("------------放弃退出系统-----------");
}
}
//查找房屋信息
public void findHouse(){
System.out.println("--------------查找房屋---------------");
System.out.println("请输入你要查找的id:");
int findId =DetailedTool.readInt();
House house = houseService.find(findId);
if (house !=null){
System.out.println(house);
}else{
System.out.println("--------------没有该房屋---------------");
}
}
//删除房屋功能
public void delHouses(){
System.out.println("--------------删除房屋信息---------------");
System.out.println("请选择待删除房屋编号(-1退出):");
int delId = DetailedTool.readInt();
if (delId == -1){
System.out.println("--------------放弃删除房屋信息-------------");
}
//调用工具中的删除方法,其中已经包含循环,所以这里不需要再循环
char choice = DetailedTool.readConfirmSelection();
if (choice == 'Y' || choice =='y' ){
if (houseService.del(delId)){
System.out.println("--------------删除房屋信息成功-------------");
}else {
System.out.println("--------------房屋编号不正确,删除失败-------------");
}
}else {
System.out.println("--------------放弃删除房屋信息-------------");
}
}
//新增房源功能
public void addHouses(){
System.out.println("--------------添加房屋---------------");
System.out.print("姓名:");
String name = DetailedTool.readString();
System.out.print("电话:");
String phone = DetailedTool.readString();
System.out.print("地址:");
String address =DetailedTool.readString();
System.out.print("月租:");
int rent = DetailedTool.readInt();
System.out.print("状态:");
String state = DetailedTool.readString();
//创建一个house对象来接收房屋信息,系统id是系统自增长来确定的
House newHouse = new House(0,name, phone, address, rent, state);
if (houseService.add(newHouse)){
System.out.println("--------------添加成功---------------");
}else {
System.out.println("--------------添加失败---------------");
}
}
//显示信息列表
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]);//输出房屋信息。因为前面有toString方法,所以直接可以输出
}
System.out.println("--------------房屋信息显示完毕--------------");
}
public void Menu(){//菜单显示方法
do {
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("\t\t\t请输入你的选择:");
//接收用户所选择的字符
key = DetailedTool.readChar();//调用了Tool工具的方法,因为在Tool里面定义为了static属性。所以可以直接进行调用
switch (key){
case '1':
addHouses();
break;
case '2':
findHouse();
break;
case '3':
delHouses();
break;
case '4':
updateHouse();
break;
case '5':
listHouses();
break;
case '6':
closeHouse();
}
}while (loop);
}
}
服务功能(Service):
所有代码:
package com.xiaowang.HouseRent.Service;
import com.xiaowang.HouseRent.domain.House;
/*
定义House[],保存House对象
1.响应HouseView的调用
2.完成对房屋信息的各种操作(crud增删改查)
* * */
public class HouseService {
private House[] houses;//用来存放house对象
private int houseNum = 1;//用来统计有多少个房屋信息,以防满了装不下,因为有一个初始化的对象所以值为1
private int idCount = 1;//id的值从1开始,后面使用++去自增,因为有默认的对象所以初始值为1
public HouseService(int size){//用一个构造器来指定数组的大小
houses = new House[size];
//为了配合测试。初始化一个House对象
houses[0]=new House(1,"wang","1918","本庄",5200,"未出租");
}
//查找房屋信息
public House find(int findId){
//遍历一遍数组,去判断id和输入的findId一不一样
for (int i = 0; i <houseNum ; i++) {
if (findId == houses[i].getId()){
return houses[i];
}
}
return null;
}
//删除一个房屋信息
public boolean del(int delId){
//应当先找到要删除的房屋信息对应的下标,下标和房屋编号不一样
int index =-1 ;//用来记录所要删除的房屋下标
for (int i = 0; i < houseNum; i++) {
if (delId == houses[i].getId()){
index = i;
}
}
if (index == -1){//说明房屋列表中没有要删除的这个信息
return false;
}
//如果找到则删除,删除的话可以用后面一个对象信息去覆盖当前对象信息
for (int i = index; i <houseNum-1; i++) {
houses[i]=houses[i+1];
houses[i].setId(houses[i].getId()-1);//前面一个对象被删除后,后面的对象向前移动,其id肯定也会变化
}
// houses[--houseNum] = null; 和下面两句话的功能一样
houses[houseNum-1] = null;//因为被删除后,后面对象依次往前移动,则原本的最后一个对象被置空
houseNum--;//少了一个对象指定要对象数少一
return true;
}
//添加一个add方法去添加新对象,返回bool值
public boolean add(House newHouse){
//得先判断还能不能添加,因为有可能满了,还未考虑扩容问题
if(houseNum == houses.length){
System.out.println("信息已满,不能添加。");
return false;
}
//相当于将添加的信息添加到数组首位空的地址
houses[houseNum++]=newHouse;
//id是系统自增长的,设计一个自增长的id,系统就可以自动添加id序号了
newHouse.setId(++idCount);
return true;
}
//定义一个list方法去返回house信息
public House[] list() {
return houses;
}
}
主功能(domain)主要是创建对象,里面就是简单的属性、构造器、getter、setter方法等,就不截图了,挺多的
直接上代码:’
package com.xiaowang.HouseRent.domain;
//编号 房主 电话 地址 月租 状态(为出租/已出租)
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;
}
//输出房屋的基本信息,输出格式:
// 编号 房主 电话 地址 月租 状态(为出租/已出租)
@Override
public String toString() {
return id +
"\t\t" + name +
"\t" + phone +
"\t" + address +
"\t\t" + rent +
"\t" + state +
'}';
}
}
最后就是测试类的主方法了
代码:
package com.xiaowang.HouseRent;
import com.xiaowang.HouseRent.HouseView.HouseMenu;
import com.xiaowang.HouseRent.domain.House;
public class HouseRentApp {
public static void main(String[] args) {
new HouseMenu().Menu();//匿名创建一个房屋对象
System.out.println("你已退出房屋出租系统!");
}
}
ending~~~