最近网友Uranus问我了一个非常有趣的问题:设计模式GRASP和GoF是怎样解决耦合的问题?实际上虽然同是设计模式,解决对象间耦合的问题都是它们的终极目标,但是它们在解决它们的方式上却是完全不同的,GRASP是从整体设计上解决耦合的问题,而GoF却是从具体实现上解决的,在这里我们不妨探讨一下。
设计模式GRASP其名称翻译过来就是“通用职责分配设计模式”,从字面上我们不难发现,“职责分配”是GRASP的核心。GRASP认为,在对象设计时,只要各个对象的职责分配清楚了,能够各司其职,耦合就会降低。因此,GRASP应用的一个非常重要的场景是,我们项目的业务需求已经分析清楚了,正准备开始设计对象。GRASP告诉我们,一个系统里面到底应当有哪些对象,应当来源于领域模型,换句话说就是来源于现实时间中的事物。现实世界中有什么事物,我们软件空间中就应当有什么对象。当然,现实世界中的事物不一定都需要在软件空间中有对应的对象,要根据需求而定,但软件空间中的对象应当对应于现实世界中的事物,这种设计原则有个专用术语叫“低表示差异”。按照这个原则设计好了我们的对象以后,应当如何分配它们的职责呢?当然是来源于现实世界。我们的对象在现实世界中应当有什么职责,那么我们的对象就应当有什么样的职责。如此分析,每个对象的职责就非常清楚,那么业务需求中的各种功能应当如何分配给对象呢?现实世界是怎样分配的,软件世界就怎样分配的。最后,如何在各个功能中将对象组织起来呢?GRASP的专家模式解答了这个问题;对象应当由谁来创建,GRASP的创建者模式解答了这个问题。GRASP通过这样一个步骤,设计对象、分配职责、确定功能、建立联系,一个项目的整体框架就展现出来了,而这样一个框架必然是低耦合高内聚的,为什么呢?这方面的详细论述朋友们可以看我写的《(原创)一个优秀软件开发人员的必修课:GRASP软件开发模式浅析》,这里我就不再累赘了。但是,GRASP只解决了整体设计中的耦合问题,只解决了一部分,而另一部分需要依靠GoF。
前面我们说到运用GRASP进行整体设计依靠的是现实世界和业务需求。这样的分析还没有介入任何技术的成分。但是随着我们的进一步分析,我们开始尝试运用各种具体的技术去实现这些业务需求需要实现的功能,我们发现问题出现了。比如,我们在整体设计的时候设计的一组继承关系的对象,其它需要使用它们的对象如何去调用它们?去具体地调用它们的某个子类吗?这显然不是一个好的方案,GoF的工厂模式告诉我们,这里需要设计一个工厂类。这里增加的这个工厂类不是来源于现实世界,GRASP称这样的对象为“纯虚对象”。纯虚对象是从现实对象中抽象出来的一些功能,但GRASP不能告诉我们应当抽象出哪些纯虚对象,解决这样的问题需要运用GoF。再比如,商场中的许多商品都需要打折,但是各种商品的打折策略其实并不是完全不同的,是有相似之处的,有的是按比例打折,有的是满500送100,有的是学生才打折。如此这般,如果我们对一个商品父类的所有商品子类都重载一遍自己“折扣”方法,显然不是一个好的设计,不如将所有的折扣方法抽象出来,形成抽象的“折扣策略”父类和具体的折扣子类,然后由各个商品子类自己去选择自己需要的折扣策略。如此这般,就运用了GoF的策略模式。通过以上分析,我们不难看出,GoF是在具体实现中去解决对象的耦合问题的。它是在GRASP分析的整体框架下,对一些具体的对象及其方法进行重新组织,解决对象耦合问题的。
现在,我们再换一个角度,从整个软件开发过程来分析GRASP和GoF。按照RUP的设计流程,首先当然是设计用例模型和领域模型,然后就进入分析模型和设计模型阶段。但是非常神奇的是,分析模型和设计模型既非常相似,又没有一个明显的界限来区分哪些是分析模型,哪些是设计模型。按照我的理解,分析模型是从不包含任何技术的,纯业务的角度开始对象分析的。不论是Java的项目、C++的项目还是Delphi的项目,不论是B/S的结构还是C/S的结构,分析模型的开始都是一样的。从分析模型的一开始,就是运用GRASP一步一步的进行对象分析和设计的。通过这样的设计,对应于现实世界的一个一个对象被设计出来,然后赋予它们职责和功能,分配它们属性和方法,建立起它们相互之间的联系与协作。分析完这些以后,它们的各个具体的属性和方法就需要开始实现,这时技术的东西开始介入,我们开始考虑把一些具体的实现抽象为接口和抽象类,以适应今后的需求变化。这时候,GoF的一些设计模式开始广泛运用,纯虚对象开始一个一个出现。把具体的实现抽象为接口和抽象类,以适应今后的需求变化,是GoF一个非常重要的设计原则,GoF中的许多设计模式都是由此而生的。分析模型和设计模型的界线也许就是分析模型还仅仅只是分析阶段,而设计模型已经进入到了软件开发阶段,但这样的界线是模糊的,并没有一个绝对的时间点。
最后,一个很有意思的问题是,GRASP的作用大还是GoF的作用大?做分析的朋友可能说GRASP的作用大,因为所有问题越是在项目开发的早期解决,越是给项目带来的代价越小;做设计的朋友可能会说GoF的作用大,因为GRASP只是在对象分析的初期运用,而GoF的运用贯穿整个软件设计的始末,作用时间更长。我认为这个问题不好回答,它们各司其职,我们只有配合使用它们才能有效地提高我们的设计水平。
分享到:
相关推荐
GoF设计模式是23种经典的面向对象设计模式的集合,这些模式描述了在特定情境下如何解决常见的设计问题。 1. **结构型模式(Structural Patterns)**: 如适配器模式、桥接模式、装饰器模式、组合模式、外观模式、...
首先,在第1章中介绍了设计模式的基本概念,包括设计模式的定义、作用、GRASP模式和GoF(Gang of Four)设计模式的分类。GRASP模式强调了面向对象设计的原则,如信息专家、创造者、低耦合、高内聚等。而GoF设计模式...
《设计模式学习笔记》主要探讨了GOF的23种设计模式以及类设计的基本原则,旨在帮助开发者理解和应用这些经过时间验证的成熟解决方案。设计模式是面向对象软件设计中的核心概念,它们为解决常见的设计问题提供了标准...
与 GoF 设计模式不同,GRASP 模式更注重于指导我们如何分配类的职责,而不是解决具体的问题。 在实际项目中,GRASP 模式可以帮助我们建立概念模型,并指导我们如何设计类。例如,在建立概念模型时,我们可以使用 ...
设计模式是由Christopher Alexander提出的,它描述了在软件设计中经常遇到的问题和解决这些问题的标准方法。尽管“设计模式”这个词在不同领域都有应用,但在软件行业中,尤其是面向对象设计中,它主要指的是GOF...
在本文中,我们将探讨设计模式的基本概念,特别是GRASP(General Responsibility Assignment Sopftware Patterns)模式和GOF(Gang of Four)设计模式。 1.1 设计模式的定义 设计模式是针对特定类型软件设计问题的...
总之,“软件设计模式”课程是软件工程教育中的一个重要组成部分,它不仅教会学生如何应用各种设计模式和原则来提高软件质量和可维护性,还培养了他们在实际项目中解决复杂问题的能力。通过学习这些模式和原则,学生...
在设计过程中,除了掌握UML图(如用例模型、领域模型、系统序列图等)外,还需要理解和应用设计原则,如GRASP、GoF设计模式以及Responsibility-Driven Design (RDD)。 在进行对象设计时,输入包括但不限于用例模型...
这些设计模式不是可以直接转换为代码的成品设计,而是描述如何在不同情况下解决问题的模板。它们通过引入类和对象之间的关系和交互,指导开发者在实际应用中如何灵活运用。GRASP原则(一般职责分配原则)是对其他...
1.4GoF设计模式的分类 4 1.5模式的学习阶段 6 第2章负责任地设计对象——GRASP 9 2.1InformationExpert(信息专家) 11 2.2Creator(创造者) 13 2.3LowCoupling(低耦合) 14 2.4HighCohesion(高内聚) 15 ...
例如,GRASP(General Responsibility Assignment Software Patterns)原则关注责任分配,强调低耦合和高内聚,而GOF(Gang of Four)设计模式则详细描述了组件及其关系,包括责任、上下文和解决方案。 二、迭代...
区别在于GRASP(一般职责分配软件模式)关注组件的责任分配,强调低耦合高内聚,而GOF(GoF设计模式)更侧重于组件设计和它们之间的协作。GRASP是解释其他设计模式的工具,而GOF提供了具体的设计策略。 三、作图题 ...
在软件工程中,设计模式尤其受到关注,尤其是GOF(GoF)提出的23种经典设计模式,它们为面向对象设计提供了可复用的解决方案,有助于提高软件的灵活性、效率和健壮性。 设计模式是基于类和对象的,因此理解类和对象...
26.2 一些GRASP原则是对其他设计模式的归纳 26.3 设计中发现的“分析”:领域模型 26.4 工厂(Factory) 26.5 单实例类(GoF) 26.6 具有不同接口的外部服务问题的结论 26.7 策略(GoF) 26.8 组合(GoF)和...
GoF(Gang of Four)的23种设计模式是软件设计的经典指南,包括结构型、行为型和创建型三大类。例如,工厂方法模式提供了一种创建对象的抽象方式,让子类决定实例化哪一个类,增强了灵活性;而观察者模式则定义了...
- **OOD模式**:设计模式提供了解决特定问题的通用方案,包括GoF的23种设计模式和GRASP模式。 #### GoF设计模式分类 GoF设计模式按其目的可分为: - **接口型模式**:如适配器模式、门面模式,用于解决接口不兼容...
26.2 一些GRASP原则是对其他设计模式的归纳 26.3 设计中发现的“分析”:领域模型 26.4 工厂(Factory) 26.5 单实例类(GoF) 26.6 具有不同接口的外部服务问题的结论 26.7 策略(GoF) 26.8 组合(GoF)和...
26.2 一些GRASP原则是对其他设计模式的归纳 26.3 设计中发现的“分析”:领域模型 26.4 工厂(Factory) 26.5 单实例类(GoF) 26.6 具有不同接口的外部服务问题的结论 26.7 策略(GoF) 26.8 组合(GoF)和...
26.2 一些GRASP原则是对其他设计模式的归纳 26.3 设计中发现的“分析”:领域模型 26.4 工厂(Factory) 26.5 单实例类(GoF) 26.6 具有不同接口的外部服务问题的结论 26.7 策略(GoF) 26.8 组合(GoF)和...
26.2 一些GRASP原则是对其他设计模式的归纳 26.3 设计中发现的“分析”:领域模型 26.4 工厂(Factory) 26.5 单实例类(GoF) 26.6 具有不同接口的外部服务问题的结论 26.7 策略(GoF) 26.8 组合(GoF)和...