房屋出租项目

目录

一、项目需求

 二、项目界面

三、思路分析

 四、Utility工具类

五、House类

 六、HouseView

七、HouseList

八、添加房屋信息

九、删除房屋信息

十、退出程序

十一、查找

十二、修改


一、项目需求

 二、项目界面

房屋出租项目_第1张图片

 房屋出租项目_第2张图片

房屋出租项目_第3张图片

 房屋出租项目_第4张图片

退出程序 

房屋出租项目_第5张图片

三、思路分析

分层模式

在IDEA中分别创建package

房屋出租项目_第6张图片

 四、Utility工具类

主要功能:完成房屋出租项目需要用到的数据的输入

Utility类中的方法一览

房屋出租项目_第7张图片

 TestUtility类

package com.hspedu.houserent.utils;

public class TestUtility {
    public static void main(String[] args) {
        String s1 = Utility.readString(3);//限制长度为3
        System.out.println("s=" + s1);
        //限制长度为10,如果直接回车,则默认s2="hspedu"
        String s2 = Utility.readString(10, "hspedu");
        System.out.println("s2=" + s2);
    }
}

房屋出租项目_第8张图片

五、House类

数据层:一个House对象代表一条房屋信息 

首先判断House对象有哪些属性:从下图中可知主要有

编号、房主、电话、地址、月租、状态

以上几个属性

房屋出租项目_第9张图片

package com.hspedu.houserent.domain;

public class House {
    private int id;
    private String name;
    private String phoNum;
    private String address;
    private int rent;
    private String state;

    public House(int id, String name, String phoNum, String address, int rent, String state) {
        this.id = id;
        this.name = name;
        this.phoNum = phoNum;
        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 getPhoNum() {
        return phoNum;
    }

    public void setPhoNum(String phoNum) {
        this.phoNum = phoNum;
    }

    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" + name +
                "\t" + phoNum +
                "\t" + address +
                "\t" + rent +
                "\t" + state;

    }
}

 六、HouseView

化繁为简

实现功能三部曲:明确功能-->思路分析-->代码实现

房屋出租项目_第10张图片

 mainMenu方法

package com.hspedu.houserentziji.houseview;

import com.hspedu.houserentziji.utils.Utility;

/**
 *1.显示界面
 * 2. 接收用户的输入
 * 3. 调用HouseService 完成对房屋信息的各种操作
 */
public class HouseView {
    private boolean loop = true;
    private char key = ' ';
    public void mainMenu(){
        do{
            System.out.println("--------房屋出租系统--------");
            System.out.println("\t\t1 新增房源");
            System.out.println("\t\t2 查找房屋");
            System.out.println("\t\t3 删除房屋");
            System.out.println("\t\t4 修改房屋信息");
            System.out.println("\t\t5 房屋列表");
            System.out.println("\t\t6 退出");
            System.out.print("请输入(1-6):");
            key = Utility.readChar();
            switch (key){
                case '1':
                    //新增
                    break;
                case '2':
                    //查找
                    break;
                case '3':
                    //删除
                    break;
                case '4':
                    //修改
                    break;
                case '5':
                    //房屋列表
                    break;
                case '6':
                    loop = false;
                    break;
            }

        }while(loop);
        System.out.println("========退出了房屋出租系统========");
    }

}

和零钱通的mianMenu方法模式相同

七、HouseList

Service层

package com.hspedu.houserentziji.houseservice;

import com.hspedu.houserentziji.domain.House;

public class HouseService {
    //用数组存储房屋信息,元素是House对象
    //但是不能确定数组内有多少条房屋信息,即数组的长度
    private House[] houses;

    //通过构造器定义数组长度

    public HouseService(int size) {
        houses = new House[size];
        //举例定义数组中的一个元素
        houses[0] = new House(1,"jack","13505150925","浦东区141弄",3500,"未出租");
    }
    public House[] list(){
        return houses;//直接返回一个数组
    }
}

View层

//创建HouseService对象,这样就可以通过此对象调用HouseService类中的方法
    private HouseService houseService = new HouseService(10);//定义数组长度
public void listHouses(){
        System.out.println("--------房屋列表--------");
        System.out.println("编号\t房主\t\t电话\t\t\t地址\t\t\t\t月租\t\t状态(未出租/已出租)");
        House[] houses = houseService.list();//接收返回的数组
        //循环遍历输出数组的每个元素,即每一条房屋信息
        for (int i = 0; i < houses.length; i++) {
            //增加判断条件,如果数组元素为null,则跳过不输出
            if (houses[i] == null){
                continue;//跳过但是并不是跳出整个for循环,老师用的break
            }
            System.out.println(houses[i]);

        }
    }

八、添加房屋信息

 public void addHouse(){
        System.out.println("--------添加房屋--------");
        System.out.print("姓名:");
        String name = Utility.readString(10);
        System.out.print("电话:");
        String phoNum = com.hspedu.houserent.utils.Utility.readString(15);
        System.out.print("地址:");
        String address = com.hspedu.houserent.utils.Utility.readString(30);
        System.out.print("月租:");
        int rent = com.hspedu.houserent.utils.Utility.readInt();
        System.out.print("状态:");
        String state = com.hspedu.houserent.utils.Utility.readString(3);
        //编号采取自增模式
        //将输入的数据创建成一条完成的房屋信息
        House house = new House(0, name, phoNum, address, rent, state);
        //然后通过调用HouseService中的add()方法,完成添加
        if(houseService.add(house)){//如果返回真
            System.out.println("--------添加完成--------");
        }else{
            System.out.println("--------存储空间已满,无法再添加");
        }
    }
