GOF 和 GRASP 设计模式有什么区别

2023-12-25

我真的很困惑 GOF 和 GRASP 模式之间的区别? 甚至两者都有助于改进面向对象的实践


简答:
GoF被提到设计模式. And GRASP are 设计原则。设计原则比设计模式更抽象。

长答案:
软件工程的主要目的是开发合适的软件。SDLC https://en.wikipedia.org/wiki/Systems_development_life_cycle呈现了顶层软件工程的步骤。软件设计 https://en.wikipedia.org/wiki/Software_design是 SLDC 步骤之一。和面向对象的软件设计 https://en.wikiversity.org/wiki/Object_Oriented_Software_Design是一种流行的软件设计方法。

为了进行面向对象的软件设计,有多种不同名称的资源(书籍、教程和论文),例如:指南、原则、启发式、模式、样式等。

The 差异这些名称之间是抽象其中。顶层是主要原则,其他级别是有助于实现这些主要原则的细节。

顶层

在顶层,提供教程主要原则。 (基于面向对象的分析和应用程序设计,Grady Booch 等人,1991 年)
面向对象的主要原则

  • 抽象
  • 封装(信息隐藏)
  • 层次结构(继承、聚合)
  • 模块化(高内聚和松耦合)

后续的所有原则和模式都与这个主要原则相关,并试图支持和改进它们。

第二级

在第二级资源中有原则并尝试支持和改进面向对象的主要原则。

  1. SOLID https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)原则
  2. GRASP https://en.wikipedia.org/wiki/GRASP_(object-oriented_design)原则
  3. 德米特定律 https://en.wikipedia.org/wiki/Law_of_Demeter
  4. 等等(其他单一命名原则,如 LoD)

第三级

这种级别的资源称为设计模式. Gof https://en.wikipedia.org/wiki/Design_Patterns(四人帮)有第一本关于设计模式的书。有 23 种设计模式支持面向对象设计的主要原则和其他原则。

GoF 之后,出现了许多关于在特定编程语言和特定框架中使用设计模式的书籍(例如 J2EE 设计模式、JQuery 设计模式等)

设计模式更加详细并且非常接近编程语言。然而,主要原则(顶层)和原则(第二层)是如此抽象。

第四层

在这个级别,资源称为:启发式.

这个级别的资源比其他组更详细、更具体。

最好的资源是面向对象设计启发法(72 启发式),Arthur J. Riel 所著书籍,1996 年

第五级

在最终级别,有指南.

