【 java 面向对象】基于文本界面的客户信息管理系统

简介: 对于面向对象这一块的复习,以这个项目为核心复习吧!本项目模拟实现一个基于文本界面的客户信息管理软件,进一步掌握编程技巧和调试技巧,熟悉面向对象编程!

@TOC

前言

对于面向对象这一块的复习,以这个项目为核心复习吧!本项目模拟实现一个基于文本界面的客户信息管理软件,进一步掌握编程技巧和调试技巧,熟悉面向对象编程!

项目涉及知识点

类结的的使用,属性、方法及构造器
对象的创建与使用
类的封装性
声明和使用数组
数组的插入、删除和替换
关键字的使用: this

软件设计结构

在这里插入图片描述
CustomerView 为主模块,负责菜单的显示和处理用户操作。

CustomerList 为 Customer 对象的管理模块,内部用数组管理一组 Customer 对象,并提供相应的添加、修改、删除和遍历方法,供 CustomerView 调用。

Customer 为实体对象,用来封装客户信息。

设计

Customer类的设计

  • Customer 为实体类,用来封装客户信息
  • 该类封装客户的以下信息;

String name:客户姓名
char sex : 性别
int age : 年龄
String phone :电话号码
String email :电子邮箱

  • 提供各属性的 get、set 方法
  • 提供所需的构造器

实际上Customer类就是一个javabean !

CustomerList类的设计

  • CustomerList 为 Customer 对象的管理模块,内部使用数组管理一组 Customer 对象
  • 本类封装以下信息:
    Customer [ ] customers :用来保存客户对象的数组
    int total =0 : 记录已保存客户对象的数量
  • 该类至少提供以下构造器和方法:
    public CustomerList ( int totalCustomer )
    public boolean addCustomer ( Customer customer )
    public boolean replaceCustomer ( int index , Customer customer )
    public boolean deleteCustomer ( int index )
    public Customer[] getAllCustomers( )
    public Customer getCustomer ( int index )
    public int getTotal ()

CustomerView类的设计

  • CustomerView 为主模块,负责菜单的显示和处理用户操作

本类封装以下信息:
CustomerList customerList = new CustomerList (10);
创建最大包含10个客户对象的 CustomerList 对象,供以下各成员方法使用。

  • 该类至少提供以下方法:
    public void enterMainMenu()
    private void addNewCustomer ()
    private void modifyCustomer ()
    private void deleteCustomer ()
    private void listAllCustomers ()
    public static void main ( String[] args )

CustomerUtil类

这是一个工具类,将不同的功能封装为方法,就是可以直接通过调用方法使用他的功能,无需考虑功能的具体实现细节!

代码

Customer.java

package myProject;
/*
 * Customer 为实体对象,用来封装客户信息。
 */
public class Customer {
    private String name;  //客户姓名
    private char sex; //性别
    private int age; // 年龄
    private String phone; //电话号码
    private String email; //电子邮箱

    public Customer() {
    }

