IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> Java入门-小区快递系统从0到1,从1到2的全过程(MVC模块) -> 正文阅读

[开发测试]Java入门-小区快递系统从0到1,从1到2的全过程(MVC模块)

????????

????????用小区快递系统作为一个案例来实操是非常贴近生活的,在很多小区已经普及了智能的快递柜。作为一个Java入门的小白该如何写好小区快递系统呢?用老师专业的话来说这是一个从0-1,再从1-2的过程。在之前的章节作业中就要求我们来编写一个小区快递系统(还没有涉及到面向对象),所以可想而知,代码就全部堆在一个类中,耦合度非常高,显得很杂乱。但是这就是从0-1的开始,没有比较就没有收获。先上我之前写的代码:

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class Ezhan {
    public static void main(String[] args) {
        //创建快递信息存储数组
        //快递单号
        int[] deliver = new int[3];
        //取件码
        int[] code1 = new int[3];
        //快递公司名称
        String[] name = new String[3];
        int index = -1;
        System.out.println("=====欢迎使用新职课快递柜=====");
        int over = 0;
        while (true) {
            System.out.println("请输入您的身份:1-快递员 2-用户");
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            if (n == 1) {  // 1 表示是快递员在操作 2表示用户在操作
                System.out.println("请选择操作:1-存快递 2=删除快递 3-修改快递信息 4-查看所有快递");
                Scanner a = new Scanner(System.in);
                int num = a.nextInt();
                switch (num) {
                    case 1:  //1-存快递

                        System.out.println("请输入快递单号:");
                        Scanner b = new Scanner(System.in);
                        int number = b.nextInt();
                        for (int i = 0; i < deliver.length; i++) {
                            if (deliver[i] == 0) {
                                index = i;
                                break;
                            }
                        }
                        deliver[index] = number;//通过遍历将快递单号存入数组
                        System.out.println("请输入公司名称");
                        Scanner c = new Scanner(System.in);
                        String company = c.next();
                        name[index] = company;//将公司名称存入数组
                        //随机生成取件码
                        int code = (int) ((Math.random() * 9 + 1) * 100);
                        code1[index] = code;//将取件码存入数组
                        System.out.println("快递已存入,取件码是:" + code);

                        break;

                    case 2://2-删除快递
                        int k = 0;//定义一个变量来判断是否找到了待删除的快递单号
                        System.out.println("请你输入要删除的快递单号:");
                        Scanner del = new Scanner(System.in);
                        int delnum = del.nextInt();//用户输入想要删除的快递单号
                        for (int i = 0; i < deliver.length; i++) {
                            if (deliver[i] == delnum)    //通过遍历判断数组中是否有待删除的快递单号
                            {
                                k = 1;//存在则将变量的值变为1
                                for (int j = i; j < deliver.length - 1; j++) {
                                    int temp = deliver[j];
                                    deliver[j] = deliver[j + 1];
                                    deliver[j + 1] = temp;
                                }//将待删除的快递单号的后面的每一个值覆盖前面的值
                                deliver[deliver.length - 1] = 0;//将快递单号的数组中最后一个值变为零
                                System.out.println("删除成功");
                            }
                        }
                        if (k == 0)    //如何变量k的值仍是0,则说明数组中没有要删除的对象
                        {
                            System.out.println("不存在该单号!");
                        }
                        break;

                    case 3:// 修改快递的数据
                        int f = 0;//定义变量c判断是否有待修改的快递单号
                        System.out.println("请输入要修改的快递单号:");
                        Scanner retry = new Scanner(System.in);
                        int renumber = retry.nextInt();
                        System.out.println("请输入新的快递单号:");
                        Scanner new1 = new Scanner(System.in);
                        int newnumber = new1.nextInt();
                        System.out.println("请输入新的公司名称:");
                        Scanner new2 = new Scanner(System.in);
                        String newcompany = new2.next();

                        for (int i = 0; i < deliver.length; i++) {
                            if (deliver[i] == renumber) {
                                f = 1;
                                deliver[i] = newnumber;
                                name[i] = newcompany;
                            }
                        }
                        if (f == 1) {
                            System.out.println("修改成功!");
                        } else {
                            System.out.println("没有该单号!");
                        }
                        break;

                    case 4://查看所有快递的信息
                        System.out.println("所有快递信息如下:");
                        System.out.println("快递单号" + "  " + "公司名称" + "  " + "取件码");
                        for (int i = 0; i < deliver.length; i++) {
                            if (deliver[i] != 0) {
                                System.out.print(deliver[i]);
                                System.out.print("    ");
                                System.out.print(name[i]);
                                System.out.print("      ");
                                System.out.print(code1[i]);
                                System.out.println();
                            }
                        }
                }
            } else  //在第一个选择,如果输入的不是1,则表示是用户在操作
            {
                int s = 0;
                System.out.println("请输入取件码:");
                Scanner re = new Scanner(System.in);
                int receivenum = re.nextInt();
                for (int i = 0; i < deliver.length; i++) {
                    if (code1[i] == receivenum) {
                        s = 1;
                        System.out.println("取件成功!");
                    }
                }
                if (s == 0) {
                    System.out.println("无该取件码!");
                }
            }
            System.out.println("是否还要进行操作 0-继续 1-结束");
            Scanner a1 = new Scanner(System.in);
            int u = a1.nextInt();
            if (u == 0) {
                continue;
            } else {
                break;
            }


        }
    }
}

