MVC模式

本文主要是基于快递管理系统的设计,来介绍MVC模式相关内容。
一、什么是MVC模式?
MVC(Model - View - Controller)是软件工程中的一种软件架构模式,它将系统分为三个部分,分别为:模型、视图和控制器。
1、模型(Model):表示数据的存取。用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法,Model有对数据直接访问的权力。
2、视图(View):表示视图效果。能够实现数据有目的的显示。一般在视图中不涉及程序的逻辑。在视图中也体现了面向对象的思想,将想给用户展示的信息封装成一个View类。
3、控制器(Controller):表示调用逻辑。程序入口,负责相应用户操作并调用相应的业务逻辑模块完成整个功能需求。
二、MVC模式的目的
主要是实现一种动态的程序设计,简化后续对程序的修改和扩展,并且使程序某一部分的重用成为可能,同时使程序结构更为直观。软件系统在分离了自身的基本部分的同时,也赋予了各个基本部分应有的功能。
个人理解:一般情况下,可以认为视图层与模型层是存在直接联系的,模型的变化可以通过视图层反映出来。
三、MVC流程
1、View接受用户的交互请求
2、View将请求转交给Controller
3、Controller操作Model进行数据更新
4、数据更新之后,Model通知View数据变化
5、View显示更新之后的数据
四、优缺点(不展开叙述)
1、优点
1)低耦合
2)重用性高
3)生命周期短
4)部署快
5)可维护性高
2、缺点
1)没有明确的定义
2)不适合中小型应用程序
3)增加系统结构和实现的复杂性
4)视图对模型数据的低效率访问
五、基于快递管理系统的代码实例
任务描述:
在这里插入图片描述
涉及知识点:
1、面向对象
2、集合
3、MVC模型
模块图:
在这里插入图片描述
1、View层
主要是一些输出信息,不涉及逻辑。

public class View {
    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 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
     */
    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 text = input.nextLine();
        int num = -1;
        try{
            num = Integer.parseInt(text);
        }catch(NumberFormatException e){

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

    /**
     * 录入快递
     */
    public Model insert(){
        System.out.println("请根据提示,输入快递信息:");
        System.out.println("请输入快递单号:");
        String number = input.nextLine();
        System.out.println("请输入快递公司:");
        String company = input.nextLine();
        Model m = new Model();
        m.setNumber(number);
        m.setCompany(company);
        return m;

    }

    /**
     * 提示输入快递单号,根据单号来查找快递
     * @return
     */
    public String findByNumber(){
        System.out.println("请根据提示,输入快递信息:");
        System.out.println("请输入要操作的快递单号:");
        String number = input.nextLine();
        return number;
    }
    public void print(Model m){
        System.out.println("快递信息如下:");
        System.out.println("快递公司:"+m.getCompany()+",快递单号:"+m.getNumber()+",取件码:"+m.getCode());
    }
    public void update(Model m){
        System.out.println("请输入新的快递单号:");
        String number = input.nextLine();
        System.out.println("请输入新的快递公司:");
        String company = input.nextLine();
        m.setCompany(company);
        m.setNumber(number);
    }
    public int delete(){
        System.out.println("是否确认删除?\n 1.确认删除\n 2.取消操作");
        String number = input.nextLine();
        int num = -1;
        try{
            num = Integer.parseInt(number);
        }catch (NumberFormatException e){

        }
        if(num<1||num>2){
            System.out.println("输入有误,请重新输入");
            return delete();
        }
        return num;
    }
    public void printAll(Collection<Model>ms){
        int count = 0;
        for (Model m:ms) {
            count++;
            System.out.println("第"+(m.posX+1)+"排"+(m.posY+1)+"列");
            print(m);
        }
        if(count==0){
            System.out.println("暂无快递信息!");
        }
    }
    public int userMenu(){
        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 userMenu();
        }
        return num;
    }
    public void success(){
        System.out.println("操作成功!");
    }
    public void exist(){
        System.out.println("此快递单号已存在!");
    }
    public void printNull(){
        System.out.println("快递不存在!");
    }


}

