1、-3-学习线路图学习线路图OOOOUMLUML:Case-Study :-4-从需求到分析从需求到分析Requirement Model-SupplementarySpecificationGlossaryAnalysis ModelUse Case Realization-Anaysis:Analysis Class-5-从分析到设计从分析到设计Design ModelUse Case Realization-Design:InterfaceDesign ClassSubsystemAnalysis ModelUse Case Realization-Anaysis:Analysis Cla
2、ss-6-内容安排内容安排n体系结构设计体系结构设计n用例设计用例设计n子系统设计子系统设计n类设计类设计n数据库设计数据库设计-7-分析分析 VS.设计设计n分析:做什么分析:做什么n设计:怎么做设计:怎么做-8-设计模型设计模型 VS.分析模型分析模型-1制作分析模型并精化成设计模型制作分析模型并精化成设计模型有了单独的设计模型,但失去了分有了单独的设计模型,但失去了分析模型析模型制作分析模型并精化成设计模型,制作分析模型并精化成设计模型,然后用然后用CASE工具重新获得分析工具重新获得分析模型模型有了单独的设计模型,但是用有了单独的设计模型,但是用CASE工具重新获得的分析模型可能并不工
3、具重新获得的分析模型可能并不令人满意令人满意在细化阶段的某个点将分析模型在细化阶段的某个点将分析模型冻结,然后把分析模型的一份拷冻结,然后把分析模型的一份拷贝精化成设计模型贝精化成设计模型有了两个模型,但是它们步调不一有了两个模型,但是它们步调不一致致维护两个独立的模型维护两个独立的模型分析模型分析模型和设计模型和设计模型有了两个模型,并且它们步调一致,有了两个模型,并且它们步调一致,但是这增加了维护的负担但是这增加了维护的负担-9-设计模型设计模型 VS.分析模型分析模型-2n需要保留分析模型吗?需要保留分析模型吗?n易于理解:分析模型提供系统的易于理解:分析模型提供系统的“大场景大场景”,
4、它可,它可能只包括设计模型中的能只包括设计模型中的1%到到10%的类的类n价值:价值:n介绍新人加入项目介绍新人加入项目n在交付几个月或几年后重新理解系统在交付几个月或几年后重新理解系统n理解系统是怎么满足客户需求以及提供可跟踪性理解系统是怎么满足客户需求以及提供可跟踪性n计划维护和增强计划维护和增强n理解系统的逻辑架构理解系统的逻辑架构n外包系统的构造外包系统的构造n-10-设计模型设计模型 VS.分析模型分析模型-3n需要分别维护分析模型和设计模型的系需要分别维护分析模型和设计模型的系统统n庞大的庞大的n复杂的复杂的n战略性的战略性的n受经常变更所支配的受经常变更所支配的n期望长期运行的期
5、望长期运行的n外包的外包的-11-软件设计的定义软件设计的定义-12-更精确定义更精确定义n软件设计(的结果)必须软件设计(的结果)必须n描述系统的体系结构(描述系统的体系结构()n系统如何分解(系统如何分解(decompose)和组织)和组织(organize)构件)构件n描述构件间的接口(描述构件间的接口()n描述构件(描述构件():必须详细到可):必须详细到可进一步构造的程度进一步构造的程度-13-ISO/IEC 12207n按按ISO/IEC 12207软件开发生存周期过软件开发生存周期过程,软件设计由两个活动组成程,软件设计由两个活动组成n软件体系结构设计软件体系结构设计-softw
6、are architectural designn顶层设计(顶层设计(top-level design)n描述系统顶层的结构和组织描述系统顶层的结构和组织n标识各个构件标识各个构件n软件详细设计软件详细设计-software detailed designn充分描述每个构件使之可以编码充分描述每个构件使之可以编码-14-软件设计的作用软件设计的作用n软件设计在软件系统开发过程中扮演重要软件设计在软件系统开发过程中扮演重要角色角色n开发者作出各种模型,形成实现时解决方案的开发者作出各种模型,形成实现时解决方案的蓝图蓝图n对这些模型进行分析和评价,以判定是否满足对这些模型进行分析和评价,以判定是否
7、满足各种需求各种需求n便于考察备选方案和可行的替换措施便于考察备选方案和可行的替换措施n设计模型也可用于规划后续的开发活动设计模型也可用于规划后续的开发活动n是编码和测试的输入是编码和测试的输入-15-RUP中的分析和设计工作流中的分析和设计工作流-16-内容安排内容安排n从分析到设计从分析到设计n用例设计用例设计n子系统设计子系统设计n类设计类设计n数据库设计数据库设计-17-为什么需要体系结构为什么需要体系结构n我们所定义的类或者对象其关注的重点是定义我们所定义的类或者对象其关注的重点是定义了一个系统的核心概念和行为了一个系统的核心概念和行为n一个系统是由多个子系统组成,每个子系统中一个系
8、统是由多个子系统组成,每个子系统中的领域对象都不只一个的领域对象都不只一个n这些类如何组织、分布并协同完成所需的功能?这些类如何组织、分布并协同完成所需的功能?n因此系统应该要有一个总体的体系结构,它定因此系统应该要有一个总体的体系结构,它定义了各子系统之间的通信和耦合义了各子系统之间的通信和耦合n体系结构包图(体系结构包图(architecture package diagram)-18-软件体系结构定义软件体系结构定义n软件体系结构描述软件系统的子系统和软件体系结构描述软件系统的子系统和构件及其相互关系构件及其相互关系nUML Reference Manual:体系结构是:体系结构是一个系
9、统的组织结构,包括系统分解成一个系统的组织结构,包括系统分解成的各个部分、它们的连接性、交互机制的各个部分、它们的连接性、交互机制和通知系统设计的向导规则和通知系统设计的向导规则-19-软件体系结构风格软件体系结构风格n体系结构风格体系结构风格stylen提供软件系统高层组织的元模型提供软件系统高层组织的元模型n通用结构:通用结构:分层分层、管道过滤器、黑板、管道过滤器、黑板n分布式系统:分布式系统:客户客户-服务器、三层服务器、三层、中介、中介n交互式系统:交互式系统:MVC、表示、表示-抽象抽象-控制控制n可适配系统:微内核、反映式可适配系统:微内核、反映式n其它:批处理、解释器、进程控制
10、、基于规则其它:批处理、解释器、进程控制、基于规则-20-UML和体系结构和体系结构n体系结构的全部内容就是复杂性管理:将解体系结构的全部内容就是复杂性管理:将解决方案划分成多个小的组成部分,再将这些决方案划分成多个小的组成部分,再将这些小的部分结合起来,构成更大的、更加一致小的部分结合起来,构成更大的、更加一致的结构的结构n包(包(package)n包依赖关系图(包依赖关系图(package dependency diagram)n子系统(子系统(subsystem)n层(层(layer)-21-包包-packagen包是一种将模型元素分组的机制包是一种将模型元素分组的机制n包主要用于包主要
11、用于n组织模型元素组织模型元素n配置管理单元配置管理单元n分包的原则分包的原则n职责相似:将一组职责相似、但以不同方式实现的职责相似:将一组职责相似、但以不同方式实现的类归为一组有意义的包;如类归为一组有意义的包;如java类库中的类库中的javax.swing.bordern协作关系:包含了各种不同类型的类,它们之间通协作关系:包含了各种不同类型的类,它们之间通过相互协作实现一个意义重大的职责过相互协作实现一个意义重大的职责-22-包依赖关系包依赖关系n包之间存在着依赖关系包之间存在着依赖关系n如果如果Client包依赖于包依赖于Supplier包:包:nSupplier包的改变将影响到包的
12、改变将影响到Client包包nClient包不能够独立的重用,因为它依赖于包不能够独立的重用,因为它依赖于Supplier包包Client PackageSupplier Package-23-避免循环依赖避免循环依赖ABABCAABC-24-体系结构设计过程体系结构设计过程n1.确立目标确立目标n2.将类分组将类分组n3.展示技术展示技术n4.抽取子系统抽取子系统n5.针对准则和目标对体系结构进行评估针对准则和目标对体系结构进行评估-25-1.确立目标确立目标n一个好的体系结构其实是不断权衡、妥一个好的体系结构其实是不断权衡、妥协、折衷的产物协、折衷的产物n可扩展性可扩展性n可维护性可维护性
13、n可靠性可靠性n可伸缩性可伸缩性n-26-2.将类分组并评估各个类将类分组并评估各个类n将分析类划分成几个候选包,并对它们的内聚将分析类划分成几个候选包,并对它们的内聚性进行评估性进行评估n目标是使每个包具有清晰的且严格定义的目的目标是使每个包具有清晰的且严格定义的目的和职责和职责n结合体系结构模式,考虑分组方式结合体系结构模式,考虑分组方式n实体类实体类n用户界面类用户界面类n控制类控制类n系统接口类系统接口类nn描述包之间的耦合度:包依赖关系图描述包之间的耦合度:包依赖关系图-27-考勤卡系统的体系结构包图考勤卡系统的体系结构包图TimecardUITimecardWorkflowTime
14、cardDomainBillingystemInterface-28-3.展示技术展示技术TimecardUITimecardWorkflowTimecardDomainBillingystemInterfacejspEntityBean(from ejb)SessionBean(from ejb)io(from java)-29-4.抽取子系统抽取子系统TimecardUITimecardWorkflowTimecardDomainBillingystemInterfaceIBillingSystemInterface-30-5.针对准则和目标进行评估针对准则和目标进行评估TimecardU
15、ITimecardWorkflowTimecardDomainBillingystemInterfaceEntityBean(from ejb)SessionBean(from ejb)io(from java)httpjspIBillingSytemInterface-31-内容安排内容安排n从分析到设计从分析到设计n体系结构设计体系结构设计n子系统设计子系统设计n类设计类设计n数据库设计数据库设计-32-用例设计用例设计Use-Case ModelUse Case(from Use Case View)Use-Case RealizationDesign Model-:2:3:4:5:6:
16、1:Use Case-33-从分析类到设计元素从分析类到设计元素Analysis ClassesDesign Elements-34-用例实现(设计)用例实现(设计)n将设计应用于用例将设计应用于用例n1.结合设计元素,定义设计对象间的交互结合设计元素,定义设计对象间的交互(交互图)(交互图)n2.利用利用简化交互图简化交互图n3.描述与描述与相关的行为相关的行为n4.检查用例事件流的实现检查用例事件流的实现n5.评价评价和子系统和子系统-35-交互图的设计:职责分配交互图的设计:职责分配n利用设计元素,进行类的职责分配,完利用设计元素,进行类的职责分配,完成用例实现的交互图成用例实现的交互图
17、n职责分配模式:职责分配模式:GRASP(General Responsibility Assignment Software Pattern)模式)模式n专家模式、创建者模式专家模式、创建者模式(老板原则老板原则)、高内聚高内聚、低耦合低耦合、控制者、控制者n多态、纯虚构、中介者、多态、纯虚构、中介者、不要和陌生人讲话不要和陌生人讲话(可视原则)(可视原则)-36-GRASP:不要和陌生人讲话:不要和陌生人讲话(可视原则)(可视原则)n解决方案解决方案n分配职责给一个客户端的直接对象以使它与一个间分配职责给一个客户端的直接对象以使它与一个间接对象进行协作,这样客户端无需知道这个间接对接对象进
18、行协作,这样客户端无需知道这个间接对象象n这个模式也被称为这个模式也被称为,在那些你需要在,在那些你需要在其上发送消息的对象上面放置一些限制条件,它表其上发送消息的对象上面放置一些限制条件,它表明在一个方法中,消息只能发往下面的对象:明在一个方法中,消息只能发往下面的对象:n对象本身;方法的一个参数;对象本身的属性;对象本身对象本身;方法的一个参数;对象本身的属性;对象本身的一个属性集合中的元素;该方法内创建的对象的一个属性集合中的元素;该方法内创建的对象n优点优点n低耦合低耦合-37-内容安排内容安排n从分析到设计从分析到设计n体系结构设计体系结构设计n用例设计用例设计n类设计类设计-38-
19、子系统与接口子系统与接口n子系统是一种介于包和类之间的一种设子系统是一种介于包和类之间的一种设计机制,它实现一个或多个接口所定义计机制,它实现一个或多个接口所定义的行为的行为n具有包的语义:能够包含其它模型元素具有包的语义:能够包含其它模型元素n具有类的语义:具有行为具有类的语义:具有行为Interface-39-子系统的作用子系统的作用n完全封装了行为完全封装了行为n利用清晰的接口代表所拥有的能力利用清晰的接口代表所拥有的能力n可以定义不同的实现可以定义不同的实现-40-子系统子系统 VS.包包Client ClassSubsystem APackage BClass B1Class B2n
20、子系统:子系统:n提供行为提供行为n完全封装实现完全封装实现细节细节n容易替换容易替换n包:包:n不提供行为不提供行为n不完全封装实不完全封装实现细节现细节n难以替换难以替换-41-子系统的主要用途子系统的主要用途n子系统可以将系统划分成独立的部分,子系统可以将系统划分成独立的部分,以利于:以利于:n开发,只要保持接口不变开发,只要保持接口不变n部署到不同分布的节点上部署到不同分布的节点上n变更,而不影响到其它系统变更,而不影响到其它系统n在设计阶段,子系统还可用于打包遗留在设计阶段,子系统还可用于打包遗留系统系统n子系统代表了粗粒度的组件子系统代表了粗粒度的组件-42-子系统的设计原则子系统
21、的设计原则n目标目标n松散耦合松散耦合n可替换的,可替换的,plug-and-playn隔离变更隔离变更n自身可独立的改进自身可独立的改进n好的建议好的建议n不要暴露细节,只有接口不要暴露细节,只有接口n仅依赖于接口仅依赖于接口ABC-43-子系统的设计步骤子系统的设计步骤n将子系统的行为分发到各个子系统元素将子系统的行为分发到各个子系统元素中:分发子系统的中:分发子系统的n描述子系统中的元素描述子系统中的元素n描述子系统的依赖关系描述子系统的依赖关系-44-接口设计接口设计n接口说明了一组操作,隐藏子系统的实现细节接口说明了一组操作,隐藏子系统的实现细节n在在GoF的的23种设计模式中,种设
22、计模式中,Facade模式是一模式是一种很好的接口的设计模式种很好的接口的设计模式n确定系统的内聚部分确定系统的内聚部分n将这些打包到一个将这些打包到一个n为该子系统设计接口为该子系统设计接口-45-考勤卡系统中的子系统设计考勤卡系统中的子系统设计TimecardUITimecardWorkflowTimecardDomainBillingystemInterfaceEntityBean(from ejb)SessionBean(from ejb)io(from java)httpjspIBillingSytemInterface-46-内容安排内容安排n从分析到设计从分析到设计n体系结构设计
23、体系结构设计n用例设计用例设计n子系统设计子系统设计-47-设计类设计类n设计类设计类n设计模型的构造块设计模型的构造块n设计类是已经完成了规格说明并且达到能够设计类是已经完成了规格说明并且达到能够n来源于问题域和解域来源于问题域和解域n通过分析类的精化得到的问题域通过分析类的精化得到的问题域添加实现细节添加实现细节n解域,提供了能够实现系统的技术工具解域,提供了能够实现系统的技术工具-48-设计类剖析设计类剖析n在分析中,只要尽量捕获系统需要的行在分析中,只要尽量捕获系统需要的行为,而完全不必考虑如何去实现这些行为,而完全不必考虑如何去实现这些行为为n在设计中,则必须准确地说明类是如何在设计
24、中,则必须准确地说明类是如何履行它们的职责履行它们的职责n完整的属性集合,包括详细说明的名称、类完整的属性集合,包括详细说明的名称、类型、可视性和一些默认值型、可视性和一些默认值n将分析类指定的职责转化成一个或多个方法将分析类指定的职责转化成一个或多个方法的完整集合的完整集合-49-良好的设计类良好的设计类n类的公共方法定义它和类用户之间的契类的公共方法定义它和类用户之间的契约约n通常要从类用户的角度去评估类的目的通常要从类用户的角度去评估类的目的n基本特征基本特征n完整性和充分性完整性和充分性n原始性原始性n高内聚高内聚n低耦合低耦合-50-类设计的主要工作类设计的主要工作n定义类的操作定义
25、类的操作n类的职责类的职责n定义类的方法和状态定义类的方法和状态n方法:操作的实现方法:操作的实现n状态:对象的状态如何影响它的行为状态:对象的状态如何影响它的行为(状态状态图图)n定义类的属性定义类的属性n定义类之间的关系定义类之间的关系-51-类之间的关系类之间的关系n依赖关系依赖关系n关联关系关联关系n聚合关系聚合关系n组合关系组合关系n泛化关系泛化关系关联关系关联关系泛化关系泛化关系聚合关系聚合关系组合关系组合关系依赖关系依赖关系-52-关联关系的表示方法关联关系的表示方法n关联具有:名称、多重性表达式、导航符号、关联具有:名称、多重性表达式、导航符号、角色名称角色名称n名称:动词短语
26、名称:动词短语n多重性表达式:多重性表达式:*,1.*,1-40,5,3,5,8,n导航符号导航符号n角色名称角色名称-53-聚合关系示例聚合关系示例ComputerPrinter0.10.n0.n0.1 一台一台Computer可能连接到可能连接到0.n台台Printers 任何时候一台任何时候一台Printer连接到连接到0.1台台Computer随着时间推移,许多台随着时间推移,许多台Computers可以使用一台给定的可以使用一台给定的Printer即使没有所连接的即使没有所连接的Computers,那台,那台Printer也可以生存也可以生存在非常客观的意义上,那台在非常客观的意义上
27、,那台Printer是独立于那台是独立于那台Computer的的 聚合有时能够不依赖部分而存在,有时又不能聚合有时能够不依赖部分而存在,有时又不能 部分可以独立于聚合而存在部分可以独立于聚合而存在如果有一部分遗失,聚合会给人一种不完整的感觉如果有一部分遗失,聚合会给人一种不完整的感觉部分的所有权可以由几个聚合共享部分的所有权可以由几个聚合共享-54-组合关系示例组合关系示例11-4MouseMouseButtonButton Button离开离开Mouse对象则不能独立存在对象则不能独立存在销毁销毁Mouse则也销毁则也销毁Mouse,因为它们是,因为它们是Mouse对象整体的一个部分对象整体
28、的一个部分每个每个Button只能仅仅属于一个只能仅仅属于一个Mouse(如树和树叶)(如树和树叶)部分在某一时刻仅仅只能属于一个组成部分在某一时刻仅仅只能属于一个组成 组成唯一地负责处理它的所有部分组成唯一地负责处理它的所有部分负责它们的创建和销毁负责它们的创建和销毁倘若对于部分的职责有由其他的对象来承担的话,组合也可以放松这些倘若对于部分的职责有由其他的对象来承担的话,组合也可以放松这些职责职责如果一个组成销毁的话,它必须将它所有的部分销毁,或者把负责处理如果一个组成销毁的话,它必须将它所有的部分销毁,或者把负责处理它们的权力交给其他的一些对象它们的权力交给其他的一些对象-55-泛化关系泛
29、化关系n只有在两个设计类之间存在清晰明确的只有在两个设计类之间存在清晰明确的“is a”关系或为了复用代码才使用继承(但是注意不关系或为了复用代码才使用继承(但是注意不要因此引入耦合)要因此引入耦合)n缺点缺点n类间可能耦合的最强形式:派生类会继承基类的属类间可能耦合的最强形式:派生类会继承基类的属性、方法、关系性、方法、关系n类层次中的封装是脆弱的,它会导致类层次中的封装是脆弱的,它会导致“脆弱基类脆弱基类”问题问题基类的改动会直接波及底下的层次基类的改动会直接波及底下的层次n在大多数语言中,继承非常不易改变在大多数语言中,继承非常不易改变关系是在编关系是在编译时确定的,关系在运行时是固定的
30、译时确定的,关系在运行时是固定的-56-可见性问题可见性问题n动机:对象动机:对象A若要对对象若要对对象B发送消息,那么对象发送消息,那么对象B必须必须对对象对对象A可见可见n可见性(可见性(Visibility)是一个对象)是一个对象“看到看到”或者引用另或者引用另一个对象的能力;更一般地讲,可见性与问题的范围一个对象的能力;更一般地讲,可见性与问题的范围有关:一个资源(如一个实例)是否在另一个资源的有关:一个资源(如一个实例)是否在另一个资源的范围之内?范围之内?n从对象从对象A到对象到对象B通常有四种可见性:通常有四种可见性:n属性可见性(属性可见性(attribute):B是是A的一个
31、属性的一个属性n参数可见性(参数可见性(parameter):B是是A中一个方法的参数中一个方法的参数n局部声明可见性(局部声明可见性(local):B在在A的一个方法中被声明为一个的一个方法中被声明为一个局部对象局部对象n全局可见性(全局可见性(global):B在某种程度上全局可见在某种程度上全局可见-57-属性可见性属性可见性public class Host private Dog dog;-58-参数可见性参数可见性从ShowMails 到Mails的参数可见性public class ShowMailsstatic int putMails(Mails mail)if(curren
32、tMails=maxMails)System.out.println(Mailbox overwhelmed!);return-1;showListcurrentMails=mail;currentMails+;return currentMails;-59-局部声明可见性局部声明可见性从从Show到到Mails 的的局部声明可见性局部声明可见性public class Showpublic static void main(String args)Mails newmail;.-60-全局可见性全局可见性-61-可见性问题示例可见性问题示例:POST:POST:Cashier:Cashier
33、:Sale:Sale:SalesLineItem:SalesLineItem:ProductCatalog:ProductCatalog:ProductSpecification:ProductSpecification:SalesLineItem:SalesLineItem1.2.1:find(upc)1.3.2:/add(sl)1.3.1:create()1.1.1:create()1:enterItem(int,int):void1.3:makeLineItem(ProductSpecification,int):void1.2:getSpecification(int):Product
34、Specification1.1:new sale/create()/属性可见性属性可见性class POSTpublic void enterItem(int upc,int qty)spec:=prodCatalog.getSpecification(upc);/参数可见性参数可见性class Sale /局部声明可见性局部声明可见性class POST public void enterItem(int upc,int qty)-62-内容安排内容安排n从分析到设计从分析到设计n体系结构设计体系结构设计n用例设计用例设计n子系统设计子系统设计n类设计类设计-63-设计模型与代码实现设计模
35、型与代码实现n编写代码形成软件编写代码形成软件n软件最终需要代码来实现软件最终需要代码来实现n模型只是为代码实现提供支持模型只是为代码实现提供支持n目前尚未产生成熟的可执行模型目前尚未产生成熟的可执行模型n正向工程(正向工程(Forward engineering)n由设计类图导出框架代码由设计类图导出框架代码n由交互图创建方法实现由交互图创建方法实现n逆向工程(逆向工程(Reverse engineering)n由源代码导出设计模型由源代码导出设计模型-64-正向工程正向工程-生存框架代码生存框架代码n什么是框架代码?什么是框架代码?n代码在设计上的初步实现代码在设计上的初步实现n类的框架代
36、码包括那些?类的框架代码包括那些?n属性值定义:名称、类型、缺省值等属性值定义:名称、类型、缺省值等n方法定义:名称、参数、返回类型等方法定义:名称、参数、返回类型等n引用关系引用关系nn根据设计类图产生框架代码根据设计类图产生框架代码n用方法和简单属性定义一个类用方法和简单属性定义一个类n加入引用属性:角色名定义引用属性加入引用属性:角色名定义引用属性-65-从设计类图产生框架代码从设计类图产生框架代码-1-66-从设计类图产生框架代码从设计类图产生框架代码-2-67-Rose支持框架代码的导出支持框架代码的导出n利用利用Rose由设计类图生成框架代码(由设计类图生成框架代码(Java)n新
37、建一个基于新建一个基于J2SE的应用程序的应用程序n选择缺省的语言为选择缺省的语言为Javan利用利用Rose建模建模n开始导出工作:开始导出工作:n类的语法检查类的语法检查n设置导出路径设置导出路径ClassPathn导出框架代码导出框架代码n主要问题:主要问题:n设计模型开发不够完善,无法导出代码设计模型开发不够完善,无法导出代码-68-其它问题其它问题-一对多关系的实现一对多关系的实现-69-正向工程正向工程-创建方法实现创建方法实现n一个一个显示出了响应方法调用而产显示出了响应方法调用而产生的消息传递;这些消息序列可以被翻生的消息传递;这些消息序列可以被翻译成方法实现中的一系列语句译成
38、方法实现中的一系列语句n由顺序图产生方法实现由顺序图产生方法实现n由协作图产生方法实现由协作图产生方法实现-70-:Sale:Cashier:POST:SalesLineItem:ProductCatalog:ProductSpecification1.enterItem(int,int)1.1./isNewSale()create()1.2.getSpecification(int)1.3.makeLineItem(ProductSpecification,int)1.1.1./create()1.2.1./find(upc)1.3.1./create()1.3.2./add(sl)示例示例
39、-POST类类enterItem方法实现方法实现/1.1创建创建Sale实例实例if(isNewSale()sale=new Sale();/1.2获得获得ProductSpecificationProductSpecification spec=productCatalog.getSpecification(upc);/1.3添加销售项添加销售项sale.makeLineItem(spec,qty);public void enterItem(int upc,int qty)if(isNewSale()sale=new Sale();ProductSpecification spec=productCatalog.getSpecification(upc);sale.makeLineItem(spec,qty);