第25章-GRASP-更多具有职责的对象

上传人:夏** 文档编号:578847261 上传时间:2024-08-25 格式:PPT 页数:27 大小:2.18MB
返回 下载 相关 举报
第25章-GRASP-更多具有职责的对象_第1页
第1页 / 共27页
第25章-GRASP-更多具有职责的对象_第2页
第2页 / 共27页
第25章-GRASP-更多具有职责的对象_第3页
第3页 / 共27页
第25章-GRASP-更多具有职责的对象_第4页
第4页 / 共27页
第25章-GRASP-更多具有职责的对象_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《第25章-GRASP-更多具有职责的对象》由会员分享,可在线阅读,更多相关《第25章-GRASP-更多具有职责的对象(27页珍藏版)》请在金锄头文库上搜索。

1、第25章 GRASP更多具有职责的对象GRASP: More Objects with Responsibilities目标学习使用其余的GRASP模式多态(Polymorphism)纯虚构(Pure Fabrication)间接性(Indirection)防止变异(Protected Variations)多态(Polymorphism)模式名:模式名:多态(Polymorphism)问题:问题:如何基于类型选择?如何创建可插拨的软件构件?解决方案:解决方案:当相关的或行为随类型(类)有所不同时,使用“多态操作”为变化的行为类型分配职责 。推论:推论:不要测试对象的类型,也不要使用条件逻辑来

2、执行基于类型的不同选择图25-1 使用多态适配不同的外部税金计算器NextGen问题:如何支持第三方税金计算器图25-2 对Monopoly问题应用多态Monopoly问题:如何设计不同的方格活动在图25-3和图25-4中用非正式的方法表示多态情形图25-3 应用多态性发送消息到接口发送消息到接口每种类型都有不同的landon(p)实现见图25-4到25-7图25-4 GoSquare的情形RegularSquare的情形图25-5 RegularSquare的情形IncomeTaxSquare的情形图25-6 IncomeTaxSquare的情形GoToJailSquare情形图25-7 G

