Chapter 18 使用GRASP的对象设计示例
大纲 用例实现 应用GRASP为类分配职责 应用UML阐述和思考对象的设计
什么是用例实现 用例如何在设计模型中实现
系统事件
用例实现
领域模型
如何实现makeNewSale 契约(后置条件) 选择控制器 创建了Sale的实例s s被关联到Register s的属性被初始化 类型1还是类型2?
如何实现makeNewSale
如何实现enterItem
如何实现enterItem 契约(后置条件) 控制器类的选择 创建了SalesLineItem的实例sli sli被关联到当前的Sale sli.quantity赋值为quantity 基于itemID的匹配,sli被关联到ProductDescription 控制器类的选择
如何实现enterItem
用代码表示对象的协作? Register::enterItem(id, qty){ ProductDescription desc = ProductCatelog.getInstance().get(id); currentSale.makeLineItem(desc,qty); }
修改后的设计类图
如何实现endSale 契约(后置条件) Sale.isComplete被设为真 控制器的选择
计算销售总额
如何实现makePayment 契约(后置条件) 创建了Payment的实例p p.amountTendered被赋值为amount p被关联到当前的Sale 当前的Sale被关联到Store
如何实现makePayment
记录Sale
记录Sale
计算余额
最终的DCD
比较 SaleTable RegisterTable
比较 Service_3 Service_n
如何将UI层连接到业务层 获取业务对象的方法 从应用的入口方法(如main方法)创建业务层的 “根”对象,并传递给UI。 从工厂对象取得业务对象。
启动应用(代码) public class Main { public static void main(String[] args) Store store = new Store(); Register register = store.getRegister(); ProcessSaleJFrame frame = new ProcessSampleJFrame(register); ....... }
启动应用(交互图)
UI层获取合计额的设计