GRASP原则(General Responsibility Assignment Software Patterns)基于职责分配的的面向对象设计原则,它是面向对象设计的基本原则。

主要包括9个原则,总结一下:

1.创建者。谁负责创建类?在Java和C++中对应调用new或者对象构造函数。这个还比较容易理解,谁负责创建,则可以考虑将被创建者组合为创建者的一个属性(属性可见),或者创建者的某个函数中创建被创建者(局部可见)。

2.专家模式。谁应该对某个行为或者认知负责?谁拥有实现该行为所需要的必须信息,就讲该职责让谁负责。对应到代码中通常表现为某个行为方法需要定义在哪个类中。对于需要在类与类之间发送消息的方法,需要在发送方保留被发送方的指针或者引用。(对象可见性)

3.控制器。UI层和领域模型之间的模式应用。主要是为了保持UI层和业务逻辑层不相互污染。通常对应的创建一个代表系统的类或者一个虚构类用于UI层和领域层的消息交互。

4.高内聚。尽量保持类能够只有单一的事情,只做自己份内的事,不包含过多的职责。表现为对象中的方法只是自己必须完成的工作,对于一些其他不太相关的工作可以委派给其它类,转而建立之间的关联即可。

5.低耦合。一个类尽可能少的和多个类发生关系,尽量少的依赖于其他类。表现在代码上为一个类较少的存在其他类的指针和引用。

6.多态。即多个类有一些共同的形态。在代码上表现为替换switch case之类的操作,建立多态关系,通常以抽象超类和接口的形式呈现,子类进行继承。

7.纯虚构。有时候在类与类之间通过构建一个实际并不存在的类用于信息的传递和交换以保持高内聚和低耦合的特点。

8.间接性。保持类和类之间的间接关系,减少直接关系,如适配器等。纯虚构就是因为间接性而产生的。

9.防止变异。不和陌生人说话。只向自己熟悉的对象发送消息,熟悉的对象包括this对象,方法的参数,this属性,this属性中的集合元素,在类方法中创建的对象。

UML中GRASP面向对象设计原则相关推荐

  1. uml图中的各种箭头_设计模式学习笔记(二):UML与面向对象设计原则

    1 UML 1.1 UML UML(Unified Modeling Language)是统一建模语言,1997年11月UML1.1版本提交给OMG并正式通过,成为建模语言的个那个也标准.2003年6 ...

  2. 代码质量评判标准、设计模式、面向对象设计原则速查表

    文章目录 代码质量评判标准 软件腐化的原因 提高系统可复用性的几点原则 可维护性与可复用性并不完全一致 面向对象设计原则 1. 面向对象设计的六大设计原则表 2. 图解面向对象涉及的六大原则 1. 开 ...

  3. 设计模式01 UML图,软件设计原则,创建型模式

    概述 "设计模式"最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1995年,由 Erich Gamma.Richard Helm.Ralph Johnson 和 Joh ...

  4. UML图和软件设计原则

    笔记来源于黑马程序员但不仅仅是黑马 UML图和软件设计原则 UML图 2.1 类图概述 2.2 类图的作用 2.3 类图表示法 2.3.1 类的表示方式 2.3.2 类与类之间关系的表示方式 2.3. ...

  5. 【设计模式学习01】设计模式概述,UML图,软件设计原则

    文章目录 1. 设计模式概述 1.1 软件设计模式的产生背景 1.2 软件设计模式的概念 1.3 学习设计模式的必要性 1.4 设计模式分类 2. UML图 2.1 类图概述 2.2 类图的作用 2. ...

  6. 7.12 其他面向对象设计原则3: 依赖倒置原则DIP

    其他面向对象设计原则3: 依赖倒置原则DIP  The Dependency Inversion Principle 7.1 依赖倒置原则DIP The Dependency Inversion P ...

  7. 技术图文:01 面向对象设计原则

    01 面向对象设计原则 知识结构: 一碟开胃的小菜 小菜今年计算机专业大四了,学了不少软件开发方面的东西,也学着编了些小程序,踌躇满志,一心要找一个好单位.当投递了无数简历后,终于收到了一个单位的面试 ...

  8. 02面向对象设计原则

    技术交流QQ群:1027579432,欢迎你的加入! 1.为什么需要面向对象设计 变化是复用的天敌!面向对象设计最大的优势在于抵御变化! 2.重新认识面向对象 理解隔离变化 从宏观层面上来看,面向对象 ...

  9. 程序员必备的七大面向对象设计原则(三)

    五.接口隔离原则 1. 定义 i.  客户端不应该依赖那些它不需要的接口. ii.  一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可. 2.分析 i. ...

最新文章

  1. python在日常工作处理中的应用-Python全栈开发在实际工作中的应用
  2. 算法导论chapter6 堆排序的代码
  3. 零基础入门人工智能有门槛吗?学会这些就够了
  4. 39. Combination Sum
  5. 腾讯云+FFmpeg打造一条完备高效的视频产品链
  6. python random函数_详细代码实战讲解:如何用 Python让自己变成天选之子
  7. 【OpenCV】OpenCV函数精讲之 -- 颜色空间缩减及LUT函数
  8. 验证采集[Python]代理抓取并验证-多线程
  9. 惠普m154a硒鼓芯片清零_打印机硒鼓芯片清零 请问一下硒鼓芯片清零是什么意思...
  10. 解读《百度网页质量白皮书》潜台词
  11. 为了完成月入 3W 的目标,我都做了哪些准备?
  12. Panda_Cloud_v1.2 源代码开源
  13. java学生奖学金管理系统_java毕业设计_springboot框架的高校学生奖学金评定系统...
  14. crypto-js 加密解密 (TS版本)
  15. Driver error 11
  16. java二维码生成工具,可直接用于生产
  17. 计算机网络(3)——三种常见的数据交换技术
  18. CSS3基础(4)——CSS3 渲染属性
  19. 微信小程序做图片压缩
  20. Packet Tracer 思科模拟器入门教程 之十三 路由器OSPF动态路由配置

热门文章

  1. uni-app 17朋友圈开发
  2. 简记_静电放电抗扰度——ESD
  3. 抽奖活动mysql表设计_中奖数据表设计方案
  4. Visual Studio 2019 许可证过期解决办法
  5. Ubuntu 用虚拟机安装(图文)
  6. 1.C语言基础-给字符数组赋值
  7. vue2.x 预览图片组件
  8. 2019年社交电商新零售,如何去开启你的新事业!
  9. 深度学习笔记其六:现代卷积神经网络和PYTORCH
  10. 《炉石传说》游戏架构设计分析:卡牌技能数据