软件需求分析与设计- GR:基于职责的设计_第1页
软件需求分析与设计- GR:基于职责的设计_第2页
软件需求分析与设计- GR:基于职责的设计_第3页
软件需求分析与设计- GR:基于职责的设计_第4页
软件需求分析与设计- GR:基于职责的设计_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、软件需求分析与设计 GRASP:基于职责的设计软件分析与设计GRASP:基于职责的设计主要内容学习5个GRASP原那么或模式创立者信息专家低耦合控制器高内聚9/22/20222软件分析与设计对象设计起始场景第一个为期两天的需求讨论会已经完成总架构师和业务人员已同意在第一个为期三周的时间定量迭代中实现和测试某些处理销售用例的场景已经详细分析了架构上最重要的业务价值最高的20个用例中的3个用例,其中包括处理销售用例其他制品已经启动,包括补充规格说明,术语表和领域模型编程实验已经解决“演示阻塞”的技术问题,如在触摸屏上Java Swing UI是否起作用总架构师已经利用UML包图提出了大型逻辑架构的

2、构想9/22/20223软件分析与设计输入场景与对象设计关系用例文本定义最终必须得到软件对象的支持的可视行为。在UP中,这种OO设计也被顺利成章地成为用例实现补充规格说明定义了非功能性的目标,例如国际化,我们的对象必须满足这些目标系统顺序图确定系统操作消息,它是合作对象交互图中的开始消息词汇表明确来自UI层的参数或数据、传递到数据库的数据的细节,以及详细的特定项逻辑或验证需求,如合法的格式和对产品UPC(通用产品代码的)的有效性验证操作契约用来补充用例文本,以明确在系统操作中软件对象必须完成什么任务。后置条件定义了系统操作的详细结果领域模型描述了软件架构的领域层软件领域对象的名称和属性9/22

3、/20224软件需求分析与设计对象设计输出在开始编码之前针对设计中的难点创立UML交互图,类图和包图UI的草图和原型数据库模型报表的草图和原型9/22/20225制品关系Operation: enterItem()Post-conditions:- . . .Operation ContractsSaledate. . .SalesLineItemquantity1.*1. . . . .Domain ModelUse-Case ModelDesign Model: RegisterenterItem(itemID, quantity): ProductCatalogd = getProduc

4、tDescription(itemID)addLineItem( d, quantity ): SaleRequire-mentsBusiness ModelingDesignSample UP Artifact Relationships: SystementerItem(id, quantity)Use Case TextSystem Sequence DiagramsmakeNewSale()system eventsCashierProcess Sale: Cashieruse case namessystem operationsUse Case DiagramSupplementa

5、rySpecificationGlossarystarting events to design for, and detailed post-condition to satisfyProcess Sale1. Customer arrives .2. .3. Cashier enters item identifier.inspiration for names of some software domain objectsfunctional requirements that must be realized by the objectsideas for the post-condi

6、tionsRegister.makeNewSale()enterItem(.).ProductCatalog.getProductDescription(.).1*non-functional requirementsdomain rulesitem details, formats, validation9/22/20226软件分析与设计职责驱动方式把软件对象想象成为具有某种职责的人,它要与其他协作以完成职责职责定义为“类元的契约和责任行为职责自身执行一些行为,如创立对象或计算初始化其他对象中的动作控制和协调其他对象中的活动认知职责对私有封装数据的认识对相关对象的认知对其能够导出或计算的事物

7、的认知对于软件领域对象来说,由于领域模型描述了领域对象的属性和关联,因此其通常产生与认知“相关的职责9/22/20227职责与方法是相关的当我们在绘制UML交互图时,就是决定职责的分配: SalemakePayment(cashTendered): Paymentcreate(cashTendered)abstract, implies Sale objects have a responsibility to create Payments9/22/20228软件分析与设计GRASPGRASP通用职责分配软件模式General Responsibility Assignment Softwa

8、re Pattern创立者Creator控制器Cotroller纯虚构Pure Fabrication信息专家Information Expert高内聚High Cohesion间接性Indirection低耦合Low Coupling多态性Polymorphism防止变异Protected Variations9/22/20229软件分析与设计什么是模式模式是对问题和解决方案的已命名描述,它可以用于新的语境模式为在变化环境中如何运用和权衡其解决方案给出建议好的模式是成对的问题/解决方案,并且具有广为人知的名称模式名称信息专家问题给对象分配职责的原则是什么解决方案给类分配一种职责,使其具有完成

