小谈设计模式(4)—单一职责原则

2023-09-18 10:42:42

专栏介绍

专栏地址

link

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
在这里插入图片描述

单一职责原则

单一职责原则(Single Responsibility Principle,SRP)是设计模式中的一项原则,它指出一个类或模块应该有且只有一个引起它变化的原因。换句话说,一个类或模块应该只负责一项职责。

核心思想

职责的划分

将系统中的功能和行为划分为不同的职责,每个类或模块只负责一种相关的职责。这样可以使得类的职责更加明确和清晰,便于理解和维护。

单一变化原则

一个类或模块应该只有一个引起它变化的原因。如果一个类负责多种不相关的职责,那么对其中一个职责的修改可能会影响到其他职责,增加了代码的风险和复杂性。

高内聚性

类的内聚性指的是类内部的成员之间联系的紧密程度。遵守单一职责原则可以提高类的内聚性,使得类内部的成员相互关联度高,功能相关的代码放在同一个类中,便于理解和维护。

低耦合性

类之间的耦合性指的是彼此之间的依赖程度。遵守单一职责原则可以降低类之间的耦合性,使得类之间的依赖关系更加清晰和简单,减少代码的依赖和影响范围。

核心总结

单一职责原则的核心思想是将一个类或模块的职责限定在一个很小的范围内,使其只负责一种相关的功能或行为。这样可以保持类的高内聚性、低耦合性,提高代码的可读性、可维护性和可扩展性。
在这里插入图片描述

举例

假设我们有一个图书管理系统,其中包含了图书的借阅和归还功能。我们可以将这个系统划分为以下几个类:

图书类(Book)

负责表示图书的属性和行为,比如书名、作者、借阅状态等。

用户类(User)

负责表示用户的属性和行为,比如用户名、密码、借阅图书等。

图书管理类(Library)

负责管理图书的借阅和归还功能。
在这里插入图片描述

分析

在这个例子中,每个类都只负责一种相关的职责,符合了单一职责原则。图书类只负责表示图书的属性和行为,用户类只负责表示用户的属性和行为,图书管理类只负责管理图书的借阅和归还功能。

不遵守单一职责原则,可能引发的问题

类的职责不清晰

一个类负责了多种不相关的职责,使得代码难以理解和维护。

类的修改影响范围过大

当一个类负责多种职责时,对其中一个职责的修改可能会影响到其他职责,增加了代码的风险和复杂性。

难以重用和扩展

一个类负责多种职责时,可能会导致代码的耦合性增加,使得难以重用和扩展。
在这里插入图片描述

Java代码实现

// 图书类
class Book {
    private String title;
    private String author;
    private int pageCount;
    
    // 构造函数、getter和setter方法省略
    
    // 图书的展示功能
    public void display() {
        System.out.println("Title: " + this.title);
        System.out.println("Author: " + this.author);
        System.out.println("Page Count: " + this.pageCount);
    }
}

// 图书管理类
class Library {
    private List<Book> books;
    
    // 构造函数、getter和setter方法省略
    
    // 图书的借阅功能
    public void borrowBook(Book book) {
        if (books.contains(book)) {
            books.remove(book);
            System.out.println("Borrowed book: " + book.getTitle());
        } else {
            System.out.println("Book not available for borrowing.");
        }
    }
    
    // 图书的归还功能
    public void returnBook(Book book) {
        books.add(book);
        System.out.println("Returned book: " + book.getTitle());
    }
}

在这里插入图片描述

程序分析

我们定义了两个类:Book和Library。Book类负责表示图书的属性和行为,包括展示图书的功能;Library类负责管理图书的借阅和归还功能。

通过将图书的展示功能和图书的借阅、归还功能分别放在不同的类中,我们遵守了单一职责原则。每个类只负责一种相关的职责,使得代码更加清晰和易于维护。

当我们需要使用这些功能时,可以直接调用相应的方法

Book book = new Book("Design Patterns", "Gang of Four", 400);
book.display();

Library library = new Library();
library.borrowBook(book);
library.returnBook(book);

这样,我们可以很方便地使用图书的展示、借阅和归还功能,而不会影响到其他相关的功能。

总结

总结来说,单一职责原则是设计模式中的一项重要原则,它要求将功能划分得更加细致,使得每个类或模块
只负责一种相关的职责。遵守单一职责原则可以提高代码的可读性、可维护性和可扩展性。