?运行效果:

?下面看看从1-2的过程(单车变摩托!哈哈~)

1.视图-Views类

import java.util.Scanner;

//快递管理系统视图
public class Views {
    private Scanner input = new Scanner(System.in);

    /*
    欢迎界面
     */
    public void welcome() {
        System.out.println("欢迎使用快递管理系统!");
    }

    /*
    再见界面
     */
    public void bye() {
        System.out.println("欢迎下次使用!");
    }

    /**
     * 选择身份菜单
     *
     * @return
     */
    public int menu() {
        System.out.println("请根据提示,输入功能序号:");
        System.out.println("1.快递员");
        System.out.println("2.普通用户");
        System.out.println("0.退出");
        String choose = input.nextLine();
        int num = -1;
        //对于传入的num进行异常处理
        try {
            num = Integer.parseInt(choose);//将接受的字符型转为整形
        } catch (NumberFormatException e) {

        }
        if (num < 0 || num > 2) {
            System.out.println("输入有误,请重新输入");
            return menu();
        }
        return num;
    }

    /**
     * 快递员的菜单
     *
     * @return
     */
    public int cMenu() {
        System.out.println("请根据提示,输入功能序号:");
        System.out.println("1.快递录入");
        System.out.println("2.快递修改");
        System.out.println("3.快递删除");
        System.out.println("4.查看所有快递");
        System.out.println("0.返回上级目录");
        String choose = input.nextLine();
        int num = -1;
        try {
            num = Integer.parseInt(choose);//将接受的字符型转为整形
        } catch (NumberFormatException e) {

        }
        if (num < 0 || num > 4) {
            System.out.println("输入有误,请重新输入");
            return cMenu();
        }
        return num;
    }
    /**
     * 快递员录入快递
     *
     * @return 包含了快递单号喝快递公司的快递对象
     */
    public Express insert() {
        System.out.println("请根据提示,输入快递信息:");
        System.out.println("请输入快递单号:");
        String number = input.nextLine();
        System.out.println("请输入快递公司:");
        String company = input.nextLine();
        Express e = new Express();
        e.setNumber(number);
        e.setCompany(company);
        return e;

    }
    /**
     * 提示用户输入快递单号
     *
     * @return
     */
    public String findByNumber() {
        System.out.println("请根据提示,输入快递信息:");
        System.out.println("请输入要操作的快递单号:");
        String number = input.nextLine();
        return number;

    }
    /**
     * 显示快递信息
     *
     * @param e
     */
    public void printExpress(Express e) {
        System.out.println("快递信息如下");
        System.out.println("快递公司:" + e.getCompany() + ",快递单号:" + e.getNumber() + ",取件码:" + e.getCode());
    }
    /**
     * 修改快递信息
     *
     * @param e
     */
    public void update(Express e) {
        System.out.println("请输入新的快递单号:");
        String number = input.nextLine();
        System.out.println("请输入新的快递公司:");
        String company = input.nextLine();
        e.setCompany(company);
        e.setNumber(number);

    }
    /**
     * 询问是否确认删除
     *
     * @return 1.表示确认 2.表示取消操作
     */
    public int delete() {
        System.out.println("是否确认删除?");
        System.out.println("1.确认删除");
        System.out.println("2.取消操作");
        String choose = input.nextLine();
        int num = -1;
        try {
            num = Integer.parseInt(choose);//将接受的字符型转为整形
        } catch (NumberFormatException e) {

        }
        if (num < 1 || num > 2) {
            System.out.println("输入有误,请重新输入");
            return delete();
        }
        return num;
    }
    /**
     * 将给定数组的快递信息 遍历显示
     * @param es
     */
    public void printAll(Express[][] es) {
        for(int i=0;i<10;i++){
            for(int j=0;j<10;j++){
                if(es[i][j]!=null){
                    System.out.println("第"+(i+1)+"排"+(j+1)+"列快递:");
                    printExpress(es[i][j]);
                }
            }
        }

    }
    /**
     * 用户的菜单
     *
     * @return
     */
    public int uMenu() {
        System.out.println("请根据提示,进行取件:");
        System.out.println("请输入您的取件码:");
        String code = input.nextLine();
        int num = -1;
        try {
            num = Integer.parseInt(code);//将接受的字符型转为整形
        } catch (NumberFormatException e) {

        }
        if (num < 100000 || num > 999999) {
            System.out.println("输入有误,请重新输入");
            return uMenu();
        }
        return num;
    }