9、该职责所需要的信息9/22/202210设计模式创立者名称创建者(Creator)问题谁创建了A解决了方案如果下列条件之一为真时(越多越好),将创建类A实例的职责分配给类B:B”包含”或组成聚集了AB记录AB紧密地使用AB具有A的初始化数据,并且在创建A时会将这些数据传递A,对A的创建而言,B是专家如果有一个一上的选项适用,通常首选聚集或者包含A的类B9/22/202211局部领域模型SaletimeSalesLineItemquantityProductDescriptiondescriptionpriceitemIDDescribed-by*Contains1.*119/22/202212

10、创立SalesLineItem: Register: SalemakeLineItem(quantity): SalesLineItemcreate(quantity)9/22/202213设计模式创立者讨论创立者模式指导我们分配那些与创立对象有关的职责组合聚集局部,容器容纳内容,记录者进行记录,所有这些都是类图中之间极为常见的关系组合对象是创立其组成局部的良好候选者禁忌对象的创立常常具有复杂性,最好的方法可能是把创立职责委派给成为具体工厂或抽象工厂的辅助类9/22/202214设计模式创立者优点支持低耦合相关模式低耦合具体工厂和抽象工厂整体局部9/22/202215设计模式信息专家名称信息专

11、家(Information Expert)问题给对象分配职责基本原则是什么解决了方案把职责分配给具有完成该职责所需信息的那个类9/22/202216Sale的关联SaletimeSalesLineItemquantityProductDescriptiondescriptionpriceitemIDDescribed-by*Contains1.*119/22/202217局部交互图和类图Saletime.getTotal():Salet = getTotalNew method9/22/202218计算Sale的总额Saletime.getTotal()SalesLineItemquantit

12、ygetSubtotal()New method1 *: st = getSubtotal: Salet = getTotallineItems i : SalesLineItemthis notation will imply we are iterating over all elements of a collection9/22/202219计算Sale的总额Saletime.getTotal()SalesLineItemquantitygetSubtotal()ProductDescriptiondescriptionpriceitemIDgetPrice()New method:P

13、roductDescription1.1: p := getPrice() 1 *: st = getSubtotal: Salet = getTotallineItems i :SalesLineItem9/22/202220知道销售总额的职责设计类职责Sale知道销售的总额SalesLineItem知道商品的小计ProductionDescription知道产品的价格9/22/202221设计模式专家模式讨论信息专家经常用于职责分配,这是对象设计中不断使用的根本指导原那么完成职责往往需要分布在不同对象类的信息专家模式通常导致这样一种设计,软件对象所做的操作通常作用于他们真实世界中所代表的非

14、生命体的那些操作信息专家模式是对真实世界的模拟禁忌谁应当负责把Sale存入数据库呢?支持主要的关注别离可以改变设计中的耦合和内聚9/22/202222设计模式专家模式优点信息的封装得以维持,支持低耦合,进而形成更为健壮的、可维护的系统行为分布在那些具有所需信息的类之间,因此提倡定义内聚性更强的“轻量级的类相关模式低耦合高内聚9/22/202223设计模式低耦合名称低耦合(Low Coupling)问题怎样降低依赖性,减少因变化而带来的影响,提高重用性解决方案分配职责以使(不必要的)耦合保持在较低的水平。用该原则对可选方案进行评估耦合是对某元素与其他元素之间的连接,感知和依赖程度的度量。具有低耦

15、合的元素不会过多的依赖于其他的元素9/22/202224Register创立Payment: Registerp : Payment:SalemakePayment() 1: create() 2: addPayment(p) 9/22/202225Sale创立Payment: Register:Sale:PaymentmakePayment() 1: makePayment() 1.1. create() 9/22/202226设计模式低耦合讨论低耦合是设计中必须牢记的原那么耦合类型TypeX具有应用TypeY的实例或TypeX自身的属性TypeX对象调用TypeY对象的效劳TypeX具有以

16、任何形式引用TypeY的实例或TypeX自身的方法TypeX是TypeY的直接或间接子类TypeY是接口,而TypeX是此接口的实现9/22/202227设计模式低耦合讨论低耦合提倡职责分配要防止产生具有负面影响的高耦合低耦合不能脱离专家和高内聚等其他模式孤立的考虑,而应作为影响职责分配的设计原那么之一子类和超类之间有很强的耦合性对象之间的适度耦合对于创立面向对象系统来说是正常和必要的应该在降低耦合和封装事物之间进行选择9/22/202228设计模式低耦合禁忌高耦合对于稳定和普遍使用的元素而言并不是问题J2ee于Java类库优点不受其他构件变化的影响易于单独理解便于复用相关模式防止变异9/22