3、oToJailSquare的情形多态(Polymorphism)-讨论 容易加入新变种(新的种类) 可以引入新的实现而不会影响客户对象优点: 防止变异(Protected Variations) 许多设计模式依赖于多态(Polymorphism)。包括适配器(Adapter)命令(Command)组成(Composite)代理(Proxy)状态(State)和策略(Strategy)模式。相关模式:纯虚构(纯虚构(Pure Fabrication)模式名:模式名:纯虚构(Pure Fabrication)问题:问题:为了让设计更清晰而不想破坏高内聚性和低耦合,应采用什么方案呢?解决方案:解决方

4、案:分配这组高度内聚的职责给一个人造类。人造类不代表问题领域的任何事物,只是为了支持高内聚、低耦合和可重用而虚构的一个类。NextGen问题:在数据库中保存Sale对象假设需要保存一个假设需要保存一个SaleSale的实例到一个关系数据库,这个职责该分配给谁的实例到一个关系数据库,这个职责该分配给谁?这个纯虚构解决了以下设计问题:这个纯虚构解决了以下设计问题: Sale 保持了具有高内聚和低耦合的良好设计保持了具有高内聚和低耦合的良好设计 PersistentStorage 本本身身的的职职责责相相对对内内聚聚,具具有有存存储储或或插插入入对对象象到到持持久久化化存存储储介介质质的的单一性目的

5、单一性目的 PersistentStorage 是一个非常一般的和可重用的类是一个非常一般的和可重用的类根据信息专家模式,保存Sale的实例的职责可以分配给Sale本身。但是,会导致高内聚,低耦合和难以复用。Monopoly问题:处理骰子图25-8 关于Cup的DCD旧方案:Player滚动所有的骰子并且计算总点数。旧方案的缺点:1.计算总点数的服务无法用于其它游戏。 2. 不再次滚动骰子,则不能获知当前骰子总点数。新方案:引入纯虚构对象“骰盅”(Cup)在Monopoly游戏中使用Cup图25-9 在Monopoly游戏中使用Cup对象设计的讨论设计的对象大致可分为两类:设计的对象大致可分为

6、两类: 通过具有代表意义的分解(representational decomposition)而设计对象 代表问题域(或与问题域相关)的事物 - 领域模型中的概念类 通过行为的分解(behavioral decomposition)而设计对象 为了聚合某些公共的行为而构造的类,从功能方面划分职责。纯虚构通常基于相关的功能性进行划分,是一种以功能为中心的或纯虚构通常基于相关的功能性进行划分,是一种以功能为中心的或行为的对象行为的对象间接性(Indirection)模式名:模式名:间接性(Indirection)问题:问题:为了避开两个或多个事物之间直接耦合,该在如何分配职责?如何使对象解耦,以支

7、持低耦合并提高利用性潜力?解决方案:解决方案:将职责分配给中介对象,使其作为其他构件或服务之间的媒介,以避免它们之间的直耦合。中介实现了其它构件之间的间接性。示例:示例:如何避免如何避免Sale和和TaxMasterSystem之间直接耦合呢之间直接耦合呢也可能是:也可能是:SOAP over HTTP图25-10 通过适配器实现间接性示例:如何将Sale和关系数据库解耦通过引入PersistentStorage类作为Sale和数据库之间的中介,对它们进行解耦。这也是间接性的一个例子。防止变异(Protected Variations)模式名:模式名:防止变异(Protected Variat

8、ions)问题:问题:如何设计对象、 子系统和系统,使内部的变化或不稳定性不会对其他元素产生不良影响?解决方案:解决方案:识别预计变化或不稳定之处,分配职责用以在这些变化之外创建稳定接口。注:通过增加一层间接性,即接口。内部对象只与稳定的接口协作。这实现注:通过增加一层间接性,即接口。内部对象只与稳定的接口协作。这实现了隐藏外部系统的变化。了隐藏外部系统的变化。该图显示了变化被保护,变化点是外部税务计算该图显示了变化被保护,变化点是外部税务计算系统的系统的APIs(有不同的接口有不同的接口)。图25-1 使用多态适配不同的外部税金计算器示例:ITaxCalculatorAdapter接口实现了

9、防止外部税金计算器的变异关于“防止变异”的讨论“防止变异”是非常重要和基本的软件设计原则。大部分设计原则和模式都是防止变异的机制(特例)。如:多态、接口、间接性、数据封装、大部分GoF设计模式等。PV是一个根本原则,其促成了大部分编程和设计的机制和模式,用来提供灵活性和防止变化。包括数据、行为、硬件、软件构件、操作系统等的变化。就某种程度而言,从以下面可以发现开发者或架构师的成熟度不断地增长更多实现PV机制的知识选择值得解决的适宜的PV问题选择恰当的PV解决方案的能力源于防止变异的机制1数据驱动设计涵盖了一大族技术,包括读取来自外部的代码、值、类文件路径、类名等。用以在运行时以某种方式改变或“

10、参数化”系统。其它变化因素还包括样式表、对象-关系映射元数据、属性文件、读取窗口布局等。通过外置、读取并判断这些变化因素,能够防止数据、元数据或说明性变量对系统造成的影响服务查询包括使用命名服务(如Java JDNI)或用来获取服务的经纪人(例如Java Jini或Web Service的UDDI)等技术通过使用查询服务的稳定接口,客户能够避免服务位置变化的影响。这是数据驱动设计的一个特例源于防止变异的机制2解释器驱动的设计包括:读取并执行外部规则的规则解释器,读取并运行程序的脚本或语言解释器器、虚拟机、执行网络的神经网络引擎、读取并分析约束集的约束逻辑引擎等。这种方式能够通过外部逻辑表达式变

11、更或参数化系统行为。系统通过外置、读取、解释逻辑而避免了逻辑变化的影响。反射或元级的设计如:Java的反射机制。使用以获取BeanInfo对象,并为bean的X属性请求getter方法的Method对象,然后调用Method.invoke。通过使用自省-元语言服务的反射算法,系统可以避免逻辑或外部代码变化的影响。该方法可视为数据驱动设计的特例。源于防止变异的机制3统一访问诸如Ada,Eiffel和C#等语言支持语法构造,以便能以一种方式同时表示方法和字段的访问。可以将公共字段变为访问方法,而无需改变客户代码标准语言如SQL等官方语言标准为各种语言的繁衍提供了限定保护Lisko规换原则(LSP)

12、用子类或实现类(S)的对象替换父类或其它实现类(T)的对象,引用类型T的软件应该正常或按照预期工作。警告:预测PV和选择你的战斗两个变更点变化点:现有、当前系统或需求中的变化,例如必须支持多个税金计算器接口进化点:预测将来可能会产生的变化点,但并不存在于现有需求中。如果实际需要灵活性和对变化预防,那么就应该应用PV。如是如果预测将来验证或预测“复用”的可能性十分不确定,则需要有克制和批判的态度。初学者倾向于脆弱的设计,而中等程度的开发者倾向于过度想象的、灵活的、一般化的设计。专家级的开发者会理智也进行选择。有时,简单和脆弱的设计可能会与其变化所需的成本达成平衡。别称和类似模式PV基本上等同于信息隐藏和开放-封闭原则。信息隐藏由于困难和可能的变化而对其他模块隐藏与设计相关的信息。开放-封闭原则模块应该同时(对扩展、可适应性)开放和(对影响客户的更改)封闭。如:数据封装机制中的私有字段和公共访问方法,类对于实例字段而言是封闭的,而对于修改私有数据的定义而言是开放的。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号