Java - 快递管理的基础实现(面向对象、MVC框架、二维数组)

快递管理的基础实现

I.知识储备

1.面向对象:

面向对象是相对于面向过程来讲的,指的是把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事务的自然运行模式。
面向对象到面向过程,是程序员思想上从执行者到指挥者的转变。

2.MVC框架:

Model(模型):是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象负责在数据库中存取数据。
View(视图):是应用程序中处理数据显示的部分,通常视图是依据模型数据创建的。
Controller(控制器):是应用程序中处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
MVC分层有助于管理复杂的应用程序,因为您可以在一个时间内专门关注一个方面。例如,您可以在不依赖业务逻辑的情况下专注于视图设计。同时也让应用程序的测试更加容易。
MVC分层同时也简化了分组开发。不同的开发人员可同时开发视图、控制器逻辑和业务逻辑。(来自百度百科)

II.任务概述

采用二维数组的方式,存储快递。

1.管理员:

快递录入:柜子位置(系统产生,不能重复,认为柜子10排10列)、快递单号(输入)、快递公司(输入)、6位取件码(系统产生,不能重复)
删除快递(根据单号)
修改快递(根据单号)
查看所有快递(遍历)

2.普通用户:

快递取出(根据取件码):显示快递的信息和在哪个柜子中,从柜子中移除这个快递

III.代码实现

一、com.java.view包

1.Views类

v视图展示(欢迎,菜单,子菜单…)

package com.java.view;

import com.java.bean.Express;

import java.util.Scanner;

public class Views {
    private Scanner input = new Scanner(System.in);

    /**
     * 欢迎菜单
     */
    public void hello() {
        System.out.println("欢迎使用 XXX 快递管理系统!");
    }

    /**
     * 再见菜单
     */
    public void bye() {
        System.out.println("感谢您的使用,再见!");
    }

    /**
     * 主菜单
     * @return 1-管理员 2-普通用户 0-退出
     */
    public int menu() {
        System.out.println("请选择操作模式:");
        System.out.println("1.管理员");
        System.out.println("2.普通用户");
        System.out.println("0.退出");
        String text = input.nextLine();
        int num = -1;
        try {
            num = Integer.parseInt(text);
        } catch(NumberFormatException e) {
        }
        if (num < 0 || num > 2) {
            System.out.println("选择有误,请重新输入!");
            return menu();
        }
        return num;
    }

    /**
     * 管理员菜单
     * @return 1-快递录入 2-删除快递 3-修改快递 4-查看所有快递 0-退出
     */
    public int adminMenu() {
        System.out.println("请选择要执行的操作:");
        System.out.println("1.快递录入");
        System.out.println("2.删除快递");
        System.out.println("3.修改快递");
        System.out.println("4.查看所有快递");
        System.out.println("0.返回上一级");
        String text = input.nextLine();
        int num = -1;
        try {
            num = Integer.parseInt(text);
        } catch(NumberFormatException e) {
        }
        if (num < 0 || num > 4) {
            System.out.println("选择有误,请重新输入!");
            return adminMenu();
        }
        return num;
    }

    /**
     *快递录入
     * @return 包含快递单号和快递公司的快递对象
     */
    public Express add() {
        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("请输入要操作的快递单号:");
        String number = input.nextLine();
        return number;
    }

    /**
     * 打印快递信息
     * @param e 快递对象
     */
    public void printExpress(Express e) {
        System.out.println("快递单号:"+e.getNumber()+",快递公司:"+e.getCompany()+",取件码:"+e.getCode()+",所在柜子:第"+(e.getxAxis()+1)+"排第"+(e.getyAxis()+1)+"列");
    }

