设计模式 -- 七大原则(一)-- 单一职责原则

2024-08-21 13:28

本文主要是介绍设计模式 -- 七大原则(一)-- 单一职责原则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 定义

        单一职责原则(Single Responsibility Principle,简称SRP)建议一个类或模块应该只负责一项职责。当需要修改一个功能时,只有一个原因会促使我们去修改它。

        所谓职责,在这里指的是类所承担的功能或行为。如果一个类负责多个职责,那么当其中某个职责需要变更时,可能会影响其他职责的正常运作,从而导致系统的稳定性和可维护性降低。因此,单一职责原则强调一个类应该只负责一项职责,从而确保系统的健壮性和可扩展性。

2 关键要素

  • 职责清晰:一个类的职责应该是清晰且具体的。比如,一个负责用户验证的类就不应该同时处理用户的数据存储。
  • 封装性:单一职责原则鼓励将功能封装在独立的类或模块中,这有助于功能的复用和维护。
  • 灵活性与可扩展性:遵循单一职责原则的代码更容易扩展。因为一个类的功能单一,添加新功能或修改现有功能时,对其他代码的影响较小。
  • 防止耦合:避免了一个类或模块同时处理多个职责,减少了不同职责之间的耦合,使得代码更易于管理。

3 实例

3.1 目标

        假设有一个名为“Vehicle”的类,既负责陆地交通工具如汽车,又负责空中交通工具如飞机的运行方式。这样的设计显然违反了单一职责原则,因为当交通工具运行方式发生变化时,必须修改这个类,增加了出错的风险。按照单一职责原则,应将交通工具类拆分为“LandVehicle”和“AirVehicle”等,每个类分别负责各自领域内的运行方式。

3.2 方案1

public class SingleResponsibility1 {public static void main(String[] args) {Vehicle vehicle = new Vehicle(); vehicle.run("摩托车");vehicle.run("汽车");vehicle.run("飞机");}
}//  方案1
//  交通工具类
class Vehicle {public void run(String vehicle) {System.out.println(vehicle + " 在公路上运行	");}
}

1. 在方式 1 的 run 方法中,违反了单一职责原则
2. 解决的方案非常的简单,根据交通工具运行方法不同,分解成不同类即可

3.3 方案2

public class SingleResponsibility2 {public static void main(String[] args) {RoadVehicle roadVehicle = new RoadVehicle(); roadVehicle.run("摩托车");roadVehicle.run("汽车");AirVehicle airVehicle = new AirVehicle();airVehicle.run("飞机");}
}// 方案 2 
class RoadVehicle {public void run(String vehicle) {System.out.println(vehicle + "公路运行");}
}
class AirVehicle {public void run(String vehicle) {System.out.println(vehicle + "天空运行");}
}    
class WaterVehicle {public void run(String vehicle) { System.out.println(vehicle + "水中运行");}
}

1. 遵守单一职责原则
2. 但是这样做的改动很大,即将类分解,同时修改客户端

3.4 方案3

public class SingleResponsibility3 {public static void main(String[] args) {Vehicle2 vehicle2	= new Vehicle2();vehicle2.run("汽车"); vehicle2.runWater("轮船");vehicle2.runAir("飞机");}
}// 方式 3
class Vehicle2 {public void run(String vehicle) {System.out.println(vehicle + " 在公路上运行	");}public void runAir(String vehicle) {System.out.println(vehicle + " 在天空上运行	");}public void runWater(String vehicle) { System.out.println(vehicle + " 在水中行	");}
}

1. 这种修改方法没有对原来的类做大的修改,只是增加方法
2. 这里虽然没有在类这个级别上遵守单一职责原则,但是在方法级别上,仍然是遵守单一职责

4 注意事项和细节

  • 降低类的复杂度:一个类只负责一项职责,逻辑会比负责多项职责的类简单得多。
  • 提高类的可读性:职责单一使代码更加清晰易懂,其他开发者可以更快地理解类的功能和作用。
  • 提高系统的可维护性:通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则。
  • 变更引起的风险降低:遵循单一职责原则能够减少因修改带来的风险,确保系统的稳定性和可靠性。

5 总结

        单一职责原则是面向对象设计中的一个核心原则,它鼓励开发者将复杂的系统分解为多个小而专的模块,每个模块负责一个职责。这样做不仅提高了代码的可维护性、可读性和可扩展性,还降低了代码的复杂性和出错的概率。