All Do It, 不要这样做, Avoid,...书籍中的指南可以在这个组中收集。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GOF 和 GRASP 设计模式有什么区别 的相关文章

  • 寻找一种重构 D3.js 风格的方法链接模式的方法

    在学习 D3 js 时 我遇到了博客文章 http bost ocks org mike chart 解释其可重用代码单元背后的主要设计模式 我复制了下面的相关代码 下面呈现的模式的方式正是在 D3 代码库和插件中使用的方式 example
  • 对于 Web 应用程序结构的最佳实践,您有哪些建议? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我在工作中做了很多定制应用程序 我正在尝试为新应用程序定义一些标准 有点像元素 CSS 你如何组织样式表 我是否应该为整个网站提供一个基本样式表
  • 正式协议对象有什么用

    我们可以在源代码中创建协议对象 但是正式的协议对象有什么用呢 Protocol myObj protocol protocolName 您可以使用它来检查对象是否符合协议 anotherObject conformsToProtocol m
  • 为什么要分离接口和实现?

    在生产代码中 我经常看到定义如下的类 public interface SomeComponent Some methods public class SomeComponentImpl implements SomeComponent S
  • 使用“旧”对象引用使用构建器模式创建新对象

    我正在尝试构建器模式 并陷入如何向新创建的对象添加新 属性 的困境 public class MsProjectTaskData private boolean isAlreadyTransfered private String req
  • 横切关注点示例

    什么是一个很好的例子cross cutting concern 医疗记录示例维基百科 http en wikipedia org wiki Cross cutting concern页面对我来说似乎不完整 具体来说 从这个例子来看 为什么日
  • Javascript 沙箱模式示例实现

    在 Stoyan Stefanov 的伟大著作 JavaScript Patterns 的第 101 页中 他解释了沙箱模式 我非常喜欢他的书 但我真的错过了一些现实生活中的例子 然后更好地理解他所谈论的内容 我正在寻找一个现实生活中的工作
  • 使用 Doctrine2 时的多重歧视级别

    我正在使用 Doctrine2 来管理我的模型 如下 有一个抽象概念Content与复合模式Gallery 也是一个抽象概念Media从中Video and Image继承 我的选择是添加鉴别器Content and Media表以便区分G
  • “TryParse / Parse like”模式:实现它的最佳方法是什么

    这个问题是来自的后续问题如何指示方法不成功 https stackoverflow com questions 161822 how to indicate that a method was unsuccessful xxx Tryxxx
  • 与竞争的消费者顺序处理消息

    Problem 我以特定顺序 FIFO 在队列上接收消息 比如订单 我的队列中有竞争的消费者 为了进一步增加复杂性 消费者可能只对订单的特定版本感兴趣 具体取决于其状态 例如版本 1 版本 2 和版本 5 订单版本号在订单上可用 但不能用于
  • 在 C++ 中创建观察者设计模式的好方法

    我正在尝试用 C 实现观察者设计模式 如下所示 include
  • AngularJS 服务并承诺最佳实践

    我有一个 AngularJS 应用程序services 调用 http资源并返回promise我在控制器中解决了这个问题 这是我正在做的事情的示例 app service Blog function http q var deferred
  • 如何简化 ASP.NET MVC 中的全状态交错模式对话框

    我需要在多对多模式对话框中保留状态渐进增强 http en wikipedia org wiki Progressive enhancementASP NET MVC 项目中的方式 在我的代码中 当禁用 javascript 时 模式对话框
  • 单例属性

    好吧 如果我创建一个单例类并通过公共静态属性公开单例对象 我明白了 但我的单例类还有其他属性 这些应该是静态的吗 这些也应该是私人的吗 我只想通过执行以下操作来访问单例类的所有属性 MySingletonClass SingletonPro
  • 使用接口或函数对象进行回调? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在面向对象中 通常使用接口来实现回调 粗略示例 class Message class IMsgProcessor public virtual
  • MonoState、Singleton 或派生形式:CRUD 应用程序的最佳方法?

    我有一个相当大的 CRUD WinForm 应用程序 其中有许多对象 人员 注册 计划 案例注释等 该应用程序由 30 多种表单组成 UI 逻辑上被分解 会员 注册 计划 案例说明等 我正在尝试弄清楚如何创建我的人物对象搜索后搜索表格并将对
  • 为什么抽象类应该实现抽象基类的抽象方法?

    在下面的示例中 该类Derived实现抽象方法method从课堂上Main 但我想不出在抽象中填写方法体的理由Derived类的实现 当然 我应该只在实际类中实现抽象方法 那么我怎样才能避免这样做呢 我还可以做些什么 abstract cl
  • python 中的代表

    我实现了这个简短的示例来尝试演示一个简单的委托模式 我的问题是 这看起来我已经理解了委托吗 class Handler def init self parent None self parent parent def Handle self
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • Ruby 中实现的所有设计模式的备忘单?

    我想知道是否有针对 Ruby 中实现的所有设计模式的备忘单 这样您就不必重新发明轮子 设计模式对于组织大量代码非常有用 因为您不需要像在 verbose algol derivitive language 中那样编写那么多代码来在 ruby