17、/202229专家支持低耦合信息专家的动机该原那么可以指导我们作出支持低耦合的选择。专家让我们寻找这样的对象,该对象具有职责所需的大局部信息,并把职责分配给该对象如果把职责分配到其他地方,总体耦合会比较高,存在更多的信息或对象必须被某些事物所共享9/22/202230设计模式控制器名称控制器(Controller)问题在UI层之上首先接收和协调(“控制”)系统操作的对象是什么解决方案把责任分配给能代表下列选择之一的对象:代表全部“系统”、”根对象”、运行软件的设备或主要的子系统,这些是外观控制器的所有变体代表用例场景,在该场景中发生系统事件对于同一用例的所有场景使用相同的控制器类会话是参与者进

18、行交谈的实例控制器是UI层上的第一个对象,它负责接收和处理系统操作消息9/22/202231NextGen应用中的假设干系统操作SystemendSale()enterItem()makeNewSale()makePayment(). . .9/22/202232哪个对象应该是enterItem的控制器Which class of object should be responsible for receiving this system event message?It is sometimes called the controller or coordinator. It does no

19、t normally do the work, but delegates it to other objects.The controller is a kind of facade onto the domain layer from the interface layer.actionPerformed( actionEvent ): ?: Cashier:SaleJFramepresses buttonenterItem(itemID, qty)UI LayerDomain Layersystem operation message9/22/202233控制器的选择代表整个“系统、“根

20、对象、装置或子系统Register, POSSytem代表用例场景中所有系统事件的接收者或处理者ProcessSaleHandler, ProcessSaleSession:RegisterenterItem(id, quantity) :ProcessSaleHandlerenterItem(id, quantity) 9/22/202234系统操作的分配Register.endSale()enterItem()makeNewSale()makePayment()makeNewReturn()enterReturnItem(). . .SystemendSale()enterItem()ma

21、keNewSale()makePayment()makeNewReturn()enterReturnItem(). . .system operations discovered during system behavior analysisallocation of system operations during design, using one facade controllerProcessSaleHandler.endSale()enterItem()makeNewSale()makePayment()SystemendSale()enterItem()makeNewSale()m

22、akePayment()enterReturnItem()makeNewReturn(). . .allocation of system operations during design, using several use case controllersHandleReturnsHandler.enterReturnItem()makeNewReturn(). . .9/22/202235设计模式控制器UI层不应当包含逻辑、所以UI层对象必须把工作请求委派给其他层系统外部输入事件,通常涉及人工操作,必须为这些事件选择一个处理者正常情况下,控制器应当把需要完成的工作委派给其他的对象。控制器

23、只是协调或控制这些活动,本身并不完成大量工作第一类控制器表示整个系统、装置和子系统的外观控制器如果您选择用例控制器,那么对于每一个用例,应该使用不同的控制器当把职责分配给外观控制器会导致内聚或高耦合的设计时,通常是当外观控制器的职责过多而变的“臃肿时,就需要考虑使用用例控制器UI对象和UI 层不应具有实现系统事件的职责9/22/202236控制器在Web UI和效劳器端的应用GRASP控制器是领域模层的一局部,它控制或协调工作请求的处理,根本不知道所用的UI技术可以用控制器模式在纯领域模型选择适宜的接收者对效劳器端系统操作的适当处理在很大程度上受所选择的效劳器技术与架构的影响对于与效劳器交互的

24、富客户端UI控制器模式仍然使用客户端把请求转发给本地的客户端控制器,控制器将全部或局部请求处理发送到远程的效劳器优点增加了可复用和接口的可插拔的潜力获得了推测用例状态时机9/22/202237使用Java Swing的实现:富客户端UIPackage public class ProcessSaleJframe extends private Register register; public ProcessSaleJFrame(Register _register)register = _register;private JButton BTN_ENTER_ITEM;private JBut

