全面讲解GRASP原则

学习目标:

  • 掌握GRASP

学习内容:

GRASP(General Responsibility Assignment Software Patterns,通用责任分配软件模式)原则是一组设计原则和模式,旨在帮助软件设计人员合理地分配类和对象的责任。GRASP原则由Craig Larman在其著作《Applying UML and Patterns》中提出,主要包括以下九个模式:

  1. 信息专家(Information Expert):
    定义:将某个职责赋予拥有所需信息的类。
    目的:通过将职责分配给拥有所需数据的类来减少耦合和提高内聚性。
    示例:订单类应计算订单总价,因为订单类拥有订单项的信息。
  2. 创建者(Creator):
    定义:将创建某个对象的职责赋予与该对象存在某种关系的类。
    目的:确保对象在合理的地方被创建,减少系统中的不一致性。
    示例:订单类可以创建订单项,因为订单包含订单项。
  3. 控制器(Controller):
    定义:将处理系统事件的职责赋予表示用例场景的类或表示系统中协调者的类。
    目的:将系统事件的处理集中在一个或少数几个类中,从而简化系统结构。
    示例:在一个在线购物系统中,购物车控制器负责处理添加商品到购物车的事件。
  4. 低耦合(Low Coupling):
    定义:尽量减少类与类之间的依赖关系。
    目的:提高系统的可维护性和可扩展性。
    示例:通过接口而不是具体实现来进行依赖,降低耦合度。
  5. 高内聚(High Cohesion):
    定义:尽量将相关的职责分配给同一个类,使类的职责更加单一和明确。
    目的:提高类的可理解性和可复用性,减少类的复杂度。
    示例:将用户界面逻辑和业务逻辑分开,分别放在不同的类中。
  6. 多态(Polymorphism):
    定义:通过接口或抽象基类来定义通用行为,让子类实现具体行为。
    目的:提高系统的灵活性和可扩展性,便于系统的扩展和维护。
    示例:使用抽象的支付类来定义支付方法,由具体的信用卡支付类和支付宝支付类实现。
  7. 纯虚构模式(Pure Fabrication):
    定义:创建一个不基于问题域的类来实现高内聚、低耦合的设计。
    目的:解决由于直接分配职责而导致的内聚性和耦合性问题。
    示例:创建一个数据访问对象(DAO)类来处理数据库操作,从而避免将数据库操作分配给业务类。
  8. 间接性(Indirection):
    定义:通过引入中间类或接口来分离对象间的直接依赖关系。
    目的:降低耦合性,提高系统的灵活性和可维护性。
    示例:使用服务层来隔离业务逻辑和数据访问层。
  9. 防止变异(Protected Variations):
    定义:通过封装和抽象来隔离容易变化的部分,防止变化影响其他部分。
    目的:提高系统的稳定性和可维护性。
    示例:使用策略模式来隔离不同的算法实现,使得算法的变化不会影响调用它们的代码。

GRASP原则通过提供一套系统化的设计指导,帮助开发人员在软件设计过程中做出合理的决策,创建高内聚、低耦合的系统,提高软件的可维护性、可扩展性和灵活性。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/38023.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昇思25天学习打卡营第九天|使用静态图加速

背景 提供免费算力支持,有交流群有值班教师答疑的华为昇思训练营进入第九天了。 今天是第九天,前八天的学习内容可以看链接 昇思25天学习打卡营第一天|快速入门 昇思25天学习打卡营第二天|张量 Tensor 昇思25天学习打卡营第三天|数据集Dataset 昇思25天…

高效的向量搜索算法——分层可导航小世界图(HNSW)

最近在接触大模型相关内容,发现一种高效的向量搜索算法HNSW,这里做一下记录。 在之前自己也接触过一段时间的复杂网络(网络科学),没想到,将网络科学的思想引入到向量搜索算法中,可以产生令人眼前…

如何实现公网环境远程连接本地局域网宝塔FTP服务远程管理文件

文章目录 前言1. Linux安装Cpolar2. 创建FTP公网地址3. 宝塔FTP服务设置4. FTP服务远程连接小结 5. 固定FTP公网地址6. 固定FTP地址连接 💡推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。…

Python28-5 k-means算法

k-means 算法介绍 k-means 算法是一种经典的聚类算法,其目的是将数据集分成 ( k ) 个不同的簇,每个簇内的数据点尽可能接近。算法的基本思想是通过反复迭代优化簇中心的位置,使得每个簇内的点与簇中心的距离之和最小。k-means 算法的具体步骤…

S7-1500轴工艺对象105报文安装(硬件目录的支持包 HSP)

S7-1500PLC里硬件组态没法组态到105报文是因为对应的HSP文件没有安装,首先需要安装对应的HSP文件。 1、HSP文件安装 V19版本的HSP安装链接如下 https://download.csdn.net/download/m0_46143730/89503735 2、安装HSP文件 3、需要将博途软件关闭才能完成安装 4、拖…

