GRASP设计原则(职责分配原则)

GRASP(General responsibility assignment software Principle)设计原则是设计模式的基础,在GOF的23中设计模式中处处可以体现其中的一个或多个设计原则,所以在掌握设计模式之前需要对GRASP原则有一定的了解,本节我在这里总结一下grasp原则。

本文共分为以下几个内容:

  • GRASP的九个原则
  • GRASP原则详解
  • GRASP原则在23中设计模式中的体现

GRASP的九个原则

  • 信息专家原则(information)
  • 创造者原则(creator)
  • 低耦合原则(low coupling)
  • 高内聚原则(high cohesion)
  • 控制器原则(controller)
  • 多态原则(polymorphism)
  • 纯虚构(pure Fabrication)
  • 中介原则(indirect)
  • 受保护变量原则(protected Variations)

Grasp原则详解

信息专家原则(information expert)

信息专家模式的本质指的是我们应该将职责委托给哪一个对象,这个职责可以是一个方法,也可以是一个算法或者其他内容。它是面向过程设计过程中最基本的原则。

委托原则:我们在设计对象的时候,如果某个对象拥有完成某个职责所需要的所有信息,那么这个职责就分配给这个对象实现。这个时候,这个类就是相对于这个职责的信息专家。

示例:我们在设计购物网站的时候,为避免重复,一种商品只能在购物车中出现一次,如果多次出现,则需要将其数量增加。这个时候我们在将物品放入购物车的时候,要首先判断当前物品是否在购物车中,判断两个物品是否为同一个物品的方法这个职责应该委托给谁呢?显而易见,商品类中有唯一标识,所以这个职责由商品类实现,而不是购物车。

创造者原则(creator)

creator原则的本质是创建类对象职责应该委托给那个对象,也就是谁应该负责产生某个类的实例。

解决方案: 如果符合下面的一个或者多个条件,则可以将创建A的实例的职责分配给B;

  • B包含A
  • B聚合A
  • B拥有初始化A的数据并在创建A的实例时将数据传递给A
  • B记录A的实例
  • B频发使用A

满足上述一种或者多种情况的时候,我们应该奖创建A的实例的职责分配给B。

合理的creator原则带来的优点:如果职责分配合理,设计就能降低耦合,提高设计的清晰度,封装性和重用性。

示例:例如订单和商品的关系是聚合关系,这个时候我们将在订单中创建商品。

低耦合(Low coupling)

耦合是评价一个系统中各个元素之间连接或者依赖关系强弱的尺度。低耦合的原则是我们在设计系统的时候尽量降低系统中各个元素之间的耦合度,这样对于系统的理解和维护都有很大的益处。

耦合性高的系统会带来的坏处:

  • 一个类的修改导致其他类产生较大的影响;
  • 系统难以维护和理解;
  • 系统的重用性差,在重用一个高耦合类的时候,不得不重用它所依赖的所有类。

两个类具有以下特性中的其中一个,我们就说这两个类是耦合的:

  • A具有一个类型为B的属性;
  • A调用B的方法
  • A的方法包含对B的引用(参数或者返回值的方式)
  • A是B的直接或者间接的子类
  • A是接口B的一种实现

低耦合系统的设计方法

  • 在类的划分上,尽量创建松耦合的类,类之间的耦合性越低,越有利于复用,修改一个类不会影响其他类。
  • 在类的设计上,尽量降低类中成员和方法的访问权限。
  • 在类的设计上,尽量将类设计为不变类
  • 在类的引用上,将一个对象对另一个对象的引用降低到最小

高内聚(high cohesion)

内聚是评价一个对象的职责被关联的尺度或者强弱,也可以说是功能性内聚的职责。也就是功能性紧密的相关职责应该放在同一个类中,并共同完成有限的功能。这样做更加有利于对类的理解和重用,也可以降低类的维护成本。

往往低内聚的系统设计会导致类的混乱,当对功能进行扩展或者改进的时候带来不必要的麻烦,低内聚的类也不利于重用,因为他们的职责如此之混乱。

为了达到高内聚,我们需要对类的职责进行分解,使分解出来的类具有独立的职责,满足单一职责原则。将一些需要在多个类中使用到的方法封装到一个类中,其他的类只负责他们需要负责的相关功能,这样我们可以提高类的内聚程度。

控制器原则(controller)

控制器模式的实质是将一些系统事件的接受和处理委托给一个的对象controller,这个对象可以是一个类,系统或者子系统,它不与UI进行交互,它只负责系统信息的接收和处理。

一般情况下,控制器是一个系统,这个系统中包括多个处理器,分别对应处理不同的事务。通常情况下,一个控制器应当把要完成的功能委托给其他对象,而它只负责任务的协调控制和分配。

控制器原则与MVC模式相对应,MVC模式是一种比设计模式更高的架构模式。

多态原则(polymorphism)

多态原则与面向对象设计原则中的多态概念类似,这里不再详细赘述。

纯虚构(pure Fabrication)

