




已阅读5页,还剩76页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
软件工程 第17讲第11章面向对象设计与实现 11 4 11 5 主讲人 李淑芝 第11章面向对象设计与实现 11 1面向对象设计模型11 2构件级设计11 3确定并发性11 4使用设计模式11 5面向对象详细设计11 6数据存储与持久性设计11 7部署设计与构件图11 8面向对象设计案例分析 本讲学习 11 4使用设计模式 有经验的软件开发者建立了既有通用原则又有惯用方案的指令系统来指导他们编制软件 如果以结构化形式对这些问题 解决方案和命名进行描述使其系统化 那么这些原则和习惯用法就可以称为模式 基于职责设计对象 GeneralResponsibilityAssignmentSoftwarePatterns GRASP 信息专家 创建者 控制器 高内聚 低耦合 多态 纯虚构 间接性和防止变异GoF GangofFour 模式23种设计模式 其中基本的有适配器 工厂 单实例类 策略 组合 外观和观察者等模式 基于职责的设计 职责驱动设计也即基于职责的设计 在设计中软件对象具有职责 即对其所作所为进行抽象 UML把职责定义为 类元的契约或义务 就对象的角色而言 职责与对象的义务和行为相关 职责分为以下两种类型 对象的行为职责包括 自身执行一些行为 如创建对象或计算初始化其他对象中的动作控制和协调其他对象中的活动对象的认知职责包括 对私有封装数据的认知对相关对象的认知对其能够导出或计算的事物的认知职责的粒度会影响职责到类和方法的转换 1 GRASP 职责不同于方法 职责是一种抽象 而方法实现了职责 绘制UML交互图时 就是在决定职责的分配 通过GRASP中的基本原则来指导如何分配职责给一个对象 五种基本的GRASP模式 创建者模式信息专家模式控制器模式低耦合模式高内聚模式 职责与方法 问题 一个对象由谁 哪个对象 创建 指导原则是 将创建一个对象A的职责分配给对象B的条件是 B 包含 或组成聚集了A B记录A B紧密地使用A B具有A初始化数据并且在创建A时会将这些数据传递给A 简而言之 就是一个对象要由拥有或者使用其信息的 与其有密切关系的另一个已存在的对象创建 2 五种基本的GRASP模式 1 创建者模式 POS机系统中谁创建Sale对象 例如 在POS机系统中的Sale对象是由哪个对象类创建 对于对象Sale由谁创建 分析一下领域模型就会发现 可以认为Register是记录Sale的类 因此Register对象是创建Sale对象的合理选择 2 信息专家模式 信息专家 通常称为专家 模式是最基本的职责分配原则之一 创建者是对象的行为职责 而信息专家常常指的是对象的认知职责 指导原则是 给对象分配职责时 应该把职责分配给具有完成该职责所需要信息的那个类 计算销售总额 例如 在POS机系统中 销售的总额该如果确定 决定总额的一些元素应该是属于哪些对象的信息按照信息专家的建议 这里应当寻找具有确定总额所需信息的那个对象类 分析领域模型和设计模型得到 要计算总额应该知道销售的所有SalesLineItem实例及其小计之和 Sale实例包含了上述信息 为了确定商品的小计 这里需要SalesLineItem quantity和ProductDescription price SalesLineItem知道其数量和与其关联的ProductDescription 3 控制器模式 根据MVS ModelViewSeparation 原则 UI对象不应当包含应用逻辑或业务逻辑 应该把UI层的操作或者请求委派给一个协调者 由协调者把任务转发给领域层的领域对象 控制器就是这样一个协调者 控制器的选择原则是 代表全部 系统 根对象 运行软件的设备或主要的子系统 如 外观控制器 代表发生系统操作的用例场景 如 会话控制器 在用例场景中发生的系统事件通常命名为 Handler Coordinator或Session 对于用同一用例场景的所有系统事件使用相同的控制器类 控制器类 例如 在POS机系统中 enterItem和endSale这样的系统事件 应使用谁作为控制器 指导原则是 控制器是UI层之上的第一个对象 它负责接收和处理系统操作消息 4 低耦合模式 低耦合模式是一个评价模式 低耦合原则适用于软件开发的很多方面 它是构件软件最重要的目标之一 指导原则是 分配职责以使耦合保持在较低的水平 在真实世界领域中 Register记录了Payment 所以创建者模式建议将Register作为创建Payment的候选者 Register实例会把addPayment消息发送给Sale 并把新的Payment作为参数传递给它 这种职责分配使Register类和Payment类之间产生了耦合 即Register类要知道Payment类 高耦合问题 低耦合解决方案 5 高内聚模式 高内聚模式是一个评价模式 内聚是软件设计中的一种基本品质 内聚可以非正式地用于度量软件元素操作在功能上的相关程度 也可以用于度量软件元素完成的工作量 指导原则是 分配职责可保持较高的内聚性 低内聚问题 高内聚解决方案 11 5面向对象详细设计 面向对象详细设计的目的就是不断精化设计类领域模型是对领域内的概念类或现实世界中对象的可视化表示 领域模型也称为概念模型 领域对象模型和分析对象模型 领域模型的精化对类图和交互图的精化起了至关重要的作用 也是设计良好系统的关键 使用泛化 特化 关联类 时间间隔 组合和包等概念精化领域模型 泛化是在多个概念中识别共性和定义超类 普遍概念 与子类 具体概念 关系的活动 例如在POS机系统中为CashPayment CreditPayment和ChequePayment引入超类Payment 在领域中识别父类和子类是一个有价值的活动 这样可以使我们对概念有更概括 精炼和抽象的描述 减少冗余 领域模型精化 1 泛化和特化 POS机系统中Payment 领域模型精化 2 定义概念超类和子类 概念超类的定义较子类的定义更为概括或包含范围更广 例如 在POS机系统中 考虑超类Payment和它的子类 将概念类划分为子类的动机有 子类有额外的有意义的属性 子类有额外的有意义的关联 子类概念的操作 处理 反应或使用的方式不同于其超类或其他子类 而这些方式是我们所关注的 子类概念表示了一个活动体 其行为与超类或其他子类不同 而这些行为是我们所关注的 领域模型精化 泛化和定义概念超类的动机 潜在的概念子类表示的是相似概念的不同变体 子类满足100 准则 即概念超类的定义必须100 适用于子类 子类必须100 与超类一致 所有子类都具有相同的属性 可以将其解析出来并在超类中表达 所有子类都具有相同的关联 可以将其解析出来并与超类关联 2 定义概念超类和子类 领域模型精化 Payment类层次划分 领域模型精化 原则 在领域模型中 如果类A可能同时有多个相同的属性B 则不要将属性B置于A之中 应该将属性B放在另一个类C中 并且将其与类A关联 这样就得出一个关联类C 在POS机系统中 授权服务给每个商店分配一个商业ID 商店发送授权服务的支付授权请求需要商业ID标识商店 商店对于每个服务有不同的商业ID Store可能有多个merchantID值 所以将merchantID作为Store的属性是不正确的 同理 放入AuthorizationService中也不正确 可以用一个关联类ServiceContract来拥有属性merchantID 3 关联类 领域模型精化 关联类的增加具有原则 有某个属性与关联相关 关联类的实例具有依赖于关联的生命期 两个概念之间有多对多关联 并且存在与关联自身相关的信息 3 关联类 领域模型精化 4 聚合关系和组合关系 聚合是UML中的一种模糊关联 其不明确的暗示了整体和部分关系 组合也称组成聚合 是一种强的整体 部分聚合关系 并且在某些模型中具有效用 组合关系意味着 在某一时刻 部分的一个实例只属于一个组成实例 部分必须总是属于组成 组成要负责创建和删除部分 可以自己创建和删除部分也可以和其它对象协作进行创建和删除部分 组成被销毁 其部分必须要销毁 领域模型精化 识别和显示组合关系 好处 有利于澄清部分对整体的依赖的领域约束 有助于使用GRASP创建者模式识别创建者 对整体的复制 拷贝这些操作经常会传递给部分 在POS机系统中 SalesLineItems可以被视为Sale的组成部分 ProductCatalog是ProductDescriptions的一个组成 部分的生命期在组成的生命期之内 部分的创建和删除依赖于整体 在物理或者逻辑组装上 有明确的整体 部分关系 组成的某些属性会传递给部分 对组成的操作可能传递给部分 组合关系的识别准则是 4 聚合关系和组合关系 领域模型精化 组合关系 4 聚合关系和组合关系 领域模型精化 例如 POS机系统在初始设计时 SalesLineItems与ProductDescriptions关联 记录了销售项的价格 在精化过程中 需要关注与信息 合同等相关的时间间隔问题 如果SalesLineItems从ProductDescriptions取得当前价格 当价格改变时 以前的销售将指向新的价格 这很显然是不正确的 需要区别销售发生时的历史价格和当前价格 基于信息需求 可以采用两种方法对此问题解决 一是可以在ProductDescriptions中保存当前价格 仅将销售发生时的价格写入SalesLineItem 二是将一组ProductPrices与ProductDescriptions关联 每个ProductPrices关联适用的时间间隔 5 时间间隔 领域模型精化 区别历史价格和当前价格 5 时间间隔 领域模型精化 将领域模型划分成包结构时 将满足下述条件的元素放在一起 在同一个主题领域 概念或目标密切相关的元素 在同一个类层次结构中的关系 参与同一个用例的元素 有很强的关联性的元素 例如 在POS机系统领域模型中包的结构 6 使用包来组织领域模型 领域模型精化 POS机系统领域模型 6 使用包来组织领域模型 领域模型精化 包嵌套 6 使用包来组织领域模型 领域模型精化 在逻辑架构精化设计中主要更细化各层内部元素 层与层之间关系和分层架构中一些模式的应用 遵循模型 视图 控制器 MVC 三层模型 在精化逻辑模型时首先要进一步指出系统层之间 包之间的关系 可以用依赖线来表达包或者包内类型之间的耦合 依赖线可以由一个包发出 例如在POS机系统中从Sale包指向POSRuleEngineFacade类 从Domain包指向Log4J包 逻辑架构的精化设计 包的耦合 逻辑架构的精化设计 1 层次模型 简单包和子系统 逻辑架构的精化设计 2 层次设计模式 外观和控制器 逻辑架构的精化设计 2 层次设计模式 模型 视图分离和 向上 通信 逻辑架构的精化设计 2 层次设计模式 包设计准则 包在水平和垂直划分上的功能性内聚由一组接口组成的包正式包和聚集不稳定类的包职责越多的包越需要稳定将不相关的类型分离出去使用工厂模式减少对具体包的依赖 逻辑架构的精化设计 3 分层设计 分离不相关的类型 逻辑架构的精化设计 3 分层设计 具体包的依赖 逻辑架构的精化设计 3 分层设计 工厂模式减少对具体包的依赖 逻辑架构的精化设计 3 分层设计 详细设计问题 1 本地缓存处理 当远程服务访问失败时 比如产品数据库暂时无法访问 需要保障交易正常进行 解决的方法是使用由servicesFactory工厂创建的Adapter对象 实现对服务位置的防止变异 例如 可以提供远程服务的本地部分复制 实现从远程到本地的容错 本地产品信息数据库将缓存最常用的一小部分产品信息 等重新连接时将在本地存储库存的更新 为了满足重新连接远程服务的质量场景 对这些服务使用智能代理对象 在每次服务调用时都要测试远程服务是否激活 并且在远程服务激活时进行重新定向 实现从远程服务访问失败中恢复 详细设计问题 1 本地缓存处理 为了实现从远程数据库访问失败中恢复的可能性 我们建议使用ProductDescription对象的本地缓存 以文件形式存放在本地硬盘中 在试图访问远程服务之前 应该总是首先在本地缓存中查找产品信息 使用适配器和工厂模式能够间接地实现这一特性 ServiceFactory总是返回本地产品信息服务的适配器 本地产品适配器并不会真正地适配其他构件 它将负责实现本地服务 使用实际的远程产品服务适配器的引用来初始化本地服务 如果本地服务在缓存中找到数据 就将数据返回 否则 将请求转发给外部服务 详细设计问题 1 本地缓存处理 在内存中的ProductCatalog对象保存着从产品信息服务中读取的一些ProductDescription对象的内存集合 例如Java的HashMap 依据本地可用内存的大小 可以调整该集合的大小 本地产品服务可以维护一个较大的持久化缓存 例如基于硬盘文件存储 用于维护一定数量的产品信息 该持久化缓存对于容错很重要 即使POS机应用程序崩溃 内存中的ProductCatalog对象丢失 但持久化缓存依然有效 两级客户端缓存 详细设计问题 1 本地缓存处理 产品信息服务的初始化 详细设计问题 1 本地缓存处理 从本地读取产品信息 详细设计问题 1 本地缓存处理 从服务器上读取产品信息 详细设计问题 1 本地缓存处理 从服务器上读取产品信息 详细设计问题 2 异常处理 由于产品价格经常变动 缓存价格信息会导致数据失效 解决的方案是增加远程服务操作 来查询当日更新的数据 LocalProducts对象定期地查询并更新它的缓存 如果这样做 将LocalProducts对象设计为拥有控制线程的主动对象 线程休眠一段时间 唤醒后读取数据 再次休眠 如此反复 详细设计问题 2 异常处理 详细设计问题 2 异常处理 详细设计问题 2 异常处理 采用对象缓存文件的方案可以提高系统效率 但是本地缓存没有产品信息时访问外部产品服务失败时 系统如何处理 通知故障的最直接的方法是抛出一个异常 当访问外部产品数据库失败时 持久化子系统可能抛出异常 常用的异常处理模式称为 转换异常 模式 转换异常模式的原则是 在一个子系统中 避免直接抛出来自较低层子系统或服务的异常 应该将较低层的异常转换成在本层子系统中有意义的异常 较高层的异常包裹较低层的异常并添加一些信息 使该异常在较高层子系统语境中有意义 详细设计问题 2 异常处理 详细设计问题 2 异常处理 详细设计问题 2 异常处理 详细设计问题 2 异常处理 面向对象设计的进一步讨论 1 支付实现 结束销售后就是获取总额的操作 由控制器发出getTotal 操作并要求返回总额tot 总额计算得出后就可以进行makePayment 操作 最后是计算找零的系统操作 将Sale对象与Payment对象相结合 面向对象设计的进一步讨论 2 容错处理 系统的使用过程是首先尝试本地服务 如果没有命中 然后进行尝试外部服务 但这种方案并不是对所有服务都适用 例如账务服务过程中的记录销售 希望快速实时地追踪商店和终端的活动 代理 Proxy 模式是解决这个问题较好的方案 代理模式的变体称为远程代理 RemoteProxy 模式 代理模式的另一种变体称为重定向代理 RedirectionProxy 模式 也称为容错代理 FailoverProxy 面向对象设计的进一步讨论 2 容错处理 面向对象设计的进一步讨论 2 容错处理 重定向代理 代理模式的基本原则是 通过代理对象增加一层间接性 代理对象实现与subject对象相同的接口 并且负责控制和增强对主体对象的访问 重定向代理 向重定向代理发送postSale消息 将其视为实际的外部账务服务 如果重定向代理通过适配器与外部服务通信失败 则将postSale消息重定向到本地服务 本地服务将Sale保存在本地 当账务服务激活时重新发给它 面向对象设计的进一步讨论 3 非功能性需求设计 标准的JavaPOS接口 面向对象设计的进一步讨论 3 非功能性需求设计 抽象工厂模式 POS机系统中 系统需要与各种各样的设备进行工作 包括显示器 票据打印机 现金抽屉 扫描仪等等 这些设备许多都存在工业标准和已经定义好的标准的面向对象接口 例如 UnifiedPOS是为POS机设备定义了接口的工业标准的UML模型 使用工厂模式从系统属性中读取需要加载的类集 并返回基于其接口的实例 设备驱动能够与JavaPOS接口进行适配 因此可以看作是适配器对象 它们可以作为代理对象 控制和增强对物理设备访问的本地代理 面向对象设计的进一步讨论 3 非功能性需求设计 定义一个工厂接口 抽象工厂 为每一族要创建的事物定义一个具体的工厂类 或者定义实际的抽象类来实现工厂接口 为扩展该抽象类的具体工厂提供公共服务 抽象工厂模式的一种变体是创建一个抽象工厂 使用单实例类 Singleton 模式访问它 读取系统属性以决定创建哪个子类工厂 然后返回对应的子系统实例 抽象工厂模式的基本原则 面向对象设计的进一步讨论 3 非功能性需求设计 面向对象设计的进一步讨论 3 非功能性需求设计 在交互图中 领域模型指出了需要设计的软件对象 设计模型中的设计类是以领域模型的类为基础的 在顺序图和协作图精化设计中 一些类直接来自前面的分析模型中的类 还有一些针对软件系统的更好的实现虚构出来的 例如设计makeNewSale操作 要处理一次新的销售 首先必须创建软件对象Sale 根据控制器模式我们还需要设计一个转发makeNewSale请求的对象Register Register是记录Sale的类 又根据创建者模式得出应该由Register创建Sale 在销售过程中必须设计一个集合来存储一系列的商品 所有由Sale对象创建了记录所有将来会添加的集合SalesLineItem实例 精化的交互图 makeNewSale设计细节 详细设计问题 精化设计 输入商品条目的协作图 详细设计问题 精化设计 结束销售 详细设计问题 精化设计 获取总价 详细设计问题 精化设计 处理支付 详细设计问题 精化设计 计算找零 详细设计问题 精化设计 类图和对象图是设计阶段的主要制
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教师招聘之《幼儿教师招聘》考前冲刺试卷含答案详解【综合卷】
- 2025年梁山辅警考试题库(附答案)
- 2025年甘肃省辅警(协警)招聘考试题库及答案
- 2025年辅警笔试考试题库(附答案)
- 押题宝典演出经纪人之《演出经纪实务》模考模拟试题附答案详解【黄金题型】
- 演出经纪人之《演出经纪实务》强化训练题型汇编(完整版)附答案详解
- 教师招聘之《小学教师招聘》考试押题卷【有一套】附答案详解
- 演出经纪人之《演出经纪实务》过关检测试卷附完整答案详解【各地真题】
- 2025年教师招聘之《小学教师招聘》试题(原创题)附答案详解
- 2025内蒙古呼伦贝尔职业技术学院招聘30人笔试备考及答案详解(历年真题)
- 2024数据要素典型案例集
- 医院科室副主任竞聘
- 无人机项目建设规划投资计划书
- 机动车驾驶员培训理论科目一考核题库500题(含答案)
- 人教版(2019)高中生物必修1《分子与细胞》期末复习知识点考点提纲
- 初一开学第一课初一新同学我想对你说课件
- 《无线电失效程序》课件
- 汽车产品使用说明书
- 集体协商工作指导手册
- 摩托车行驶安全知识
- 防震减灾科普
评论
0/150
提交评论