这篇关于设计模式 -- 七大原则(一)-- 单一职责原则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093282

相关文章

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

JVM内存调优原则及几种JVM内存调优方法

JVM内存调优原则及几种JVM内存调优方法 1、堆大小设置。 2、回收器选择。   1、在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因为GC过后这个值是不会变化的,因此内存调优的时候要更多地使用JDK提供的内存查看工具,比如JConsole和Java VisualVM。   2、对JVM内存的系统级的调优主要的目的是减少

从希腊神话到好莱坞大片,人工智能的七大历史时期值得铭记

本文选自historyextra,机器之心编译出品,参与成员:Angulia、小樱、柒柒、孟婷 你可能听过「技术奇点」,即本世纪某个阶段将出现超级智能,那时,技术将会以人类难以想象的速度飞速发展。同样,黑洞也是一个奇点,在其上任何物理定律都不适用;因此,技术奇点也是超越未来理解范围的一点。 然而,在我们到达那个奇点之前(假设我们能到达),还存在另一个极大的不连续问题,我将它称之

PHP最长单一子串

<?php//方法一$s='abcccddddddcdefg';$max='';while($s!=''){$i=0; while($i<strlen($s) && $s[$i]==$s[0]) $i++;if ($i>strlen($max)){$max=substr($s,0,$i);} $s=substr($s,$i);}echo $m

设计模式之工厂模式(通俗易懂--代码辅助理解【Java版】)

文章目录 1、工厂模式概述1)特点:2)主要角色:3)工作流程:4)优点5)缺点6)适用场景 2、简单工厂模式(静态工厂模式)1) 在简单工厂模式中,有三个主要角色:2) 简单工厂模式的优点包括:3) 简单工厂模式也有一些限制和考虑因素:4) 简单工厂模式适用场景:5) 简单工厂UML类图:6) 代码示例: 3、工厂方法模式1) 在工厂方法模式中,有4个主要角色:2) 工厂方法模式的工作流程

C#设计模式(1)——单例模式(讲解非常清楚)

一、引言 最近在学设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考。首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二、单例模式的介绍 说到单例模式,大家第一

漫谈设计模式 [12]:模板方法模式

引导性开场 菜鸟:老大,我最近在做一个项目,遇到了点麻烦。我们有很多相似的操作流程,但每个流程的细节又有些不同。我写了很多重复的代码,感觉很乱。你有啥好办法吗? 老鸟:嗯,听起来你遇到了典型的代码复用和维护问题。你有没有听说过“模板方法模式”? 菜鸟:模板方法模式?没听过。这是什么? 老鸟:简单来说,模板方法模式让你在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类中。这样,你可

漫谈设计模式 [9]:外观模式

引导性开场 菜鸟:老鸟,我最近在做一个项目,感觉代码越来越复杂,我都快看不懂了。尤其是有好几个子系统,它们之间的调用关系让我头疼。 老鸟:复杂的代码确实让人头疼。你有没有考虑过使用设计模式来简化你的代码结构? 菜鸟:设计模式?我听说过一些,但不太了解。你觉得我应该用哪个模式呢? 老鸟:听起来你的问题可能适合用**外观模式(Facade Pattern)**来解决。我们可以一起探讨一下。

设计模式大全和详解,含Python代码例子

若有不理解,可以问一下这几个免费的AI网站 https://ai-to.cn/chathttp://m6z.cn/6arKdNhttp://m6z.cn/6b1quhhttp://m6z.cn/6wVAQGhttp://m6z.cn/63vlPw 下面是设计模式的简要介绍和 Python 代码示例,涵盖主要的创建型、结构型和行为型模式。 一、创建型模式 1. 单例模式 (Singleton

漫谈设计模式 [6]:适配器模式

引导性开场 菜鸟:老鸟,我最近在项目中遇到一个问题,我们的系统需要集成一个新的第三方库,但这个库的接口和我们现有的代码完全不兼容。我该怎么办? 老鸟:这是个常见的问题,很多开发者都会遇到这种情况。你有没有听说过适配器模式? 菜鸟:适配器模式?没有,能详细说说吗? 老鸟:当然可以!这就是我们今天要讨论的主题。适配器模式是一个设计模式,可以帮助我们解决你现在遇到的问题。 渐进式介绍概念 老