当前位置:文档之家› JAVA简单项目购物系统的整个开发过程详解

JAVA简单项目购物系统的整个开发过程详解

1. 购物系统的需求分析和类划分购物系统本身是一个十分复杂的系统,有很多细节问题如果深究会更加复杂,并且一般购物系统都是网页类型的,要有一个友好的界面,但是作为一个简单项目,该项目只是为了给JAVA初学者介绍一下开发的基本思想,以及面向对象时应该怎样去设计框架和实现流程,所以只是基于eclipse开发的一个简单的项目,并没有GUI的参与,并且很多细节问题作为后续研究,整体的设计比较简单,但是足以说明很多设计思想和设计理念,那么下面对基本的需求进行分析。

作为一个简单的购物系统,至少需要具备以下功能(这些功能分布在不同级的菜单中):(1)用户登录功能、用户账号密码修改功能,暂时不提供注册功能;(2)用户成功登录后,需要具备客户信息的管理功能、购物结算功能以及一些抽奖活动等;(3)客户信息管理功能下面又可以分出很多功能,比如说:查询、修改、增加等;(4)购物结算功能下面又可以分出很多功能,比如说:商品选购、付款、账单等;(5)抽奖活动下面又可以设计出多种的抽奖形式,从而进一步划分为许多新的功能模块。

(6)在一级菜单中要提供退出系统的功能,在二级菜单中要提供注销登录的功能,其他级菜单都要能够返回上一级菜单。

上面的这些功能都是一些比较基本的功能,那么如果按照面向流程的思想来设计,就会划分很多功能模块,然后按照流程一步步走就行,但是现在我们采用面向对象的思想来设计,那么应该如何考虑设计框架呢?面向对象的主要思想就是将一些需求抽象为许多类,然后建立这些类之间的联系,通过不同类之间的协同合作,就可以实现所有的功能。

所以,现在的主要任务就是如何合理地抽象出这些类,以及这些类要实现什么功能,类之间的联系又是什么?下面通过本次设计的结构对这一过程进行分析。

(1)StartSMS类:用于系统的启动。

我们的系统肯定需要一个启动类,这个类里面包含了main方法,用来启动这个系统,这个类是最顶层的,所以不能牵涉太多底层的细节实现,只需要实现一些顶层的基本流程就行,主要还是要调用底层其他类的一些方法来实现功能。

(2)Data类:用来存放我们的所有数据信息,本次设计主要存放的是已经预存的一些可供购买的商品信息和已经注册的会员信息。

为什么需要这个类呢?大家想一想,在面向对象的设计中,我们的数据比较多,肯定不能零散地到处定义、任意修改,这样会使得系统的聚合程度太低,容易出现很多错误,并且难以进行后期功能扩展和错误修改,所以我们要把用到的一些公有的数据进行归类,然后放在一个类中,并且在该类中提供对这些数据进行操作的方法。

(3)Menu类:用于显示及处理各级菜单。

既然我们设计的是一个购物系统,那么即使再简单,也需要一个基本的菜单,用来和用户进行交互,由于菜单的比较多,并且各级菜单之间层层相连,所以我们需要对菜单进行统一管理,故而出现了菜单类。

注意,这里的菜单只是一些顶层的菜单显示和基本的功能调用,具体底层的算法还是需要更加底层的类来实现的。

(4)Manager类:用于存储用户的账户和密码。

既然我们需要用户登录,那么肯定需要一个单独的类来管理用户的账户和密码,从而使系统的独立性更强一些。

本次设计的用户只有一个账户和密码,只允许修改账户和密码,但是不允许注册。

(5)VerifyEqual类:用于验证登录信息。

这个类相当于是把登录这项功能抽象成了一个类,这个实现其实并不是非常必要,但是为了使得系统功能划分更加清晰,所以设计了此类,用来对登录信息和已有的账户和密码进行校验,从而给出校验结果。

(6)CustManagement类:用于客户信息的管理,该类实现了底层的一些功能,比如说查询、修改、增加等。

当我们进入到客户信息管理这个菜单的时候,肯定需要对客户信息进行许多操作,为了方便管理这些操作,并考虑到后续的扩展性,这里把客户信息管理的所有功能都抽象出来,放在此类中,上一级菜单通过调用该类中的方法实现客户信息的管理。

(7)Pay类:用于处理购物和结算操作。

该类和上面的类存在的原理基本一致,当客户选择进行购物的时候,肯定要有很多操作,比如说买什么、多少钱、付款、找零等,这些功能比较零碎,所以我们对其进行集中管理,从而抽象出该类,对购物和结算的菜单选项的底层算法进行实现,上一级菜单通过调用该类的方法实现购物和结算功能,并且可以返回上一级菜单。

(8)GiftManagement类:用于处理抽奖活动的相关功能。

这个类和(6)、(7)中的类存在的理由基本一致,该类对抽奖活动进行了统一管理,上一级菜单只需要通过调用该类的方法就可以实现抽奖的功能。

(9)Gift类:用于管理礼物。

既然设计了抽奖环节,那么肯定需要礼物,那么我们会给出什么样的礼物呢,我们总不能每一样礼物都详细列出来吧,这样十分冗余,也很麻烦,所以我们干脆抽象出一个礼物类,把礼物的一些属性:礼物名称和价格等保存成该类的成员变量,然后就可以很方便的管理该类,需要什么样的礼物就直接新建一个礼物对象,然后对该对象的属性进行修改和管理即可,这样的实现类似于一个接口,但是又和接口完全不一样,功能差不多。