    /**
     * 修改快递
     * @return 包含快递单号和快递公司的快递对象
     */
    public Express update() {
        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 1-确认删除 2-取消操作
     */
    public int delete() {
        System.out.println("是否确认删除此快递?");
        System.out.println("1.确认删除");
        System.out.println("2.取消操作");
        String text = input.nextLine();
        int num = -1;
        try {
            num = Integer.parseInt(text);
        } catch(NumberFormatException e) {
        }
        if (num < 1 || num > 2) {
            System.out.println("选择有误,请重新输入!");
            return delete();
        }
        return num;
    }

    /**
     * 打印所有快递
     * @param es 所有快递对象
     */
    public void printAll(Express[][] es) {
        System.out.println("所有的快递信息如下:");
        for(int i=0;i<10;i++) {
            for(int j=0;j<10;j++) {
                if(es[i][j] != null) {
                    printExpress(es[i][j]);
                }
            }
        }
    }

    /**
     * 普通用户菜单
     * @return 取件码
     */
    public int userMenu() {
        System.out.println("正在进行快递取出操作!");
        System.out.println("请输入六位取件码:");
        String text = input.nextLine();
        int num = -1;
        try {
            num = Integer.parseInt(text);
        } catch(NumberFormatException e) {
        }
        if (num < 100000 || num > 999999) {
            System.out.println("取件码有误,请重新输入!");
            return userMenu();
        }
        return num;
    }

    /**
     * 快递柜已满
     */
    public void expressFull() {
        System.out.println("快递柜已满,录入失败!");

    }

    /**
     * 取件码不存在
     */
    public void codeNotExist() {
       System.out.println("取件码不存在,取件失败!");
   }

    /**
     * 单号已存在
     * @param select 1-录入失败 3-修改失败
     */
    public void expressExist(int select) {
        if(select == 1)
            System.out.println("此单号已存在,录入失败!");
        else if(select == 3)
            System.out.println("此单号已存在,修改失败!");
    }

    /**
     * 单号不存在
     * @param select 2-删除失败 3-修改失败
     */
    public void expressNotExist(int select) {
        if(select == 2)
            System.out.println("此单号不存在,删除失败!");
        else if(select == 3)
            System.out.println("此单号不存在,修改失败!");
    }

    /**
     * 操作成功
     * @param select 1-录入成功 2-删除成功 3-修改成功 4-取件成功
     */
    public void success(int select) {
        if(select == 1)
            System.out.println("快递录入成功,快递信息如下:");
        else if(select == 2)
            System.out.println("删除快递成功,删除的快递信息如下:");
        else if(select == 3)
            System.out.println("修改快递成功,修改后的快递信息如下:");
        else if(select == 4)
            System.out.println("以下是您的快递信息,请前往对应柜子取走您的快递:");
    }

}

二、com.java.bean包

2.Express类

作为快递对象,存取指定对象的各种属性,拥有get/set方法、构造方法、equals()、toString()等。

package com.java.bean;

import java.util.Objects;

public class Express {
    private String number;
    private String company;
    private int code;
    private int xAxis;
    private int yAxis;

    public Express() {
    }

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Express express = (Express) o;
        return Objects.equals(number, express.number);
    }

    @Override
    public int hashCode() {
        return Objects.hash(number);
    }

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

    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;
    }

    public int getxAxis() {
        return xAxis;
    }

    public void setxAxis(int xAxis) {
        this.xAxis = xAxis;
    }

    public int getyAxis() {
        return yAxis;
    }

    public void setyAxis(int yAxis) {
        this.yAxis = yAxis;
    }

}

三、com.java.dao包

3.ExpressDao类

D数据存取(快递数据),本次为基础实现,使用二维数组存取。

package com.java.dao;

import com.java.bean.Express;

import java.util.Random;

public class ExpressDao {
    private Express[][] data = new Express[10][10];
    private Random random = new Random();
    private int size = 0;

    /**
     * 用于存储快递对象
     * @param e 要存储的快递对象
     * @return true-存储成功 false-存储失败
     */
    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);
        e.setxAxis(x);
        e.setyAxis(y);
        data[x][y] = e;
        size++;
        return true;
    }

    /**
     * 随机生成取件码
     * @return 随机生成的取件码
     */
    private int randomCode() {
        while(true) {
            int code = random.nextInt(900000)+100000;
            Express e = findByCode(code);
            if(e == null) {
                return code;
            }
        }
    }

    /**
     * 根据快递单号查询快递对象
     * @param number 要查询的快递单号
     * @return 查询的结果,查询失败时返回null
     */
    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;
    }

    /**
     * 用于修改快递对象
     * @param oldExpress 旧的快递对象
     * @param newExpress 新的快递对象
     * @return true-修改成功 false-修改失败
     */
    public boolean update(Express oldExpress,Express newExpress) {
      Express e = findByNumber(newExpress.getNumber());
      if(e == null || e.equals(oldExpress)) {
          oldExpress.setNumber(newExpress.getNumber());
          oldExpress.setCompany(newExpress.getCompany());
          return true;
      } else {
          return false;
      }
    }

    /**
     * 用于删除快递对象
     * @param e 要删除的快递对象
     */
    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;
                    size--;
                    break p;
                }
            }
        }
    }

    /**
     * 遍历所有快递对象
     * @return 所有快递对象
     */
    public Express[][] findAll() {
        return data;
    }

}

四、com.java.main包

4.Main类

main方法,没什么可说的,更多的调度逻辑在Client类中。

package com.java.main;

import com.java.view.Views;

public class Main {

    public static void main(String[] args) {
        Views v = new Views();
        v.hello();
        m:while(true) {
            int menu = v.menu();
            switch(menu) {
                case 1: Cilent.adminClient(); break;
                case 2: Cilent.userClient(); break;
                case 0: break m;
            }
        }
        v.bye();
    }

}
5.Client类

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

package com.java.main;

import com.java.bean.Express;
import com.java.dao.ExpressDao;
import com.java.view.Views;

public class Cilent {
    private static Views v = new Views();
    private static ExpressDao dao = new ExpressDao();

    /**
     * 普通用户
     */
    public static void userClient() {
        int code = v.userMenu();
        Express e = dao.findByCode(code);
        if(e == null) {
            v.codeNotExist();
        } else {
            v.success(4);
            v.printExpress(e);
            dao.delete(e);
        }
    }