纯虚构原则与我们所说的纯虚函数类似。

  纯虚构的作用是用来解决高内聚和低耦合之间的矛盾的。高内聚低耦合是我们系统设计的终极目标,高内聚意味着我们要将类拆分成多个功能集中的类,但是拆分的多个类之间需要进行协作才能正常工作,这样又增加了类之间的耦合性。

  纯虚构原则是用来解决上述问题的方案。它要求将一部分类的职责转移到纯虚构类中,在理想的情况下,分配给这种虚构类的职责是为了达到高内聚低耦合的效果。在实际的操作过程中,纯虚构类的实现又很多种方式,例如将数据库中操作的方法从数据库实体中分离出来,形成专门的数据访问类;通过对类的分解来实现类的重用,新增加的数据访问类对应于数据的持久化存储,这是软件开发过程中为了方便虚构出来的一个概念。一般情况下,纯虚构模式通常基于功能进行划分的。

中介模式(indirect)

中介模式的目的是为了避免两个对象之间产生直接耦合,降低对象之间的耦合度。

解决方案是建立中间对象来协调两个对象之间的交互,避免耦合性过高。

受保护模式(protected variations)

受保护模式的实质与OCP(开放闭合原则)类似,我们首先找到系统中不稳定的变化点,使用统一的接口封装起来,如果未来发生变化的时候,可以通过扩展接口来扩展新的功能,而不需要改变旧的代码。这样达到易于扩展的目的。

文章转载自:https://langzi989.github.io/2017/01/08/GRASP%E8%AE%BE%E8%AE%A1%E5%8E%9F%E5%88%99%EF%BC%88%E8%81%8C%E8%B4%A3%E5%88%86%E9%85%8D%E5%8E%9F%E5%88%99%EF%BC%89/

GRASP设计原则(职责分配原则)相关推荐

  1. GRASP软件职责分配原则

    http://tommwq.tech/blog/2020/11/05/189 GRASP是General Responsibility Assignment Software Pattern的缩写,是 ...

  2. GRASP----(职责分配原则)

    要学习设计模式,有些基础知识是我们必须要先知道的,设计模式是关于类和对象的一种高效.灵活的使用方式,也就是说,必须先有类和对象,才能有设计模式的用武之地,否则一切都是空谈,那么类和对象是从那冒出来的呢 ...

  3. 【愚公系列】2021年12月 通用职责分配原则(七)-纯虚构原则(Pure Fabrication Principle)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.纯虚构原则(Pure Fabrication Principle) 二.使用步骤 示例 前言 GRASP:Gene ...

  4. [软件工程-设计模式] GRASP软件设计的模式和原则

    GRASP 模式 前言 1. 信息专家 (Information Expert) 2. 创造者(Creator) 3. Low coupling (低耦合) 4. High cohesion (高内聚 ...

  5. 【编程素质】设计模式原则(SOLID原则)

    设计模式的使用并不一定会提升效率,我们需要根据实际情况来判断是否需要使用设计模式.在很多时候,只要遵循这些OO原则来写代码,也相当于使用了设计模式.毕竟设计模式就是根据这些OO原则形成的一套规范. 1 ...

  6. 通用职责分配软件原则之7-纯虚构原则

    纯虚构原则(Pure Fabrication Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/381 ...

  7. 通用职责分配软件原则之6-多态原则

    多态原则(Polymorphism Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/379 访问. ...

  8. 通用职责分配软件原则之5-控制器原则

    控制器原则(Controller Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/377 访问. ( ...

  9. 通用职责分配软件原则之4-高内聚原则

    高内聚原则(High Cohesion Principle) 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/375 访问 ...

最新文章

  1. java取路径含中文_java获取项目路径中文乱码
  2. C语言,谁都能看得懂的归并排序
  3. 数据结构-队列2-链式存储
  4. 数组深拷贝_JavaScript之深浅拷贝
  5. 李萍matlab实验报告,李萍, 张磊, 王垚廷. 基于Matlab的偏微分方程数值计算[J]. 齐鲁工业大学学报, 2017, 31(4): 39-43....
  6. 代码不是重点, 领悟OO思想(一)
  7. 军营中重重打击之后,我变了一个人(中)--我成为程序员所经历的(四)
  8. golang在windows下编译Linux下的文件
  9. Spring Security(二) UserDetailsService 和 PasswordEncoder 密码解析器 详解
  10. Dev-Cpp_6.0下载
  11. 服务器分辨率无法修改器,win10解决分辨率无法修改的方法攻略
  12. css_解决浏览器显示盒子的实际像素和你设置的像素不一致的问题;
  13. Android 编译错误:CreateProcess error=206, 文件名或扩展名太长。
  14. 基于ABP实现DDD
  15. 图解next和hasnext
  16. linux系统路由器地址查询,如何在任何平台上查找路由器的IP地址
  17. Python初级试题25道(含答案)
  18. 计算机里看不到移动硬盘,我的电脑里看不到移动硬盘怎么处理呢?
  19. 第十讲:如何去改变 第十一讲:改变——养成良好习惯 第十二讲:改变设定目标
  20. 线段树简单入门 (含普通线段树, zkw线段树, 主席树)

热门文章

  1. DBA_Oracle性能优化的基本方法概述(方法论)
  2. Apache配置问题
  3. 【语法】iOS(一)ObjectC的语法
  4. Struts2之ajax初析
  5. C 语言的32 个关键字意义
  6. 《Ray Tracing in One Weekend》——Chapter 5: Surface normals and multiple objects
  7. 问题三十七:C++怎么解一元四次方程?(3)——怎么解一元四次方程
  8. php 百科源码,php源码是什么意思
  9. html自动获取今日的周名称,jquery怎么写显示今天后2周的日历
  10. TypeScript笔记(4)—— TypeScript中的类型注解