25、ton getBTN_ENTER_ITEM()if(BTN_ENTER_ITEM !=null)retuen BTN_ENTER_ITEM; BTN_ENTER_ITEM = new JButton();BTN_ENTER_ITEM.setText(“Enter Item);9/22/202238使用Java Swing的实现:富客户端UIBTN_ENTER_ITEM.addactionLister(new ActionListener()public void actionPerformed(ActionEvent e)ItemID id = Transformer.toItemID(get

26、Txt_ID().getText();int qty = Transformer.toInt(getTXT_QTY().getText();register.enterItem(id,qty););return BTN_ENTER_ITEM;9/22/202239使用Java Struts实现:客户端浏览器和WebUIpackage ;public class enterItemAction extern Actionpublic ActionFormward excute(ActionMapping mapping, Actionform form, HttpServletRequest r

27、equest, HttpServletResponse response) throw ExceptionRepository repository = (Repository )getServlet().getServletContext().getAttribute(Constats.REPOSITORY_KEY);Register register = repository.getRegister();String txtID = (SaleForm)form).getItemID();String txtQty = (SaleForm)form).getQuantity();ItemI

28、D id = Transformer.toItemID(txtId);int qty = Tansformer.toInt(txtQty);register.enterItem(id,qty); 9/22/202240臃肿的控制器问题设计不良的控制器类内聚性低,即没有重点,并且要处理过多领域的职责,成为臃肿控制器只有一个控制器来接收系统中的全部的系统事件,而且有很多系统事件为了处理系统事件,由控制器完成诸多必要的任务,而不是把工作委派出去控制器有许多属性,并且它维护关于系统或领域的重要信息9/22/202241解决臃肿的控制器方法增加控制器,系统不是只有一个控制器,应使用用例控制器,而不是外观

29、控制器MakeReservationHandlerManageSchedulesHandlerManageFareHandler设计控制器,使它把完成每个系统操作的职责委派给其他对象 9/22/202242UI层到领域层之间所期望的耦合actionPerformed( actionEvent ):Register: Cashier:SaleJFramepresses button1: enterItem(itemID, qty):Sale1.1: makeLineItem(itemID, qty)UI LayerDomain Layersystem operation messagecontr

30、oller9/22/202243接口层到领域层所不期望的耦合Cashier:SaleJFrameactionPerformed( actionEvent ):Sale1: makeLineItem(itemID, qty)UI LayerDomain LayerIt is undesirable for an interfacelayer object such as a window to get involved in deciding how to handle domain processes.Business logic is embedded in the presentation

31、 layer, which is not useful.SaleJFrame should not send this message.presses button9/22/202244设计模式控制器相关模式命令Command在消息处理系统中,可以用命令对象来表示和处理每个消息外观faade)-外观控制器是一种外观层Layer把领域逻辑置于领域层而不是表示层纯虚构Pure Fabrication软件类是由设计者任意创立的,而不是源于领域模型9/22/202245比照不同设计的内聚程度内聚是软件设计中的一种根本品质,内聚可以非正式地用于度量软件元素操作在功能上的相关程度所有的交互都会产生不良高耦

32、合。不良内聚和不良耦合通常是齐头并进的,左侧方案比右侧方案的内聚性较差高内聚9/22/202246设计模式高内聚名称高内聚(High Cohesion)问题怎样使对象保持内聚,可理解和可管理,同时具有支持低耦合的附加作用解决方案职责分配应保持高内聚,以此来评估备选方案内聚性较低的类要做许多互不相关的工作或需要完成大量的工作,导致的问题难以理解难以复用难以维护脆弱,经常会受到变化的影响9/22/202247Register创立Payment: Register: SaleaddPayment( p )p : Paymentcreate()makePayment()9/22/202248Sale创

33、立Payment: Register: SalemakePayment() : Paymentcreate()makePayment()9/22/202249设计模式高内聚在实践中,内聚程度不能脱离其他职责及其他原那么单独地考虑内聚程度的场景非常低内聚,由一个类单独负责完成不同的功能领域中的大量事物低内聚,由一个类单独负责一个功能性领域内的复杂任务高内聚,由一个类负责某个功能领域中的相应职责,并与其他类协作完成任务适度内聚,由几个类负责几个不同领域中的轻量级和单独的职责,这些领域在逻辑上与类的概念相关,但彼此之间并不相关高内聚的类优势明显,因为它易于维护,理解和复用9/22/202250设计模

34、式高内聚模块化是将系统分解成一组内聚的、松散耦合的模块的特性,通过创立具有高内聚的方法和类来促进模块化设计不良内聚通常会导致不良耦合,反之亦然在少数情况下可以接收低内聚将一组职责或代码放入一个类或构件中,以使某个人能方便地对其进行维护创立数量较少并且规模较大的低内聚效劳对象,以便为大量操作提供接口9/22/202251设计模式高内聚优点能够更加轻松,清楚地理解设计简化了维护和改进工作通常支持低耦合由于内聚的类可以用于某个特定的目的,因此细粒度、相关性强的功能的重要性增强9/22/202252设计实例用例实现描述某个用例基于协作对象如何在设计模型中实现设计者能够描述用例的一个或多个场景的设计,其