    public void expressExist(){
        System.out.println("此单号在快递柜中已存在,请勿重复存储。");
    }

    public void printnull(){
        System.out.println("快递不存在,请检查您的输入。");
    }

    public void printCode(Express e){
        System.out.println("快递的取件码为:"+e.getCode());

    }

    public void success(){
        System.out.println("操作成功!");
    }

    public void printhavenull(int i){
        if(i==0){
            System.out.println("快递柜为空.");
        }

    }
}

2.数据存储-Express类

public class Express {
    //快递单号
    private String number;
    //快递公司名称
    private String company;
    //取件码
    private int code;

    public Express(String number, String company, int code) {
        this.number = number;
        this.company = company;
        this.code = code;
    }

    @Override
    public String toString() {
        return "Express{" +
                "number='" + number + '\'' +
                ", company='" + company + '\'' +
                ", code=" + code +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Express express = (Express) o;

        return number != null ? number.equals(express.number) : express.number == null;
    }

    @Override
    public int hashCode() {
        return code;
    }

    public Express() {
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }
}

?3.调度逻辑-ExpressDao类

import ExpressMangement.Express;
import javax.print.DocFlavor;
import java.util.Random;


public class ExpressDao {
    private Express[][] data = new Express[10][];

    //当前存储的快递数量
    private int size;

    {
        for (int i = 0; i < 10; i++) {
            data[i] = new Express[10];
        }
    }

    private Random random = new Random();

    /**
     * 用于存储快递
     *
     * @param e
     * @return
     */
    public boolean add(Express e) {
        if (size == 100) {
            return false;
        }
        //1.随机生成2个0-9的下标
        int x = -1;
        int y = -1;
        while (true) {
            x = random.nextInt(10);
            y = random.nextInt(10);
            if (data[x][y] == null) {
                //此位置无快递
                break;
            }
        }
        //2.生成取件码
        int code = randomCode();
        e.setCode(code);
        data[x][y] = e;
        return true;
    }

    /**
     * 模板方法设计模式
     *
     * @return
     */
    private int randomCode() {
        while (true) {
            int code = random.nextInt(900000) + 100000;
            Express e = findByCode(code);
            if (e == null) {
                return code;
            }
        }
    }

