分享一个用Java开发的房屋出租系统
房屋出租系统需求
实现基于文本界面的《房屋出租软件》。能够实现对房屋信息的添加、修改和删除(用数组实现),并能够打印房屋明细表房屋出租系统界面项目界面主菜单
项目界面新增房源
项目界面查找房源
项目界面删除房源
项目界面修改房源
项目界面房屋列表
项目界面退出系统
房屋出租系统设计(!!)
项目设计程序框架图(分层模式当软件比较复杂,需要模式管理)
房屋出租系统实现
准备工具类Utility,提高开发效率
在实际开发中,公司都会提供相应的工具类和开发库,可以提高开发效率,程序员也需要能够看懂别人写的代码,并能够正确的调用。了解Utility类的使用测试Utility类项目功能实现完成House类
编号房主电话地址月租状态(未出租已出租packagecom。hspedu。houserent。domain;House的对象表示一个房屋信息publicclassHouse{编号房主电话地址月租状态(未出租已出租)privateintid;privateStringname;privateStringphone;privateStringaddress;privateintrent;privateStringstate;构造器和setter,getterpublicHouse(intid,Stringname,Stringphone,Stringaddress,intrent,Stringstate){this。idid;this。namename;this。phonephone;this。addressaddress;this。rentrent;this。statestate;}publicintgetId(){returnid;}publicvoidsetId(intid){this。idid;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this。namename;}publicStringgetPhone(){returnphone;}publicvoidsetPhone(Stringphone){this。phonephone;}publicStringgetAddress(){returnaddress;}publicvoidsetAddress(Stringaddress){this。addressaddress;}publicintgetRent(){returnrent;}publicvoidsetRent(intrent){this。rentrent;}publicStringgetState(){returnstate;}publicvoidsetState(Stringstate){this。statestate;}为了方便的输出对象信息,我们实现toString编号房主电话地址月租状态(未出租已出租)OverridepublicStringtoString(){returnidnamephoneaddressrentstate;}}复制代码项目功能实现显示主菜单和完成退出软件功能
实现功能的三部曲〔明确完成功能思路分析代码实现〕
功能说明:用户打开软件,可以看到主菜单,可以退出软件。
思路分析:在HouseView。java中,编写一个方法mainMenu,显示菜单。packagecom。hspedu。houserent。view;importcom。hspedu。houserent。domain。House;importcom。hspedu。houserent。service。HouseService;importcom。hspedu。houserent。utils。Utility;1。显示界面2。接收用户的输入3。调用HouseService完成对房屋信息的各种操作publicclassHouseView{privatebooleanlooptrue;控制显示菜单privatecharkey;接收用户选择privateHouseServicehouseServicenewHouseService(2);设置数组的大小为2根据id修改房屋信息publicvoidupdate(){System。out。println(修改房屋信息);System。out。println(请选择待修改房屋编号(1表示退出));intupdateIdUtility。readInt();if(updateId1){System。out。println(你放弃修改房屋信息);return;}根据输入得到updateId,查找对象返回的是引用类型〔即:就是数组的元素〕因此老师在后面对house。setXxx(),就会修改HouseService中houses数组的元素!HousehousehouseService。findById(updateId);if(housenull){System。out。println(修改房屋信息编号不存在。。);return;}System。out。print(姓名(house。getName()):);StringnameUtility。readString(8,);这里如果用户直接回车表示不修改该信息,默认if(!。equals(name)){修改house。setName(name);}System。out。print(电话(house。getPhone()):);StringphoneUtility。readString(12,);if(!。equals(phone)){house。setPhone(phone);}System。out。print(地址(house。getAddress()):);StringaddressUtility。readString(18,);if(!。equals(address)){house。setAddress(address);}System。out。print(租金(house。getRent()):);intrentUtility。readInt(1);if(rent!1){house。setRent(rent);}System。out。print(状态(house。getState()):);StringstateUtility。readString(3,);if(!。equals(state)){house。setState(state);}System。out。println(修改房屋信息成功);}根据id查找房屋信息publicvoidfindHouse(){System。out。println(查找房屋信息);System。out。print(请输入要查找的id:);intfindIdUtility。readInt();调用方法HousehousehouseService。findById(findId);if(house!null){System。out。println(house);}else{System。out。println(查找房屋信息id不存在);}}完成退出确认publicvoidexit(){这里我们使用Utility提供方法,完成确认charcUtility。readConfirmSelection();if(cY){loopfalse;}}编写delHouse()接收输入的id,调用Service的del方法publicvoiddelHouse(){System。out。println(删除房屋信息);System。out。print(请输入待删除房屋的编号(1退出):);intdelIdUtility。readInt();if(delId1){System。out。println(放弃删除房屋信息);return;}注意该方法本身就有循环判断的逻辑,必须输出YNcharchoiceUtility。readConfirmSelection();if(choiceY){真的删除if(houseService。del(delId)){System。out。println(删除房屋信息成功);}else{System。out。println(房屋编号不存在,删除失败);}}else{System。out。println(放弃删除房屋信息);}}编写addHouse()接收输入,创建House对象,调用add方法publicvoidaddHouse(){System。out。println(添加房屋);System。out。print(姓名:);StringnameUtility。readString(8);System。out。print(电话:);StringphoneUtility。readString(12);System。out。print(地址:);StringaddressUtility。readString(16);System。out。print(月租:);intrentUtility。readInt();System。out。print(状态:);StringstateUtility。readString(3);创建一个新的House对象,注意id是系统分配的,HousenewHousenewHouse(0,name,phone,address,rent,state);if(houseService。add(newHouse)){System。out。println(添加房屋成功);}else{System。out。println(添加房屋失败);}}编写listHouses()显示房屋列表publicvoidlistHouses(){System。out。println(房屋列表);System。out。println(编号房主电话地址月租状态(未出租已出租));House〔〕houseshouseService。list();得到所有房屋信息for(inti0;ihouses。length;i){大家想想,这里老韩有什么?雷,坑if(houses〔i〕null){如果为null,就不用再显示了break;}System。out。println(houses〔i〕);}System。out。println(房屋列表显示完毕);}显示主菜单publicvoidmainMenu(){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(请输入你的选择(16):);keyUtility。readChar();switch(key){case1:addHouse();break;case2:findHouse();break;case3:delHouse();break;case4:update();break;case5:listHouses();break;case6:exit();break;}}while(loop);}}复制代码项目功能实现完成显示房屋列表的功能
项目功能实现添加房屋信息的功能
项目功能实现完成删除房屋信息的功能
项目功能实现完善退出确认功能
项目功能实现完成根据id查找房屋信息的功能项目功能实现完成修改房屋信息的功能
packagecom。hspedu。houserent。service;importcom。hspedu。houserent。domain。House;HouseService。java类〔业务层〕定义House〔〕,保存House对象1。响应HouseView的调用2。完成对房屋信息的各种操作(增删改查c〔create〕r〔read〕u〔update〕d〔delete〕)publicclassHouseService{privateHouse〔〕houses;House数组保存House对象privateinthouseNums1;记录当前有多少个房屋信息privateintidCounter1;记录当前的id增长到哪个值构造器publicHouseService(intsize){newhouseshousesnewHouse〔size〕;当创建HouseService对象,指定数组大小为了配合测试列表信息,这里初始化一个House对象houses〔0〕newHouse(1,jack,112,海淀区,2000,未出租);}findById方法,返回House对象或者nullpublicHousefindById(intfindId){遍历数组for(inti0;ihouseNums;i){if(findIdhouses〔i〕。getId()){returnhouses〔i〕;}}returnnull;}del方法,删除一个房屋信息publicbooleandel(intdelId){应当先找到要删除的房屋信息对应的下标一定要搞清楚下标和房屋的编号不是一回事intindex1;for(inti0;ihouseNums;i){if(delIdhouses〔i〕。getId()){要删除的房屋(id),是数组下标为i的元素indexi;就使用index记录i}}if(index1){说明delId在数组中不存在(有点绕。。)returnfalse;}如果找到for(intiindex;ihouseNums1;i){houses〔i〕houses〔i1〕;}把当有存在的房屋信息的最后一个设置nullhouses〔houseNums〕null;returntrue;}add方法,添加新对象,返回booleanpublicbooleanadd(HousenewHouse){判断是否还可以继续添加(我们暂时不考虑数组扩容的问题)能否自己加入数组扩容机制()if(houseNumshouses。length){不能再添加System。out。println(数组已满,不能再添加了。。。);returnfalse;}把newHouse对象加入到,新增加了一个房屋houses〔houseNums〕newHouse;我们程序员需要设计一个id自增长的机制,然后更新newHouse的id!newHouse。setId(idCounter);returntrue;}list方法,返回housespublicHouse〔〕list(){returnhouses;}}复制代码
类。方法()因为当一个方法是static时,就是一个静态方法
最后HouseRentApp。javapackagecom。hspedu。houserent;importcom。hspedu。houserent。view。HouseView;publicclassHouseRentApp{publicstaticvoidmain(String〔〕args){byteb1123;b1100000;如果b1b1100000;编译都不能过System。out。println(b1);byteb2123;b2(byte)(b2100000);System。out。println(b2);创建HouseView匿名对象,并且显示主菜单,是整个程序的入口这里实际上不用接收了,因为接收后用处也不大:newhvnewHouseView();hv。mainMenu();newHouseView()。mainMenu();System。out。println(你退出房屋出租系统);}}复制代码
附:公用工具库Utility。javapackagecom。hspedu。houserent。utils;工具类的作用:处理各种情况的用户输入,并且能够按照程序员的需求,得到用户的控制台输入。importjava。util。;publicclassUtility{静态属性privatestaticScannerscannernewScanner(System。in);功能:读取键盘输入的一个菜单选项,值:15的范围return15publicstaticcharreadMenuSelection(){charc;for(;;){StringstrreadKeyBoard(1,false);包含一个字符的字符串cstr。charAt(0);将字符串转换成字符char类型if(c!1c!2c!3c!4c!5){System。out。print(选择错误,请重新输入:);}elsebreak;}returnc;}功能:读取键盘输入的一个字符return一个字符publicstaticcharreadChar(){StringstrreadKeyBoard(1,false);就是一个字符returnstr。charAt(0);}功能:读取键盘输入的一个字符,如果直接按回车,则返回指定的默认值;否则返回输入的那个字符paramdefaultValue指定的默认值return默认值或输入的字符publicstaticcharreadChar(chardefaultValue){StringstrreadKeyBoard(1,true);要么是空字符串,要么是一个字符return(str。length()0)?defaultValue:str。charAt(0);}功能:读取键盘输入的整型,长度小于2位return整数publicstaticintreadInt(){intn;for(;;){StringstrreadKeyBoard(10,false);一个整数,长度10位try{nInteger。parseInt(str);将字符串转换成整数break;}catch(NumberFormatExceptione){System。out。print(数字输入错误,请重新输入:);}}returnn;}功能:读取键盘输入的整数或默认值,如果直接回车,则返回默认值,否则返回输入的整数paramdefaultValue指定的默认值return整数或默认值publicstaticintreadInt(intdefaultValue){intn;for(;;){StringstrreadKeyBoard(10,true);if(str。equals()){returndefaultValue;}异常处理。。。try{nInteger。parseInt(str);break;}catch(NumberFormatExceptione){System。out。print(数字输入错误,请重新输入:);}}returnn;}功能:读取键盘输入的指定长度的字符串paramlimit限制的长度return指定长度的字符串publicstaticStringreadString(intlimit){returnreadKeyBoard(limit,false);}功能:读取键盘输入的指定长度的字符串或默认值,如果直接回车,返回默认值,否则返回字符串paramlimit限制的长度paramdefaultValue指定的默认值return指定长度的字符串publicstaticStringreadString(intlimit,StringdefaultValue){StringstrreadKeyBoard(limit,true);returnstr。equals()?defaultValue:str;}功能:读取键盘输入的确认选项,Y或N将小的功能,封装到一个方法中。returnY或NpublicstaticcharreadConfirmSelection(){System。out。println(请输入你的选择(YN):请小心选择);charc;for(;;){无限循环在这里,将接受到字符,转成了大写字母yYnNStringstrreadKeyBoard(1,false)。toUpperCase();cstr。charAt(0);if(cYcN){break;}else{System。out。print(选择错误,请重新输入:);}}returnc;}功能:读取一个字符串paramlimit读取的长度paramblankReturn如果为true,表示可以读空字符串。如果为false表示不能读空字符串。如果输入为空,或者输入大于limit的长度,就会提示重新输入。returnprivatestaticStringreadKeyBoard(intlimit,booleanblankReturn){定义了字符串Stringline;scanner。hasNextLine()判断有没有下一行while(scanner。hasNextLine()){linescanner。nextLine();读取这一行如果line。length0,即用户没有输入任何内容,直接回车if(line。length()0){if(blankReturn)returnline;如果blankReturntrue,可以返回空串elsecontinue;如果blankReturnfalse,不接受空串,必须输入内容}如果用户输入的内容大于了limit,就提示重写输入如果用户如的内容0limit,我就接受if(line。length()1line。length()limit){System。out。print(输入长度(不能大于limit)错误,请重新输入:);continue;}break;}returnline;}}
链接:https:juejin。cnpost7222431754475749434