2、Model层
主要是快递信息

public class Model {
    private String number;
    private String company;
    private int code;
    public int posX,posY;

    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 Model(String number, String company, int code) {
        this.number = number;
        this.company = company;
        this.code = code;
    }

    public Model() {
    }

    @Override
    public String toString() {
        return "Model{" +
                "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;
        Model model = (Model) o;
        return code == model.code &&
                Objects.equals(number, model.number) &&
                Objects.equals(company, model.company);
    }

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

3、Controller层

public class Controller {
    boolean[][] cabinet = new boolean[10][10];
    HashMap<Integer,Model> data = new HashMap<>();
    Collection<Model> models = data.values();
    private int size;
    private Random r = new Random();

    public boolean add(Model m){
        if(size>=100){
            System.out.println("快递柜已满,不能存储快递!");
            return false;
        }
        int x = -1;
        int y = -1;
        while(true){
            x = r.nextInt(10);
            y = r.nextInt(10);
            if(cabinet[x][y]==false){
                break;
            }
        }
        int code = randomCode();
        m.setCode(code);
        m.posX = x;
        m.posY = y;
        cabinet[x][y] = true;
        data.put(code,m);
        return true;
    }
    public int randomCode(){
        while(true){
            int code = r.nextInt(900000)+100000;
            Model m = findByCode(code);
            if(m==null){
                return code;
            }
        }

    }
    public Model findByCode(int code){
        for (Model m:models) {
            if(m.getCode()==code){
                return m;
            }
        }
        return null;
    }
    public Model findByNumber(String number){
        for (Model m:models) {
            if(m.getNumber().equals(number)){
                return m;
            }
        }
        return null;
    }
    public void update(Model oldModel,Model newModel){
        delete(oldModel);
        add(newModel);
    }

    public void delete(Model m) {
        data.remove(m.getCode());
        cabinet[m.posX][m.posY] = false;
        size--;
    }
    public Collection<Model> findAll(){
        return models;
    }
}

4、Main

public class Main {
    private static View view = new View();
    private static Controller controller = new Controller();

    public static void main(String[] args) {
        view.welcome();
        m:while(true){
            int menu = view.menu();
            switch(menu){
                case 0:
                    break m;
                case 1:
                    cClient();
                    break ;
                case 2:
                    uClient();
                    break ;
            }
        }
        view.bye();
    }

    private static void cClient() {
        while(true){
            int menu = view.cMenu();
            switch(menu){
                case 0:
                    return;
                case 1:{
                    Model m = view.insert();
                    Model m2 = controller.findByNumber(m.getNumber());
                    if(m2==null){
                        controller.add(m);
                        view.print(m);
                    }
                    else{
                        view.exist();
                    }
                }
                    break;
                case 2:{
                    String number = view.findByNumber();
                    Model m = controller.findByNumber(number);
                    Model m2 = m;
                    if(m==null){
                        view.printNull();
                    }else{
                        view.print(m);
                        view.update(m2);
                        controller.update(m,m2);
                        view.print(m2);
                    }
                }
                    break;
                case 3:{
                    String number = view.findByNumber();
                    Model m = controller.findByNumber(number);
                    if(m==null){
                        view.printNull();
                    }else{
                        view.print(m);
                        int type = view.delete();
                        if(type==1){
                            controller.delete(m);
                            view.success();
                        }
                    }
                }
                    break;
                case 4:{
                    Collection<Model> data = controller.findAll();
                    view.printAll(data);
                }
                    break;
            }
        }
    }

    public static void uClient(){
        int code = view.userMenu();
        Model m = controller.findByCode(code);
        if(m==null){
            view.printNull();
        }else{
            view.success();
            view.print(m);
            controller.delete(m);
        }
    }
}

5、运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
后期会使用IO技术继续完善快递管理系统。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值