    public Express findByNumber(String number) {
        Express e = new Express();
        e.setNumber(number);
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                if (e.equals(data[i][j])) {
                    return data[i][j];
                }
            }
        }
        return null;
    }

    /**
     * 根据取件码查询快递
     *
     * @param code 要查询的取件码
     * @return 查询失败返回null
     */
    public Express findByCode(int code) {
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                if (data[i][j] != null)
                    if (data[i][j].getCode() == code) {
                        return data[i][j];
                    }
            }
        }
        return null;
    }

    /**
     * 多余的操作,为了mvc更圆润
     *
     * @param old
     * @param new1
     */
    public void update(Express old, Express new1) {
        delete(old);
        add(new1);
    }

    public void delete(Express e) {
        p:
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                if (e.equals(data[i][j])) {
                    data[i][j] = null;
                    break p;
                }
            }
        }
    }

    /**
     * 将给定的数组的快递信息 遍历显示
     */
    public Express[][] findAll() {

        return data;
    }

    public int haveNull(Express[][] e) {
        int x = 0;
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                if (data[i][j] != null) {
                    x++;
                }
            }
        }
        return x;
    }

}

4.Main方法测试-Main类

public class Main {
    //初始化试图对象
    static Views view = new Views();
    //初始化dao对象
    static ExpressDao dao = new ExpressDao();

    //1.欢迎
    public static void main(String[] args) {

        view.welcome();

        //2. 弹出身份选择菜单
        while (true) {
            int menu = view.menu();
            switch (menu) {
                case 0:
                    return;
                case 1:
                    cClient();
                    break;
                case 2:
                    uClient();
                    break;
            }
        }


    }

    public static void cClient() {
        while (true) {
            int menu = view.cMenu();
            switch (menu) {
                case 0:
                    return;
                case 1: {
                    //1.提示输入快递信息
                    Express e = view.insert();
                    //2.判断快递是否已经存储
                    Express e2 = dao.findByNumber(e.getNumber());
                    //3.存快递
                    if (e2 == null) {
                        dao.add(e);
                    } else {
                        view.expressExist();
                    }
                    break;
                }
                case 2: {//修改快递
                    //1.提示输入信息
                    String number = view.findByNumber();
                    dao.findByNumber(number);
                    Express e = dao.findByNumber(number);
                    Express e2 = e;
                    if (e == null) {
                        view.printnull();
                    } else {
                        view.printExpress(e);
                        //4.提示修改
                        view.update(e2);
                        dao.update(e, e2);
                        view.printCode(e2);
                    }

                }
                break;
                case 3:
                    //删除
                    String number = view.findByNumber();
                    Express e = dao.findByNumber(number);
                    if (e == null) {
                        view.printnull();
                    } else {
                        view.printExpress(e);
                        int type = view.delete();
                        if (type == 1) {
                            dao.delete(e);
                            view.success();
                        }
                    }

                    break;
                case 4: {
                    //查看所有

                    Express[][] data = dao.findAll();
                    int i = dao.haveNull(data);
                    view.printhavenull(i);
                    view.printAll(data);

                }

                break;
            }
        }
    }

    public static void uClient() {
        //1.获取取件码
        int code = view.uMenu();
        //2.根据取件码取出快递
        Express e = dao.findByCode(code);
        if (e == null) {
            view.printnull();
        } else {
            view.success();
            view.printExpress(e);
        }
????}
}

看看运行的效果:

将第一次写的代码和第二次写的进行比较,会发现运用面向对象写的代码多了好几倍,运行效果差别不是很大。但是仔细阅读代码,便会发现第二次代码的思路非常清楚,每一个类都有单独且完整的功能,在最后的测试类中,只要根据需求有序的调用他们就可以实现。虽然在这类小项目中,代码量会显得多的多,但是一旦到了特别大的项目,使用MVC低耦合、高复用的优势便会显现。

模块分析:

1.V视图展示(欢迎,菜单,子菜单......)

2.D数据存取(快递数据)

3.C调度逻辑(根据视图接受收到的用户输入的内容,调度数据)

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-08-06 10:07:54  更:2021-08-06 10:09:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 20:27:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码