35、中的每个设计都称为用例实现9/22/202253制品关系强调用例的实现Operation: enterItem()Post-conditions:- . . .Operation ContractsSaledate. . .SalesLineItemquantity1.*1. . . . .Domain ModelUse-Case ModelDesign Model: RegisterenterItem(itemID, quantity): ProductCatalogd = getProductDescription(itemID)addLineItem( d, quantity ): Sa

36、leRequire-mentsBusiness ModelingDesignSample UP Artifact Relationships: SystementerItem(id, quantity)Use Case TextSystem Sequence DiagramsmakeNewSale()system eventsCashierProcess Sale: Cashieruse case namessystem operationsUse Case DiagramSupplementarySpecificationGlossarystarting events to design f

37、or, and detailed post-condition to satisfyProcess Sale1. Customer arrives .2. .3. Cashier enters item identifier.inspiration for names of some software domain objectsfunctional requirements that must be realized by the objectsideas for the post-conditionsRegister.makeNewSale()enterItem(.).ProductCat

38、alog.getProductDescription(.).1*non-functional requirementsdomain rulesitem details, formats, validation9/22/202254通讯图和系统操作的处理:RegisterenterItem:RegisterendSale:RegistermakePayment1: ?1: ?1: ?:RegistermakeNewSale1: ?makeNewSale, etc., are the system operations from the SSDeach major interaction diag

39、ram starts with a system operation going into a domain layer controller object, such as RegisterDOMAIN LAYERUI LAYERWindow objects or GUI widget objectsorWeb control objects. . .9/22/202255顺序图和系统操作的处理: Register: SalemakeNewSalecreate: RegisterenterItem(.): ProductCatalogdesc = getProductDesc( itemID

40、 ). . .UI LAYERWindow objects or GUI widget objectsorWeb control objects. . .DOMAIN LAYER将SSD中系统操作作为领域层控制对象的起始消息9/22/202256满足契约后置条件的局部交互图1: makeLineItem(.)enterItem(id, qty)1.1: create(.):Register:Sale:SalesLineItem依据对相关用例文本的思考,完成后置条件的状态变更,并设计消息的交互以满足需求9/22/202257Nextgen迭代的用例实现初始和“启动用例启动用例实现是设计语境,在该

41、语境中要考虑创立大局部的“根或生命期长的对象如何设计makeNewSale选择控制器Store, Register, POSSystemProcessSaleHander, processSaleSession创立新的Sale9/22/202258应用GRASP控制模式:RegistermakeNewSale:Salecreate9/22/202259Sale和集合的创立:RegistermakeNewSale:SalecreateRegister creates a Sale by CreatorcreatelineItems :Listby Creator, Sale creates an

42、 empty collection (such as a List) which will eventually hold SalesLineItem instancesby Creator and Controllerthis execution specification is implied to be within the constructor of the Sale instance9/22/202260Nextgen迭代的用例实现如何设计enterItem选择控制类Register是否要显示商品工程的描述和价格忽略有关显示的设计创立新的SaleLineItementerItem契

43、约的后置条件说明需要创立、初始化以及建立与SaleLineItem的关联通过在Sale的商品条目的集合中参加SalesLineItem的新实例,就可以在Sale与新创立的SalesLineItem实例间建立其关系9/22/202261Nextgen迭代的用例实现如何设计enterItem寻找productDescriptionProductCatalog是实现查找ProductDescription职责的最正确候选者ProductCatalog的可见性Register可以向ProductCatalog发送getProductDescription这样的消息9/22/202262EnterIte

44、m交互图、动态视图2: makeLineItem(desc, qty)enterItem(id, qty)1: desc = getProductDesc(id)2.1: create(desc, qty)1.1: desc = get(id):Register:Sale:ProductCatalogsl: SalesLineItemlineItems : List: Map2.2: add(sl)by Expertby Controllerby Creatoradd the newly created SalesLineItem instance to the List9/22/202263

45、和enterItem设计有关的局部DCD,静态视图SalesLineItemquantity : Integer.ProductCatalog.getProductDesc(.)ProductDescriptiondescription : Textprice : MoneyitemID: ItemID.1.*1.*Register.enterItem(.).SaleisComplete : Booleantime : DateTimemakeLineItem(.).111catalogcurrentSaledescriptionsMaplineItemsordereddescription9