private int houseNums = 1;//构造器中已经有一条房屋信息
    private int idCounter = 1;//已经有了编号1
     public boolean add(House newHouse){//将house改成newHouse,这样更明确且可以区分
        //首先判断有没有空间添加
        //1.添加HouseNums属性,记录房屋信息条数
        //2.如果houseNums = houses.length,即数组已满,没有添加的空间,直接返回false
        //3.如果还有空间,则进行添加
        //id自增长问题,创建idCounter属性,添加成功后,房屋的编号也会自动+1,所以
        if(houseNums == houses.length){
            return false;
        }
        houses[houseNums++] = newHouse;

        newHouse.setId(++idCounter);
        return true;

    }

延伸:如果把数组的长度设置为2,然后再新增房屋信息时,如果数组已满,对数组进行扩容

        if(houseNums == houses.length){
            //数组扩容
            House[] houses1 = new House[houses.length+1];
            for (int i = 0; i < houses.length; i++) {
                houses1[i] = houses[i];
            }
            houses1[houseNums++] = newHouse;
            houses = houses1;
            newHouse.setId(++idCounter);
            return true;
        }

运行后没有问题

九、删除房屋信息

 //删除功能
    public void delHouse(){
        System.out.println("--------删除房屋--------");

        System.out.print("请选择带删除编号(-1退出):");
        int delId = Utility.readInt();
        if(delId == -1){
            System.out.println("--------退出删除房屋功能--------");
            return;//结束这个方法
        }
        System.out.print("确认是否删除(Y/N),请小心选择:");
        char choice = Utility.readConfirmSelection();
        if(choice == 'Y'){//完成删除操作
            //如果返回的是true,就完成删除操作
            if(houseService.del(delId)){
                System.out.println("--------房屋信息删除成功--------");
            }else{
                //返回false,即编号不存在
                System.out.println("----编号不存在,房屋信息删除失败----");
            }

        }else{
            System.out.println("--------退出删除房屋功能--------");
        }
    }
    public boolean del(int getId){
        //首先判断id在数组中是否存在
        int index = -1;
        for (int i = 0; i < houseNums; i++) {
            if(getId == houses[i].getId()){
                index = i;
            }
        }
        if(index == -1){//数组中没有找到
            return false;
        }
        //找到之后,完成删除操作,并将数组元素依次前移
        //houseNums-1,这样移动到倒数第二个元素后就会结束循环
        for (int i = index; i < houseNums-1; i++) {

            houses[i] = houses[i+1];
        }
        //将最后一个元素置空,并且houseNums-1
        houses[--houseNums] = null;
        return true;

    }

十、退出程序

    public void exitHouse(){
        System.out.print("确认是否退出(Y/N):");
        char answer = Utility.readConfirmSelection();
        if(answer == 'Y'){//这里必须是大写的Y,因为在上述方法中已经把输入的字母转化成大写的形式
            loop = false;
        }
    }

十一、查找

    //查找功能
    //
    public void findHouse(){
        System.out.println("--------查找房屋--------");
        System.out.print("请输入你要查找的房屋编号:");
        int findID = Utility.readInt();
        House house = houseService.find(findID);//接收返回的信息
        if(house == null){
            System.out.println("------你输入的编号不存在------");
            return;//结束该方法
        }
        System.out.println(house);

    }

    public House find(int findId){
        //首先查找是否存在该id
        //返回条件必须是houseNums,如果是houses.length的话,假如只有一条房屋信息
        //但是查找的时候findId为3,就会报NullPointerException
        //原因:此时houses[1] = null
        for (int i = 0; i < houseNums; i++) {
            if(findId == houses[i].getId()){
                return houses[i];
            }
        }
        //如果循环结束,没有返回值的话,说明数组中没有该编号,返回null
        return null;
    }

十二、修改

//修改房屋信息,如果不想修改,直接回车即可
    //思路分析:1.首先查找是否有此id
    //2.如果没有,则返回null,无法修改
    //3.如果有,则修改房屋信息
    //老师代码:直接利用查找功能写的方法,得到返回的房屋信息,在此基础上进行修改
    public void modifyHouse(){
        System.out.println("--------修改房屋--------");
        System.out.print("请选择待修改房屋编号(-1退出):");
        int modId = Utility.readInt();
        if(modId == -1){
            System.out.println("--------退出修改房屋功能--------");
            return;//结束这个方法
        }
        //根据输入的modId查找对象
        House house = houseService.find(modId);
        if(house == null){
            System.out.println("------你输入的编号不存在,无法修改------");
            return;//结束该方法
        }
        System.out.print("姓名(" + house.getName() + "):");
        //如果直接回车,返回原来的值,这个问题没有想出解决办法
        //给一个默认值"",即如果用户直接回车,name = "";
        //String name = Utility.readString(10,"");
        //进一步判断,如果name不是"",那么就利用set方法修改对象house的属性name
//        if(!"".equals(name)){//!""是对""进行取反,即name是有内容的,不是空字符串
//            house.setName(name);
//        }
        //第二种方法:如果回车的时候,默认值是house.getName
        //即:如果用户有输入,就得到输入的结果,如果直接回车,返回的还是原来的name
        //这样就不用判断,直接将结果通过set方法赋给name属性
        String name = Utility.readString(10,house.getName());
        house.setName(name);

        System.out.print("电话(" + house.getPhoNum() + "):");
        String phone = Utility.readString(15,house.getPhoNum());
        house.setPhoNum(phone);

        System.out.print("地址(" + house.getAddress() + "):");
        String address = Utility.readString(30,house.getAddress());
        house.setAddress(address);

        System.out.print("月租(" + house.getRent() + "):");
        int rent = Utility.readInt(house.getRent());
        house.setRent(rent);

        System.out.print("状态(" + house.getState() + "):");
        String state = Utility.readString(3,house.getState());
        house.setState(state);
        System.out.println("--------修改完成--------");

    }

你可能感兴趣的:(java)