    public Customer(String name, char sex, int age, String phone, String email) {
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.phone = phone;
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

CustomerList.java

package myProject;
/*
 * CustomerList 为 Customer 对象的管理模块,
 * 内部用数组管理一组 Customer 对象,并提供相应的添加、修改、删除和遍历方法,
 * 供 CustomerView 调用。
 */
public class CustomerList {
    private Customer[] customers;  //用来保存客户对象的数组
    private int total = 0;  //记录已保存客户对象的数量

    // 用来初始化customer数组的构造器,totalCustomer指定数组长度
    public CustomerList(int totalCustomer){
        customers = new Customer[totalCustomer];

    }

    // 将指定的客户添加到数组中
    public boolean addCustomer(Customer customer){
        if (total >= customers.length){
            return false;
        }
        customers[total] = customer;
        total++;
        return true;
    }

    // 修改指定索引位置上的客户信息,customer为修改后的新对象
    public boolean replaceCustomer(int index,Customer customer){
        if(index<0 || index>=total){
            return false;
        }
        customers[index] = customer;
        return true;
    }

    // 删除指定索引位置上的客户
    public boolean deleteCustomer(int index){
        if(index<0 || index>=total){
            return false;
        }

        for(int i = index;i < total-1;i++){
            customers[i] = customers[i+1];
        }
        customers[total-1]=null;
        total--;
        return true;
    }

    // 获取所有客户信息
    public Customer[] getAllCustomers(){
        return this.customers;
    }

    // 按照索引查找客户
    public Customer getCustomer(int index){
        if(index<0 || index>=total){
            return null;
        }
        return this.customers[index];
    }

    // 获取客户的数量
    public int getTotal(){
        return this.total;
    }
}

CustomerView.java(项目入口文件)

package myProject;
/*
 * CustomerView 为主模块,负责菜单的显示和处理用户操作。
 */
public class CustomerView {
    private  CustomerList customerList = new CustomerList(10);

    // 显示客户信息管理界面
    public void enterMainMenu(){
        boolean flag = true;
        while (flag){
            System.out.println("\n------------------客户信息管理-----------------");
            System.out.println("                  1.添加客户");
            System.out.println("                  2.修改客户");
            System.out.println("                  3.删除客户");
            System.out.println("                  4.客户列表");
            System.out.println("                  5.退出\n");
            System.out.print("请选择(1-5): ");

            char menu = CustomerUtil.readMenuSelect();
            switch (menu){
                case '1': addNewCustomer(); break;
                case '2': modifyCustomer(); break;
                case '3': deleteCustomer(); break;
                case '4': listAllCustomers(); break;
                case '5':
                    System.out.println("确认是否退出(Y/N): ");
                    char isExit = CustomerUtil.readConfirmSelect();
                    if(isExit == 'Y'){
                        flag = false;
                    }
            }
        }
    }


    // 添加客户操作
    private void addNewCustomer(){
        System.out.println("------------------添加客户-----------------");
        System.out.print("姓名:");
        String name = CustomerUtil.readString(10);
        System.out.print("性别:");
        char sex = CustomerUtil.readChar();
        System.out.print("年龄:");
        int age = CustomerUtil.readInt();
        System.out.print("电话:");
        String phone = CustomerUtil.readString(13);
        System.out.print("邮箱:");
        String email = CustomerUtil.readString(30);
        // 将上述数据封装到对象
        Customer customer = new Customer(name,sex,age,phone,email);

       boolean isSuccess =  customerList.addCustomer(customer);
       if(!isSuccess){
           System.out.println("-----------------客户目录已满,添加失败!------------------");
       }else{
           System.out.println("-----------------添加完成------------------");
       }
    }


    // 修改客户信息操作
    private void modifyCustomer(){
        System.out.println("------------------修改客户-----------------");
        Customer cust;
        int number;
        while(true){
            System.out.println("请选择待修改客户编号(-1退出):");
            number = CustomerUtil.readInt();
            if (number == -1){
                return;
            }
            cust = customerList.getCustomer(number - 1);
            if(cust == null){
                System.out.println("无法找到指定客户!");
            }else{
                break;
            }
        }
        // 修改客户信息
        System.out.print("姓名(" + cust.getName() + "): ");
        String name = CustomerUtil.readString(10,cust.getName());
        System.out.print("性别(" + cust.getSex() + "): ");
        char sex = CustomerUtil.readChar(cust.getSex());
        System.out.print("年龄(" + cust.getAge() + "): ");
        int age = CustomerUtil.readInt(cust.getAge());
        System.out.print("电话(" + cust.getPhone() + "): ");
        String phone = CustomerUtil.readString(13,cust.getPhone());
        System.out.print("邮箱(" + cust.getEmail() + "): ");
        String email = CustomerUtil.readString(30,cust.getEmail());

        Customer newCust = new Customer(name, sex, age, phone, email);
        boolean isReplaced = customerList.replaceCustomer(number-1,newCust);
        if(isReplaced){
            System.out.println("------------------修改成功-----------------");
        }else{
            System.out.println("------------------修改失败!-----------------");
        }
    }

    // 删除客户操作
    private void deleteCustomer(){
        System.out.println("------------------删除客户-----------------");
        int number;
        while(true){
            System.out.println("请选择待修改客户编号(-1退出):");
            number = CustomerUtil.readInt();
            if (number == -1){
                return;
            }
            Customer cust = customerList.getCustomer(number - 1);
            if(cust == null){
                System.out.println("无法找到指定客户!");
            }else{
                break;
            }
        }

        System.out.println("确认是否删除(Y/N): ");
        char isDelete = CustomerUtil.readConfirmSelect();
        if(isDelete == 'Y'){
            boolean isSuccess = customerList.deleteCustomer(number-1);
            if(isSuccess){
                System.out.println("------------------删除成功-----------------");
            }else{
                System.out.println("------------------删除失败-----------------");
            }
        }
    }


    // 显示客户列表操作
    private void listAllCustomers(){
        System.out.println("--------------------客户列表---------------------");
        int total = customerList.getTotal();
        if(total == 0){
            System.out.println("没有客户记录!");
        }else{
            System.out.println("编号 \t姓名 \t性别 \t年龄 \t电话 \t\t 邮箱");
            Customer[] custs = customerList.getAllCustomers();
            for(int i = 0;i<customerList.getTotal();i++){
                System.out.println((i+1) + " \t\t" + custs[i].getName() + " \t" + custs[i].getSex()
                        + " \t\t" + custs[i].getAge() + " \t\t" +custs[i].getPhone()
                        + " " +custs[i].getEmail());
            }
        }

        System.out.println("-------------------客户列表完成-------------------");
    }


    public static void main(String[] args){
        CustomerView customerView = new CustomerView();
        customerView.enterMainMenu();

    }
}

CustomerUtil.java

package myProject;

import java.util.Scanner;

/*
 * 将不同的功能封装为方法,就是可以直接通过调用方法使用他的功能,无需考虑功能的具体实现细节
 */
public class CustomerUtil {
    private static Scanner scanner = new Scanner(System.in);

    /*
    1、HasNext和HasNextLine会要求用户在控制台输入字符,然后回车,把字符存储到Scanner对象中,不会赋值到变量中,可以用于判断输入的字符是否符合规则要求。
    HasNext会以空格为结束标志,空格后的数字会抛弃掉。
    HasNextLine会以Enter为结束标志

    2、Next和NextLine是直接从Scanner中获取HasNext和HasNextLine存储起来的值给到变量中。如果前面没有HasNext或者HashNextLine获取值,也可以自己获取用户在控制台中输入的字符。

    */

    //让用户一直输入,直到用户输入符合条件的字符串才退出循环。
    private static String readKeyBoard(int limit,boolean blankreturn){
        String line = "";
        while(scanner.hasNextLine()){
            line = scanner.nextLine();
            if(line.length()==0){
                if(blankreturn) return line;
                else continue;
            }
            if(line.length()<1 || line.length()>limit){
                System.out.println("输入长度(不能大于" + limit + ")错误,请重新输入:");
                continue;
            }
            break;
        }
        return line;
    }

    // 用于界面菜单的选择,该方法读取键盘
    public static char readMenuSelect(){
        char c;
        while(true){
            String str = readKeyBoard(1,false);
            c = str.charAt(0);
            if(c != '1' && c != '2' && c != '3' && c != '4' && c != '5'){
                System.out.println("选择错误,请重新输入:");
            }else{
                break;
            }
        }
        return c;
    }

    // 从键盘读取一个字符,将其返回
    public static char readChar(){
        String str = readKeyBoard(1,false);
        return str.charAt(0);
    }

    // 从键盘读取一个字符,将其返回,如果不输入字符直接回车,以defaultValue作为返回值
    public static char readChar(char defaultValue){
        String str = readKeyBoard(1,true);
        return (str.length() == 0) ? defaultValue : str.charAt(0);
    }

    // 从键盘读取一个长度不过2的整数并返回
    public static int readInt(){
        int n;
        while(true){
            String str = readKeyBoard(2,false);
            try{
                n = Integer.parseInt(str);
                break;
            }catch (NumberFormatException e){
                System.out.println("数字输入错误,请重新输入:");
            }
        }
        return  n;
    }

    // 从键盘读取一个长度不过2的整数并返回,如果不输入字符直接回车,以defaultValue作为返回值
    public static int readInt(int defaultValue){
        int n;
        while(true){
            String str = readKeyBoard(2,true);
            if(str.equals("")){
                return defaultValue;
            }
            try{
                n = Integer.parseInt(str);
                break;
            }catch (NumberFormatException e){
                System.out.println("数字输入错,请重新输入:");
            }
        }
        return  n;
    }

    // 从键盘读取一个长度不超过limit的字符串并返回
    public static String readString(int limit){
        return readKeyBoard(limit,false);
    }

    // 从键盘读取一个长度不超过limit的字符串并返回,如果不输入字符直接回车,以defaultValue作为返回值
    public static String readString(int limit, String defaultValue){
        String str =  readKeyBoard(limit,true);
        return str.equals("") ? defaultValue : str;
    }

    // 用于确认选择的输入,该方法从键盘读取‘Y’或‘N’,并将其作为方法的返回值
    public static char readConfirmSelect(){
        char c;
        while(true){
            String str = readKeyBoard(1,false).toUpperCase();
            c = str.charAt(0);
            if(c == 'Y' || c == 'N'){
                break;
            }else{
                System.out.println("选择错误,请重新输入:");
            }
        }
        return c;
    }

}

运行截图

添加
在这里插入图片描述
查询
在这里插入图片描述

修改
在这里插入图片描述
删除
在这里插入图片描述

相关文章
|
2月前
|
人工智能 缓存 自然语言处理
Java与多模态AI:构建支持文本、图像和音频的智能应用
随着大模型从单一文本处理向多模态能力演进,现代AI应用需要同时处理文本、图像、音频等多种信息形式。本文深入探讨如何在Java生态中构建支持多模态AI能力的智能应用。我们将完整展示集成视觉模型、语音模型和语言模型的实践方案,涵盖从文件预处理、多模态推理到结果融合的全流程,为Java开发者打开通往下一代多模态AI应用的大门。
325 41
|
3月前
|
Java
Java基础语法与面向对象
重载(Overload)指同一类中方法名相同、参数列表不同,与返回值无关;重写(Override)指子类重新实现父类方法,方法名和参数列表必须相同,返回类型兼容。重载发生在同类,重写发生在继承关系中。
149 1
|
3月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
126 0
|
4月前
|
安全 Java 编译器
Java面向对象
本文深入讲解了Java面向对象编程(OOP)的四大特性:封装、继承、多态与抽象,以及方法的设计与使用。通过示例展示了如何用类和对象组织代码,提升程序的可维护性与扩展性。
|
5月前
|
存储 Java 测试技术
Java基础 - 面向对象
面向对象编程是Java的核心,包含封装、继承、多态三大特性。封装隐藏实现细节,提升代码可维护性与安全性;继承实现类间IS-A关系,支持代码复用;多态通过继承、重写与向上转型,实现运行时方法动态绑定,提升系统扩展性与灵活性。
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
873 5
|
7月前
|
人工智能 Java 编译器
Java:面向对象
本文介绍了Java编程中的核心概念,包括包的命名规范与自动导入机制、构造方法的特点与使用、`this`和`super`关键字的作用、继承的基本规则、访问权限的设置、封装的意义、多态的实现原理以及`static`关键字的用法。通过详细解析每个知识点,并结合代码示例,帮助读者深入理解Java面向对象编程的核心思想与实践技巧。内容适合初学者及进阶开发者学习参考。
168 0
|
9月前
|
缓存 安全 Java
java面试-基础语法与面向对象
本文介绍了 Java 编程中的几个核心概念。首先,详细区分了方法重载与重写的定义、发生阶段及规则;其次,分析了 `==` 与 `equals` 的区别,强调了基本类型和引用类型的比较方式;接着,对比了 `String`、`StringBuilder` 和 `StringBuffer` 的特性,包括线程安全性和性能差异;最后,讲解了 Java 异常机制,包括自定义异常的实现以及常见非检查异常的类型。这些内容对理解 Java 面向对象编程和实际开发问题解决具有重要意义。
|
12月前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
10651 5
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
12月前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
131 1