更多推荐

Linux 信号集 及其 部分函数

这几个函数都是对自己自定义的信号集操作intsigemptyset(sigset_t*set)功能:清空信号集中的数据,将所有的标志位置为0参数:set需要操作的信号集返回值:成功0失败-1intsigfillset(sigset_t*set)功能:清空信号集中的数据,将所有的标志位置为1参数:set需要操作的信号集返

数据结构---二叉搜索树

二叉搜索树二叉搜索树什么是二叉搜索树?二叉搜索树的操作查找插入删除源代码非递归版二叉搜索树什么是二叉搜索树?二叉搜索树(BinarySearchTree简称BST)又称二叉排序树,是一种二叉树的特殊形式,它在每个节点上存储的键值满足以下性质:若它的左子树不为空,则左子树上的所有节点的值都小于根节点的值若它的右子树不为空

数据结构--7.1散列表(哈希表)查找

散列表查找我们要在a[]中查找key关键字的记录:——顺序表查找:挨个儿查找——有序表查找:二分法查找——散列表查找记录的存储位置=f(关键字)散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。这里我们把这种对应关系f称为散列函数,又成为哈希(Hash

EM算法和VAE的学习笔记

文章目录摘要EM算法流程EM算法对GMM的参数估计EM算法的证明EM算法的另一种理解VAE参考文献摘要这是我学习EM算法(Expectation-MaximizationAlgorithm)和VAE(VariationalAuto-Encoder)的学习笔记,首先总结了EM算法流程,然后举了一个例子,用EM算法对GMM

【karle 笔记】QQ机器人jdk17版本下载和安装

这里写自定义目录标题下载地址安装JDK:安装JRE验证安装成功下载地址https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe下载后,是一个exe文件,傻瓜式安装即可安装JDK:直接用安装包安装,默认安装路径在:C:\ProgramFil

ChatGPT技术原理

目录一、Tokenization二、Transformer模型三、预训练四、微调五、Beamsearch总结自从OpenAI的ChatGPT在2022年底横空出世以来,这款大型语言模型在各种任务中都展现了惊人的性能,包括问答、对话、文本生成等。ChatGPT以其卓越的性能和高效的处理能力,引领了自然语言处理(NLP)领

vue/react/node项目通过eslint检查语法规范

首先我们打开终端全局安装依赖npminstall-geslint然后以管理员身份运行项目终端输入eslint--init然后这里在初始化时会问我们想如何使用它?分别对应仅检查语法检查语法并发现问题检查语法、发现问题并强制执行代码样式这里建议第二种第三种肯定是不行的然后问我们您的项目使用哪种类型的模块?JavaScrip

日主题RiPro主题高端美化/设计素材软件下载站专用子主题/美化包源码(升级版/免拓展)

主题简介日主题RiPro主题高端美化/设计素材软件下载站专用子主题/美化包源码,这个子主题美化包无授权无暗链,不用再修改原主题代码,在用这个本美化包前要先下载最新ripro主题,本子主题有版本要求,仅支持RiPro8.0以上版本,建议使用官方正版主题。更新记录:美化网站整站主色调颜色,优化代码结构,更适合SEO新增菜单

文件包含漏洞

1.文件包含原理程序在开发的时候,未对包含的文件进行严格的过滤,攻击者可以构造自己的图片木马当作php执行2.文件包含分类本地包含不需要条件,只要有程序代码漏洞,默认条件就可以包含漏洞远程包含需要allow_url_include=on(开启远程包含功能)、magic_quotes_gpc=off(魔术符号关闭)htt

Flutter与Native通信原理剖析与实践

通信原理我们分几种场景来介绍Flutter和Native之间的通信。Native发送数据给FlutterFlutter发送数据给NativeFlutter发送数据给Native,然后Native回传数据给FlutterFlutter与Native通信机制在讲解Flutter与Native之间是如何传递数据之前,我们先了

UE4 C++ 使用第三方库(动态库) 详解

目录1代码共享的方式2使用三方库2.1准备一个动态库(包含.h;.lib;.dll)2.2创建一个UEC++工程2.3配置三方库1代码共享的方式在使用三方库之前,先介绍一下三方库的由来,以及为什么需要三方库。就从程序员共享代码成果开始讲述。1)三种共享方式:代码分发也就是代码共享的方式有三种:源码、动态库、静态库。源码

热文推荐