猫头虎博主全栈前沿AI技术领域矩阵社群

猫头虎博主全栈前沿AI技术领域矩阵社群 👋大家好,我是猫头虎!今天我要向大家介绍一个非常重要的社群矩阵——专为全栈前沿AI技术领域的朋友们打造的各种技术交流和资源互助的社群。这些社群不仅能帮助大家快速提升技术水平,还能拓…

Java中的行为驱动开发(BDD)实践

Java中的行为驱动开发(BDD)实践 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Java中的行为驱动开发(BD…

【MySQL备份】Percona XtraBackup全量备份实战篇

目录 1. 前言 2.准备工作 2.1.环境信息 2.2.创建备份目录 2.3.配置/etc/my.cnf文件 2.4.授予root用户BACKUP_ADMIN权限 3.全量备份 4.准备备份 5.数据恢复 6.总结 "实战演练:利用Percona XtraBackup执行MySQL全量备份操作详解" 1. 前言 本文…

《廖雪峰Java教程》——面向对象基础(1)

参考资料: 面向对象基础 - 廖雪峰的官方网站 (liaoxuefeng.com) 方法 Java 的方法允许定义可变参数: class Group {private String[] names;public void setNames(String... names) {this.names names;} }用可变参数代替数组类型的好处有&#xff1…

Java服务器代码远程调试(IDEA版)

Java服务器代码远程调试 配置启动脚本参数配置IDEA远程调试工具操作步骤 注意:远程调试的代码需要与本地代码一致,远程调试目的是解决本地环境无法支持调试的情况下,解决线上(测试)环境调试问题。 配置启动脚本参数 n…

如何压缩视频大小,怎么压缩视频

在数字化浪潮中,视频已成为我们生活和工作的重要部分。但视频往往伴随着大文件体积,这给存储和分享带来了不少困扰。本文将为您揭秘好用的压缩视频的方法,帮助您轻松减小视频文件大小,提高分享效率! 方法,使…

C++——模拟战争游戏

以下是一个使用C编写的简单模拟战争游戏的示例代码&#xff1a; #include <iostream> #include <vector> #include <random>// 声明一个简单的战士类 class Warrior { public:Warrior(int attackPower) : m_attackPower(attackPower) {}int getAttackPower(…

spring boot 整合 sentinel

注意版本问题 我这是jdk11 、spring boot 2.7.15 、 alibaba-sentinel 2.1.2.RELEASE <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.15</version><…

[图解]SysML和EA建模住宅安全系统-05-参数图

1 00:00:01,140 --> 00:00:03,060 这是实数没错&#xff0c;这是分钟 2 00:00:03,750 --> 00:00:07,490 但是你在这里选&#xff0c;选不了的 3 00:00:07,500 --> 00:00:09,930 因为它这里不能够有那个 4 00:00:11,990 --> 00:00:13,850 但是我们前面这里 5 00…

vue长列表,虚拟滚动

1.新建子组件&#xff0c;将数据传递过去(几万条数据的数组&#xff0c;一次性展示多少条&#xff0c;每条数据的行高). <template><div class"vitualScroll"><sub-scroll :dataList"dataList" :rowCount"20" :rowHeight"2…

[JavaScript]“复杂”的 this

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/140092319 出自【进步*于辰的博客】 参考笔记二&#xff0c;P6.1&#xff1b;笔记三&#xff0c…

【链表】- 两数相加

1. 对应力扣题目连接 两数相加 2. 实现案例代码 public class AddingTwoNumbers {public static void main(String[] args) {// 示例用例 1ListNode l1 new ListNode(2);l1.next new ListNode(4);l1.next.next new ListNode(5);ListNode l2 new ListNode(5);l2.next ne…

【Python爬虫】Python爬取喜马拉雅,爬虫教程!

一、思路设计 &#xff08;1&#xff09;分析网页 在喜马拉雅主页找到自己想要的音频&#xff0c;得到目标URL&#xff1a;https://www.ximalaya.com/qinggan/321787/ 通过分析页面的网络抓包&#xff0c;最终的到一个比较有用的json数据包 通过分析&#xff0c;得到了发送json…

docker部署前端,配置域名和ssl

之前使用80端口部署前端项目后&#xff0c;可以使用IP端口号在公网访问到部署的项目。 进行ICP域名备案后&#xff0c;可以通过域名解析将IP套壳&#xff0c;访问域名直接访问到部署的项目~ 如果使用http协议可以很容易实现这个需求&#xff0c;对nginx.conf文件进行修改&#…

Spring Boot集成DeepLearning4j实现图片数字识别

1.什么是DeepLearning4j&#xff1f; DeepLearning4J&#xff08;DL4J&#xff09;是一套基于Java语言的神经网络工具包&#xff0c;可以构建、定型和部署神经网络。DL4J与Hadoop和Spark集成&#xff0c;支持分布式CPU和GPU&#xff0c;为商业环境&#xff08;而非研究工具目的…