    /**
     * 管理员
     */
    public static void adminClient() {
        while(true) {
            int menu = v.adminMenu();
            switch (menu) {
                case 1: add(); break;
                case 2: delect(); break;
                case 3: update(); break;
                case 4: printAll(); break;
                case 0: return;
            }
        }
    }

    /**
     * 快递录入
     */
    private static void add() {
        Express e = v.add();
        Express e2 = dao.findByNumber(e.getNumber());
        if (e2 == null) {
            boolean result = dao.add(e);
            if (result) {
                v.success(1);
                v.printExpress(e);
            } else {
                v.expressFull();
            }
        } else {
            v.expressExist(1);
        }
    }

    /**
     * 删除快递
     */
    private static void delect() {
        String number = v.findByNumber();
        Express e = dao.findByNumber(number);
        if (e == null) {
            v.expressNotExist(2);
        } else {
            v.printExpress(e);
            int delete = v.delete();
            if (delete == 1) {
                dao.delete(e);
                v.success(2);
                v.printExpress(e);
            }
        }
    }

    /**
     * 修改快递
     */
    private static void update() {
        String number = v.findByNumber();
        Express e = dao.findByNumber(number);
        if (e == null) {
            v.expressNotExist(3);
        } else {
            v.printExpress(e);
            Express e2 = v.update();
            boolean result = dao.update(e, e2);
            if (result) {
                v.success(3);
                v.printExpress(e);
            } else {
                v.expressExist(3);
            }
        }
    }

    /**
     * 查看所有快递
     */
    private static void printAll() {
        Express[][] data = dao.findAll();
        v.printAll(data);
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
开发阳光旅行网app中用户下单功能,可实现用户添加订单并完善出行人信息、修改订单,删除订单以及打印行程信息等功能。 具体功能要求如下: (1)显示系统主菜单 包括添加出行订单、查看我的出行订单、修改订单信息、删除出行人、查看行程、退出系统6项功能,其他功能本项目不做要求,当用户选择功能编号后可进入执行相应功能。执行结果如图1所示。 图1 主菜单 (2)添加出行订单 填写出行日期、联系人手机号码、循环录入出行人信息。 出行人信息包括:  出行人类别:成人、儿童(1.2m以下)、老人(65岁以上)  姓名  年龄(如选择类别为老人,输入年龄不足65岁的,显示提示信息“对不起,老人订单年龄需为65岁以上!”)  如果是儿童,需确定是否占床 每成功录入一条出行人信息后,显示出其详细信息,并计算出行金额。定价如下:  成人:2000元/人  儿童:免费,如需占床另加30元  老人:半价,即1000元/人 当一条出行人信息录入完毕后,提示“是否继续添加(Y/N)?”,此处不区分大小写,当输入y或Y时继续录入下一条,否则显示订单信息,包括:  出行日期  联系人手机号码  订单总金额(即所有出行人定单金额之和) 最后显示主菜单。执行效果如图2所示。 图2 添加出行订单 (3)查看我的出行订单信息 查看我的出行订单:查看所录入的订单信息。包括出行日期、联系人手机号码、所有出行人信息,运行效果如图3所示。 图3 查看我的出行订单 (4)修改行程信息 可修改出行日期、联系人手机号码,要求手机号码必须为11位,否则抛出异常信息,提示“手机号码必须为11位”,运行效果如果4所示。 图4 手机号码不是11位 正确修改后,显示修改后的信息,并提示“修改成功!”。如图5所示。 图5 修改订单成功 (5)删除出行人 填写要删除的出行人姓名,执行删除操作,删除成功后给出提示“删除成功!”,如图6所示。如果输入姓名错误,则提示“对不起,定单中不包含此游客信息!”如图7所示。 图6 删除出行人成功 图7 删除出行人失败 (6)查看行程 显示本次旅行行程信息。即读取“旅游行程.txt”文件(素材提供),显示在控制台。运行效果如图8所示。 图8 查看行程 (7)退出系统 退出当前系统,显示“欢迎下次再来。”如图9所示。 三、要求与实现步骤 (一)不使用数据库,使用对象和集合存储数据 (二)定义实体类(成人订单、儿童订单、老人订单),儿童订单、老人订单为成人订单的子类。实体类至少包含但不局限于以上3个。 (三)在各实体类中均需实现各自计算订单价格、显示订单信息的方法,使用方法的重写。 (四)定义工具类,实现查看我的出行订单、添加订单、修改行程信息、删除出行人、查看行程等方法。需使用到对象传参。 (五)使用泛型集合存储所有出行人信息,使用集合的遍历实现查看订单信息、统计订单总金额、删除出行人等功能。 (六)显示信息时,只有儿童出行人需显示是否占座,需使用面向对象多态实现。 (七)修改行程信息时,当手机号码录入错误时需使用throw手动抛出异常。 (八)使用I/O技术实现文件的读取功能,将文本文件“行程信息.txt”中的内容显示到控制台。 (九)定义测试类,完成项目功能菜单以及整体流程,调用相应方法实现具体功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值