46、/22/202264Nextgen迭代的用例实现如何设计EndSale选择控制类register设置Sale.isComplete计算销售总额设计Sale.gettotal9/22/202265完成商品工程的输入:RegisterendSale(s :Sale1: becomeCompleteby Expertby Controller9/22/202266Sale.getTotal交互图:Saletot = getTotal1 * i = 1.n: st = getSubtotal:ProductDescription1.1: pr = getPricelineItems i : Sales

47、LineItemby Expertby ExpertUML: note the selector notation to select elements from the lineItems collection9/22/202267在注解符号中展示方法:Saletot = getTotal1 * i = 1.n: st = getSubtotal:ProductDescription1.1: pr = getPricelineItems i :SalesLineItemmethodpublic void getTotal() int tot = 0; for each SalesLineIt

48、em, sli tot = tot + sli.getSubtotal(); return tot9/22/202268Nextgen迭代的用例实现makePayment创立Payment创立了Payment的实例p记录Sale的日志计算余额9/22/202269Register.makePayment的交互图1: makePayment(cashTendered)1.1: create(cashTendered):Register:Sale:PaymentmakePayment(cashTendered) by Controllerby Creator and Low Coupling9/2

49、2/202270谁应该负责获知已完成的销售Store.addSale(s : Sale).SalesLedger.addSale(s : Sale).Store is responsible for knowing and adding completed Sales.Acceptable in early development cycles if the Store has few responsibilities.SalesLedger is responsible for knowing and adding completed Sales.Suitable when the desi

50、gn grows and the Store becomes uncohesive.Sale.Sale.Logs-completed5Logs-completed5*119/22/202271在日志中记录已完成的销售1: makePayment(cashTendered)1.1: create(cashTendered):Registers :Sale:PaymentmakePayment(cashTendered) :Store2: addSale(s)completedSales: List2.1: add(s)by Expertnote that the Sale instance is

51、 nameds so that it can be referenced as a parameter in messages 2 and 2.19/22/202272Sale.getBalance的交互图s :Salepmt: Payment1: amt = getAmountbal = getBalance2: t = getTotal bal = pmt.amount -s.total 9/22/202273反映了更多设计决策的更为完整的DCDSalesLineItemquantity : IntegergetSubtotal()ProductCatalog.getProductDesc

52、(.)ProductDescriptiondescription : Textprice : MoneyitemID: ItemID.Storeaddress : Addressname : TextaddCompleteSale(.)Paymentamount : Money.1.*1.*Register.endSale()enterItem(.)makeNewSale()makePayment(.)SaleisComplete : Booleantime : DateTimebecomeComplete()makeLineItem(.)makePayment(.)getTotal()111

53、111*catalogcatalogregistercurrentSaledescriptionsMaplineItemsorderedpaymentcompletedSalesordereddescription9/22/202274Nextgen迭代的用例实现如何将UI 连接到领域层从应用的起始方法中调用的初始化对象,同时创立UI对象和领域对象,并且将领域对象传递给UIUI对象从众所周知的源提取领域对象具体设计从register中增加一个getTotal方法当UI层需要知道销售总额时,UI层请求一个当前Sale对象的引用,然后直接发送相应的消息给Sale9/22/202275连接UI层和领

54、域层:RegisterCashier:ProcessSaleJFrameactionPerformed( actionEvent )1: enterItem(id, qty)system eventUILayerDomainLayerpresses button9/22/202276连接UI层和领域层:RegisterCashier:ProcessSaleJFrameactionPerformed( actionEvent ) 1: enterItem(id, qty)2 no sale : s = getSale : SaleUILayerDomainLayers : Sale3: t =

55、getTotalpresses button9/22/202277Nextgen迭代的用例实现初始化和“启动用例何时创立初始化设计最后完成初始化设计如何完成应用的启动启动用例中的StartUP系统操作抽象地表示应用开始时执行的初始化阶段。对于所有的情形,常见的设计约定时创立一个初始领域对象或一组对等的初始领域对象一旦创立了初始领域对象,该对象将负责创立其直接的子领域对象选择初始领域对象选择位于或接近于领域对象包含或聚合层中的根类作为初始领域对象store.create9/22/202278初始领域对象及其后继领域对象的创立:Store:Registerpc:ProductCatalogcreate2: create(pc) 1: create1.2: loadProdSpecs() descriptions:Map1.1: create1.2.2*: put(i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论