随机推荐

  • 在 contentEditable

    我正在寻找一个明确的跨浏览器解决方案 当 contentEditable on 重新获得焦点时 将光标 插入符号位置设置为最后一个已知位置 内容可编辑 div 的默认功能似乎是每次单击时将插入符号 光标移动到 div 中文本的开头 这是不可
  • Sparklyr:validate_java_version_line(主版本)中的错误

    R version 3 5 2 2018 12 20 Eggshell Igloo Copyright C 2018 The R Foundation for Statistical Computing Platform x86 64 ap
  • 从 Android 中的原始文件夹设置铃声

    我正在尝试读取 访问 Raw 文件夹中的 mp3 文件 然后将其设置为默认铃声 但它无法找到它 我的代码是 Uri path Uri parse android resource com applenty LearnToCount raw
  • SwiftUI CoreData 异步获取

    我在 macOS 应用程序中使用 CoreData 和 SwiftUI 我主要利用的是 FetchRequest在 SwiftUI 中 向数据库发出我的请求 我注意到当数据库中有多个对象时 FetchRequest 需要更多时间 此外 我正
  • 从 Image.open 获得的数组,其中 np.asarray 是不可变的 - “赋值目标是只读的”

    我的目标是读取一组 PNG 文件 使用以下命令创建图像Image open filename 并将它们转换为只有 1 和 0 的简单二维数组 PNG 的格式为 RGBA 值大多只有 255 和 0 在图像中 边缘通常是灰度值 我想在二维数组
  • 事件处理程序中的图像调整器 User.Identity

    添加了一个 AuthorizeImage 事件处理程序来限制图像访问 当我尝试检查用户名和身份验证状态时注意到以下内容 下面不会导致异常 但似乎会破坏它 无论是否通过身份验证 都会显示未找到图像的默认图标 测试了 this User 相同的
  • ODP.NET是否需要安装Oracle客户端

    我必须从 NET 代码连接 Oracle 11g DB 为此 我安装了 ODP NET 但在阅读了一些论坛帖子后 我意识到我也需要安装 Oracle 客户端 真的吗 我看到 Oracle 客户端的大小为 ca 2GB 我真的需要安装这么大的
  • ConcurrentMap.remove() 是否在 get() 返回 null 之前提供happens-before 边?

    调用之前线程中是否有操作ConcurrentMap remove 保证发生在之前看到从另一个线程删除后的操作 文档 https docs oracle com javase 8 docs api java util concurrent p
  • 谷歌地图API只返回城市?

    我正在尝试使用 Google 地图 API 仅从 json 请求返回城市 https maps googleapis com maps api place autocomplete json input green 20lanes type
  • Spyder - UMD 已删除:模块

    我已经用 python 闲逛了大约一个月了 有些事情困扰着我 我使用 python x y 工具包 它附带了简洁的 Spyder IDE 我的问题涉及 Spyder 的 UMD 用户模块删除器 I found this http mcsp
  • ZonedDateTime.parse 不适用于解析 am 或 pm 时间

    我正在学习java 试图构建一个工具 根据用户输入 时间 时区A和时区B的输入 将特定时间从时区A转换为时区B 这是关于该工具以特定格式收集时间并将其转换为 ZonedDateTime 对象的部分 import java time Zone
  • 仅当总计数小于阈值时才将行插入 SQL Server 表中

    我正在使用 SQL Server 2012 我有一个存储用户的表 允许的最大用户数为 100 万 我有一个正在注册用户的存储过程 当我插入时 我想确保 users 表中的总行数不会超过 100 万 我更愿意使用允许最大并发性的方法 我相信我
  • 创建适用于 Windows 的用户和访问规则 Github

    我刚刚使用安装了 Githttp windows github com http windows github com 它似乎安装正确 但我无法创建新用户和访问控制设置来访问存储库 我试图查看文档 但不包含类似的内容 我不确定 Window
  • 在 EJS 中循环 JSON

    我在下面的 EJS 中有代码 tr td td tr 行的输出是正确的 是一个由 3 个对象组成的数组 每个对象都有属性 id 名称等 我可以操作该行来填充 JS 中的表 但是 我想知道是否有办法可以按照上述方式完成它 当我运行上面的代码时
  • 以编程方式停止并重新启动 Express 服务器(以更改端口)

    我希望能够基本上更改我的 Express 应用程序正在运行的端口 我试过了 server on close function server listen 3000 server listen 8080 server close 这会返回一个
  • 当推送到github时,为什么git不要求我输入用户名和密码?

    这可能是个愚蠢的问题 但我通过搜索找不到任何关于此的信息 也许 这是一个愚蠢的问题 我已将我的代码存储在 github 中 2小时前 我想更新存储库中的代码 但我的本地没有该代码 所以我克隆了它 修改了代码 然后推送了它 这时候git提示我
  • 如何以编程方式设置 ASP.NET ReportViewer 控件的数据源?

    如何以编程方式设置 ASP NET ReportViewer 控件的数据源 我有一个 VS 2008 ReportViewer 控件 想要在几个不同的报告之间切换 我可以通过设置报表源和刷新控件来切换报表 但我看不到在哪里设置数据源 每个报
  • 如何在 Android 布局中创建覆盖按钮

    我想创建一个将在两个布局之间叠加的按钮 我正在使用线性布局并为其添加适当的权重 附上屏幕截图以供参考 这是我的 XML 标签 xml
  • ZeroMQ 中的 N 到 N 异步模式?

    尽管我阅读了该指南 但我找不到执行以下操作的方法 我们有n个出版商 我们有 m 个订户 每个订阅者订阅某种类型的消息 一个发布者可以发送多种消息 多个发布者可以发出相同类型的消息 如何在 0MQ 中创建 N 到 N 或 N 到 1 到 N
  • GOF 和 GRASP 设计模式有什么区别

    我真的很困惑 GOF 和 GRASP 模式之间的区别 甚至两者都有助于改进面向对象的实践 简答 GoF被提到设计模式 And GRASP are 设计原则 设计原则比设计模式更抽象 长答案 软件工程的主要目的是开发合适的软件 SDLC ht