GRASP原则

GRASP是通用职责分配软件模式(General Responsibility Assignment Software Patterns)的缩写。主要包括9个模式,这些模式是设计OO系统的基础。这9个模式如下:

创建者(Creator)
信息专家(Information Expert)
低耦合(Low coupling)
控制器(Controller)
高内聚(High Cohesion)
多态性(Polymorphism)
纯虚构(Pure Fabrication)
间接性(Indirection)
防止变异(Protected Variations)**

创建者
对象的创建是面向对象系统中常见的活动之一。因此需要确认哪一个类别有职责创建对象。
相关模式或原则:低耦合性、工厂方法

信息专家
信息专家(Information expert)是决定如何分配职责(给方法、字段等)的原则。
应用信息专家的原则,常见指定职责的作法是针对特定的职责,确认要实现此职责要有什么信息,以及信息存在的对象。
这会将职责分配到有最多和职责有关信息的对象。

低耦合
耦合性是评估一组件链接另一组件,知道另一组件,或是依赖另一组件的程度。松耦合是为了以下的优点,指派职责的评估模式:
类别之间的相依性低
一个类别的修改对另一个类别的影响较小
复用潜力较高

控制器
控制器(controller)模式会将处理系统对象的职责指定给表现整个系统或是用例场景的非用户界面类别。控制器对象是非用户界面,负责接收或处理系统事件的对象.
控制器定义为在用户界面之后,接收及处理系统动作的第一个对象。控制器需将需其他对象来完成的工作给对应对象。控制器协调或是控制相关活动。在信息系统逻辑架构的面向对象系统中,若应用程序在应用层/服务层和业务逻辑之间有明确的分隔,GRASP控制器可以视为是应用层或是服务层的一部分。
相关模式或原则:命令模式、外观模式、层、纯虚构。

高内聚(high cohesion)
是设法让对象适当的具焦、可管理以及可理解的评估模式。高内聚性常常会用来支持低耦合性。高内聚性是指特定组件的多个职责是彼此紧密有关,高度具焦的。将程序分解为类别和子系统是增加系统内聚性的一种方式。相对的,低内聚性是指特定组件有太多不相关的职责。低内聚性的组件常会难以理解、复用、维护及改变。

多态
依照多态(polymorphism)的原则,依类型变更行为的职责是在出现变更的类型上。这可以用多态运算符实现。这类类型的用户需要用多态运算符。

纯虚构
纯虚构(pure fabrication)是指没有实现问题领域概念的类别,特别是为了实现派生类低耦合性、高内聚性、高复用的潜力(若是用信息专家的解决方案,无法达到此一效果)。这类类别在领域驱动设计中会称为服务。

间接性
间接性(indirection)模式支持低耦合性,在二个对象之间将其职责指定到中介的对象,因此可以复用。其中一个例子是在模型—视图控制模式中,在资料(模型)和其实现(视图)之间导入控制器组件。这可以确保二个组件之间的低耦合性。

防止变异
防止变异(protected variations)模式保护组件,不受其他组件(对象、系统、子系统)变化的影响,作法是将具焦在不稳定部分的程序包裹在接口内,利用多态来产生此一接口的不同实现。

设计模式是怎样解决设计问题的?

1.寻找合适的对象
面向对象的程序设计由对象组成,对象Object包括数据和对数据进行操作的过程,这些个过程也常常称为方法Method。对象在收到客户的请求(或消息)后,执行相应的动作。 客户请求是使得对象执行操作的唯一途径,方法又是改变内部数据的唯一途径。由于这些限制,对象的内部状态是被封装的,对于外部对象是不可见的。面向对象设计最困难的部分是将系统分解成对象集合。因为要考虑许多因素:封装、粒度、依赖关系、灵活性、性能、演化、复用等,它们都影响着系统的分解,并且这些因素通常还是互相冲突的。 你可以写出一个问题的描述,挑出名词和动词,进而创建相应的类和方法;或者关注系统的协作和职责关系;还可以对现实世界建模,再将分析时发现的对象转化至设计中。设计模式帮你确定并不明显的抽象和描述这些抽象的对象。例如,描述算法的对象在现实中并不存在,但他们却是设计的关键部分。Strategy模式描述了怎样实现可互换的算法族。State模式将实体的每一个状态描述为一个对象。这些对象在分析阶段,甚至在设计阶段的早期并不存在,后来为了设计的灵活性,复用性才将它们发掘出来。

2.决定对象的粒度
对象在大小和数目上变化极大。它们能表示下自硬件或上自整个应用的任何事物。那么怎样决定一个对象应该是什么呢?设计模式很好地讲述了这个问题。Facade模式描述了怎样用对象表示完整的子系统,Flyweight模式描述了如何支持大量的最小粒度的对象。其他一些设计模式描述了将一个对象分解成许多小对象的特定方法。Abstract Factory和Builder模式产生那些负责生成其他对象的对象。Visitor和command模式生成的对象专门负责实现对其他对象或对象组的请求。

3.指定对象接口
对象声明的每个操作指定操作名、作为参数的对象和返回值,这就是操作的型构Signature。所有方法的集合构成了该类或对象的接口。类型是用来标识特定接口的一个名字。如果一个对象接受“Window”接口定义的所有操作请求,那么可以说该对象具有“Window”类型。一个对象可以有许多类型,并且不同的对象可以共享同一个类型。接口可以包含其他接口作为子集。当一个类型的接口包含另一个类型的接口时,我们可以说它是另一个类型的子类型SubType,另一个类型称之为它的超类型superType。我们常说子类型继承了它的超类型接口。在面向对象系统中,接口是基本的组成部分。对象只有通过他们的接口才能与外部交流,如果不通过对象的接口就无法知道对象的任何事情,也无法请求对象做任何事情。对象接口与其功能实现是分离的,不同对象可以对请求做不同的实现,也就是说,两个有相同接口的对象可以有完全不同的实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值