bean包:

    1. package com.javaoop.bean;
    2. import java.util.Objects;
    3. /**
    4. * todo:添加作者以及创建时间,添加类的描述
    5. * bean这个package中没有任何业务逻辑,所有属性全部私有,提供get,set方法,提供无参构造器的对象。
    6. */
    7. public class Express {
    8. //快递单号
    9. private String number;
    10. //快递公司
    11. private String company;
    12. //取件码
    13. private int code;
    14. public Express(String number, String company, int code) {
    15. this.number = number;
    16. this.company = company;
    17. this.code = code;
    18. }
    19. @Override
    20. public String toString() {
    21. return "Express{" +
    22. "number='" + number + '\'' +
    23. ", company='" + company + '\'' +
    24. ", code=" + code +
    25. '}';
    26. }
    27. @Override
    28. public boolean equals(Object o) {
    29. if (this == o) return true;
    30. if (o == null || getClass() != o.getClass()) return false;
    31. Express express = (Express) o;
    32. return Objects.equals(number, express.number);
    33. }
    34. @Override
    35. public int hashCode() {
    36. return Objects.hash(number);
    37. }
    38. public Express() {
    39. }
    40. public String getNumber() {
    41. return number;
    42. }
    43. public void setNumber(String number) {
    44. this.number = number;
    45. }
    46. public String getCompany() {
    47. return company;
    48. }
    49. public void setCompany(String company) {
    50. this.company = company;
    51. }
    52. public int getCode() {
    53. return code;
    54. }
    55. public void setCode(int code) {
    56. this.code = code;
    57. }
    58. }

    DAO包:数据操作(data access object),也就是MVC中的M(model)模块,提供数据存取的功能。

    1. package com.javaoop.dao;
    2. import com.javaoop.bean.Express;
    3. import java.util.Random;
    4. /**
    5. * todo:添加作者以及创建时间,以及类的描述
    6. * DAO stands for Data Access Object
    7. */
    8. public class ExpressDao {
    9. //创建一个10*10的快递柜
    10. private Express[][] data = new Express [10][];
    11. //定义size作为当前已经存储的快递数量
    12. private int size; //todo:创建一个init方法,通过构造函数调用init方法
    13. {
    14. for(int i=0;i<10;i++){
    15. data[i] = new Express[10];
    16. }
    17. }
    18. private Random random = new Random();//定义随机数
    19. //快递员添加快递的操作
    20. public boolean add(Express e){//todo:需要判断e是否为空。
    21. if(size == 100){
    22. return false;//当存储快递数为100时即快递柜无空位
    23. }
    24. //随机生成二维数组下标
    25. int x = -1;
    26. int y = -1;
    27. while(true){
    28. x = random.nextInt(10);//生成x,y的随机坐标
    29. y = random.nextInt(10);
    30. if(data[x][y] == null){
    31. //此位置无快递
    32. break;
    33. }
    34. }
    35. //存入坐标
    36. int code =randomCode();
    37. e.setCode(code);
    38. data[x][y] = e;
    39. return true;
    40. }
    41. //生成六位数取件码 todo:需要改为多行注释
    42. private int randomCode(){
    43. //100000-999999 = 0~899999+100000
    44. while(true){
    45. int code = random.nextInt(900000) + 100000;
    46. //如果查到了快递则继续生成新的取件码
    47. Express e = findCode(code);
    48. //如果没有查到,则返回生成的取件码,即取件码生成成功
    49. if (e == null) {
    50. return code;
    51. }
    52. }
    53. }
    54. //查找单号-遍历法
    55. public Express findNumber(String number){//todo:在一开始保证入参就是正确的,避免后置校验
    56. Express e = new Express();
    57. e.setNumber(number);
    58. for(int i = 0 ;i<10;i++){
    59. for(int j = 0;j<10;j++){
    60. if (data[i][j] != null)
    61. if (e.equals(data[i][j])){
    62. return data[i][j];
    63. }
    64. }
    65. }
    66. return null;
    67. }
    68. //查找取件码-遍历法,小概率事件也需考虑(比如取件码重复)
    69. public Express findCode(int code){
    70. for(int i = 0 ;i<10;i++){
    71. for(int j = 0;j<10;j++){
    72. if (data[i][j] != null)
    73. if (data[i][j].getCode() == code){
    74. return data[i][j];
    75. }
    76. }
    77. }
    78. return null;
    79. }
    80. /**
    81. * 实际上这个update的操作是多余的操作,为了MVC更圆润(演示数据库的实际操作)
    82. * @param oldExpress
    83. * @param newExpress
    84. */
    85. public void update(Express oldExpress,Express newExpress){
    86. delete(oldExpress);
    87. add(newExpress);
    88. }
    89. //删除快递
    90. public void delete(Express e){
    91. //命名循环为p
    92. p:for(int i = 0 ;i<10;i++) {
    93. for (int j = 0; j < 10; j++) {
    94. if (e.equals(data[i][j])) {
    95. data[i][j] = null;
    96. break p;
    97. }
    98. }
    99. }
    100. }
    101. //查找所有快递
    102. public Express[][] findAll(){
    103. return data;
    104. }
    105. }

    main包:MVC中的C模块(controller),调度逻辑(根据视图接受到的用户输入内容,调度数据存储)

    1. package com.javaoop.main;
    2. import com.javaoop.bean.Express;
    3. import com.javaoop.dao.ExpressDao;
    4. import com.javaoop.view.Views;
    5. public class Main {
    6. //初始化视图对象
    7. private static Views v = new Views();
    8. //初始化dao对象
    9. private static ExpressDao dao = new ExpressDao();
    10. public static void main(String[] args){
    11. init();
    12. }
    13. //定义初始化方法
    14. public static void init(){
    15. //1. 欢迎
    16. v.welcome();
    17. m:while(true){
    18. //2. 弹出身份选择菜单
    19. int menu = v.menu();
    20. switch (menu){
    21. case 0:
    22. break m;
    23. //主界面1选项:进入快递员界面
    24. case 1:
    25. cClient();
    26. break;
    27. //主界面2选项:进入用户界面
    28. case 2:
    29. uClient();
    30. break ;
    31. }
    32. }
    33. v.bye();
    34. }
    35. //定义用户界面的调用逻辑 todo:修改注释
    36. public static void uClient(){//todo:判断code合理性
    37. //获得用户输入的取件码
    38. int code = v.uMenu();
    39. //取出快递
    40. Express e = dao.findCode(code);
    41. if (e == null){
    42. v.printNull();
    43. }else{
    44. v.success();
    45. v.printExpress(e);
    46. }
    47. }
    48. //定义快递员界面的调度逻辑
    49. public static void cClient(){
    50. while(true){
    51. int menu = v.cMenu();
    52. switch(menu){
    53. case 0:
    54. return;
    55. case 1:{//提示输入快递信息
    56. Express e = v.insert();
    57. //查询快递单号是否已经存储
    58. Express e2 = dao.findNumber(e.getNumber());
    59. //存储快递
    60. if (e2 == null){
    61. dao.add(e);
    62. v.printExpress(e);
    63. break;
    64. }else{
    65. //单号重复
    66. v.expressExist();
    67. }
    68. }
    69. break;
    70. case 2:{//快递修改
    71. //1.提示输入快递信息
    72. String number = v.findByNumber();
    73. //2.查找数据
    74. Express e =dao.findNumber(number);//todo:findExpressByNumber,避免语义歧义
    75. Express e2 = e;
    76. //3. 打印快递信息
    77. if (e == null){
    78. v.printNull();
    79. }else{
    80. v.printExpress(e);
    81. //4. 提示修改
    82. v.update(e2);
    83. dao.update(e,e2);
    84. v.printExpress(e2);
    85. }
    86. }
    87. break;
    88. case 3:{//删除快递
    89. //1.输入快递单号并查找
    90. String number = v.findByNumber();
    91. //2.查找快递对象
    92. Express e = dao.findNumber(number);
    93. if (e == null){
    94. v.printNull();
    95. }else{
    96. v.printExpress(e);
    97. int type = v.delete();
    98. if(type == 1){
    99. dao.delete(e);
    100. v.success();
    101. }
    102. }
    103. }
    104. break;
    105. //查看所有
    106. case 4:{
    107. Express[][] date = dao.findAll();//todo:改为findAllExpress
    108. v.printAll(date);
    109. }
    110. break;
    111. }
    112. }
    113. }
    114. }

    view包:V视图展示(欢迎,菜单,子菜单。。。)

    1. package com.javaoop.view;
    2. import com.javaoop.bean.Express;
    3. import java.util.Scanner;
    4. public class Views {
    5. private Scanner input = new Scanner(System.in);
    6. /**
    7. * 欢迎
    8. */
    9. public void welcome(){
    10. System.out.println("欢迎使用阿巴阿巴快递管理系统");
    11. }
    12. /**
    13. * 再见
    14. */
    15. public void bye(){
    16. System.out.println("欢迎下次使用");
    17. }
    18. public int menu(){
    19. System.out.println("请根据提示输入功能序号");
    20. System.out.println("1. 快递管理"); //进入快递员管理界面
    21. System.out.println("2. 普通用户"); //进入用户取件界面
    22. System.out.println("0. 退出");
    23. //所有方法均使用nextLine,不会因为输入产生冲突,
    24. //还可以接收各种类型的数据。
    25. String text = input.nextLine();
    26. int num = -1;
    27. try{
    28. num = Integer.parseInt(text);
    29. }catch (NumberFormatException e){//如果有字符串的错误数据输入,需要考虑;恶意输入
    30. }
    31. if(num<0 || num>2){
    32. System.out.println("输入错误,请重新输入");
    33. return menu(); //输入数字不在有效范围内,返回菜单
    34. }
    35. return num;
    36. }
    37. /**
    38. * 快递员菜单
    39. * @return
    40. */
    41. public int cMenu(){
    42. System.out.println("请选择功能序号:");
    43. System.out.println("1. 快递录入");
    44. System.out.println("2. 快递修改");
    45. System.out.println("3. 快递删除");
    46. System.out.println("4. 查看所有快递");
    47. System.out.println("0. 退出");//以上为快递员管理界面
    48. String text = input.nextLine();
    49. int num = -1;
    50. try{
    51. //将用户输入的取件码,转换为int数据类型
    52. num = Integer.parseInt(text);
    53. }catch(NumberFormatException e){
    54. }
    55. if(num<0 || num>4){
    56. System.out.println("输入错误,请重新输入");
    57. return cMenu();
    58. }//同主界面
    59. return num;
    60. }
    61. /**
    62. * 快递员录入快递
    63. * @return 包含了快递单号和快递公司的快递对象
    64. */
    65. public Express insert(){
    66. System.out.println("请根据提示输入快递信息");
    67. System.out.println("请输入快递单号");
    68. String number = input.nextLine();
    69. System.out.println("请输入快递公司");
    70. String company = input.nextLine();
    71. Express e = new Express();
    72. e.setCompany(company);
    73. e.setNumber(number);
    74. return e;
    75. }
    76. /**
    77. * 提示用户输入快递单号
    78. * @return 用户输入的快递单号
    79. */
    80. public String findByNumber(){
    81. System.out.println("请根据提示输入快递信息:");
    82. System.out.println("请输入要操作的快递单号: ");
    83. String number = input.nextLine();
    84. return number;
    85. }
    86. /**
    87. * 显示快递信息
    88. * @param e
    89. */
    90. public void printExpress(Express e) {
    91. System.out.println("快递信息如下:");
    92. System.out.println("快递公司: " + e.getCompany() + ",快递单号: " + e.getNumber() + ",取件码:" + e.getCode());
    93. }
    94. /**
    95. * 修改快递信息
    96. * @param e
    97. */
    98. public void update(Express e){//todo:做个校验:e是否为空
    99. System.out.println("请输入新的快递单号");
    100. String number = input.nextLine();
    101. System.out.println("请输入新的快递公司");
    102. String company = input.nextLine();
    103. e.setNumber(number);
    104. e.setCompany(company);
    105. }
    106. /**
    107. * 询问是否确认删除
    108. * @return 1表示确认, 2表示取消操作
    109. */
    110. public int delete() {
    111. System.out.println("是否确认删除");
    112. System.out.println("1. 确认删除");
    113. System.out.println("2. 取消删除");
    114. System.out.println("0. 退出");
    115. String text = input.nextLine();
    116. int num = -1;
    117. try {
    118. num = Integer.parseInt(text);
    119. } catch (NumberFormatException e) {
    120. }
    121. if (num < 1 || num > 2) {
    122. System.out.println("输入错误,请重新输入");
    123. return delete();
    124. }
    125. return num;
    126. }
    127. /**
    128. * 给定数组的快递信息,遍历显示
    129. *
    130. */
    131. public void printAll(Express[][] es){
    132. int count = 0;
    133. //通过循环,打印输出快递信息
    134. for(int i=0;i<10;i++){
    135. for(int j=0;j<10;j++){
    136. if(es[i][j] != null){
    137. count++;
    138. System.out.print("第"+(i+1)+"排"+(j+1)+"列快递");
    139. printExpress(es[i][j]);
    140. }
    141. }
    142. }
    143. if (count == 0){
    144. System.out.println("暂无快递信息");
    145. }
    146. }
    147. //当查询快递无信息时的提示语
    148. public void printNull(){
    149. System.out.println("快递不存在,请确认输入是否正确");
    150. }
    151. //提示用户取件成功
    152. public void printCode(Express e){
    153. System.out.println("快递取件码为:"+e.getCode());
    154. }
    155. //快递员存储时存储重复的提示语
    156. public void expressExist(){
    157. System.out.println("快递单号已存在");
    158. }
    159. //通用提示语
    160. public void success(){
    161. System.out.println("操作成功");
    162. }
    163. /**
    164. * 用户的菜单
    165. * @return
    166. */
    167. public int uMenu(){
    168. System.out.println("请输入取件码");
    169. String code = input.nextLine();
    170. int num = -1;
    171. try{
    172. //将用户输入的取件码,转换为int数据类型
    173. num = Integer.parseInt(code);
    174. }catch(NumberFormatException e){
    175. System.out.println("请输入正确的取件码");
    176. return uMenu();
    177. }
    178. //判断取件码
    179. if(num<100000 || num>999999){
    180. System.out.println("输入错误,请重新输入");
    181. return uMenu();
    182. }
    183. return num;
    184. }
    185. }