总之,上面的类都是经过一些功能模块划分后抽象出来的,有些地方也并不一定合理,主要还是需要看需求,根据不同的需求制定不同的方案。

在这里,我想就”Gift类“再强调一点,这个类的设计十分符合面向对象的思想,举个例子来看,如果购物系统中需要很多礼物,比如手机、电脑、移动电源等,那么如果我们一个个写这些礼物,会使得系统代码十分冗余,因为礼物的属性基本一样,所以我们就可以抽象成一个类,从而在需要什么礼物的时候只定义一个对象,然后赋予一定的属性即可,比如需要手机、电脑,那么我们只需要new一个Gift类的对象,然后在需要手机的时候设置其属性为手机,在需要电脑的时候设置其属性为电脑,需要什么设置什么即可,这样就使得我们的代码得到了简化,也使得结构比较清晰。

在更为复杂的系统中,其实礼物用接口来实现更为合理,这样就可以根据该接口实现不同的礼物类,从而满足不同的需求,就类似于我们的电脑上的USB接口,只需要这个接口,我们就可以插上很多各种各样的外围设备,道理差不多。

2. 购物系统的类之间的关系和流程(用图示法表示)下图是我用Microsoft Office Visio 2003画图工具画出的这9个类之间的关系。

从上图中可以清晰地看出来各类之间的关系,大致关系和流程如下所述:(1)StartSMS类是启动类,内含main方法,这个类里面定义了VerifyEqual类和Data类的对象,用来存储数据和验证信息,同时Data 类中包含了Manager类,用来存储预存的用户账号信息,然后在main方法中通过一定的逻辑,去调用Menu类中的showLoginMenu()方法,用于处理一级菜单---登录修改流程;(2)如果登录成功,就调用Menu类中的showMainMenu()方法,用于处理二级菜单---购物系统的主流程,如果登录失败3次,就直接退出系统;(3)在Menu类中的showMainMenu()方法中,通过选择不同的二级菜单选项,从而调用Menu类中的showCustMMenu()方法来处理客户信息管理流程或者调用Menu类中的showSendMenu()方法来处理抽奖活动流程,亦或者调用Pay类中的calcPrice()方法来处理购物结算流程;(4)如果选择了二级菜单中的客户信息管理选项,那么就会调用Menu类中的showCustMMenu()方法,这个方法会调用CustManagement 类中的各种方法,用以处理客户信息管理的不同操作;(5)如果选择了二级菜单中的购物结算选项,那么就会调用Pay 类中的calcPrice()方法,从而处理购物结算的流程,注意在Pay类中的getDiscount()方法是用来根据客户会员信息来计算打折率的;(6)如果选择了二级菜单中的真情回馈选项,即抽奖活动,那么就会调用Menu类中的showSendMenu()方法,这个方法会调用GiftManagement类中的各种方法,用以处理抽奖活动的不同操作;注意到在CustManagement类和GiftManagement类中都有一个returnLastMenu()方法,该方法是用来返回上一级菜单使用的。

3. 代码实现需要说明的一点是这些代码都应该放在包下。

StartSMS类[java]view plaincopy1.package ;2.import3./**4.* 该类是这个系统的主方法类,用于启动购物系统5.*6.* @author7.*8.*/9.publicclass StartSMS {10./**11.* 空构造方法12.*13.*/14.public StartSMS() {15.}16./**17.* 系统主方法18.*19.* @param args20.*/21.publicstaticvoid main(String args[]) {1.登录系统\n\n");2."\t\t\t\t 2. 更改管理员信息\n\n");3."\t\t\t\t 3. 退出\n\n");4."* * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * *\n");5."请选择,输入数字:");6.}7./**8.* 显示二级菜单,即系统的主菜单,这个方法里面包含了对这个菜单处理的所有流程9.*10.*/11.publicvoid showMainMenu() {12.客户信息管理\n");13."\t\t\t\t 2. 购物结算\n");14."\t\t\t\t 3. 真情回馈\n");15."\t\t\t\t 4. 注销\n");16."* * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * *\n");17.显示所有客户信息\n");18."\t\t\t\t 2. 添加客户信息\n");19."\t\t\t\t 3. 修改客户信息\n");20."\t\t\t\t 4. 查询客户信息\n");21."* * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * *\n");22."请选择,输入数字或按'n'返回上一级菜单:");23.Scanner scanner = new Scanner;24.boolean flag = true;25.do {26.幸运大放送\n");27."\t\t\t\t 2. 幸运抽奖\n");28."\t\t\t\t 3. 生日问候\n");29."* * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * *\n");30."请选择,输入数字或按'n'返回上一级菜单:");31.Scanner scanner = new Scanner;1.quals("n")) {2.ppend(custNo[k])3..append("\t\t").append(custBirth[k]).append("\t\t")4..append(custScore[k]).toString());5.j = k;6.break;7.}8.k++;9.} while(true);10.改会员生日.\n");11."\t\t\t\t2.修改会员积分.\n");12."* * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * *\n");13."请选择,输入数字:");14.switch ()) {15.case1: ppend(custNo[j])16..append("\t\t").append(custBirth[j]).append("\t\t")17..append(custScore[j]).toString());18.flag = true;19.break;20.}21.j++;22.} while(true);23.if (!flag)24."抱歉,没有你查询的会员信息。

相关主题