关于单一职责原则

简介:

单一职责原则(Single Responsibility Principle,SRP )是面向对象设计 SOLID 原则中的第一个原则,其核心思想是:一个类(或模块、方法)应该只有一个引起它变化的原因。换句话说,一个类应该专注于单一的功能或职责,避免承担过多不相关的任务。


核心思想

  • 职责单一化:每个类只负责一个明确的职责。

  • 高内聚,低耦合:将功能相关的代码集中,减少与其他模块的依赖。

  • 避免上帝类:防止出现功能庞杂、难以维护的"万能类"。


为什么重要?

  1. 可维护性:修改一个职责时,不会意外影响其他功能。

  2. 可读性:代码结构清晰,职责明确,易于理解。

  3. 复用性:单一职责的类更容易被复用到其他场景。

  4. 测试性:职责单一的方法更容易编写单元测试。

  5. 灵活性:系统变更时,只需修改特定模块,减少连锁反应。

代码举例:

情况一:

很显然这个没有实现单一职责原则,复用性和灵活性并不高

java 复制代码
public class SingleResponsibility1 {
    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle();
        vehicle.run("摩托车");
        vehicle.run("飞机");
        vehicle.run("汽车");
    }
}
///交通工具类
//1.方式1违反了单一职责
//2.解决方式:根据交通工具方式不同分解成不同的类
class Vehicle{
    public void run(String vehicle){
        System.out.println(vehicle+" 在公路上");
    }
}

情况二:

这种属于在类级别上进行改进,解决了违反单一职责原则的问题

java 复制代码
public class SingleResponsibility2 {
    public static void main(String[] args) {
        RoadVehicle vehicle = new RoadVehicle();
        vehicle.run("摩托车");
        AirVehicle airVehicle = new AirVehicle();
        airVehicle.run("飞机");
        WaterVehicle waterVehicle = new WaterVehicle();
        waterVehicle.run("汽车");
    }
}
//方案二
//1.遵守了单一职责原则
//2.但是这样做花销很大改动很大,将类分解同时修改客户端
//3,改进 直接修改Vehicle类
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+"在水里");
    }
}

情况三

这个在方法上遵守的单一职责,其实没有完全的符合单一职责

注意:这种方式只适合方法足够少,逻辑足够简单,可以不完全遵守

java 复制代码
public class SingleResponsibility3 {
    public static void main(String[] args) {
        Vehicle2 vehicle2 = new Vehicle2();
        vehicle2.run("摩托车");
        vehicle2.runAir("飞机");
        vehicle2.runWater("船");
    }
}
//方式三
//1,这种修改没有对原来类做大的修改,只是增加方法
//2.虽然没有在类级别上遵守单一职责原则,在方法级别上仍然遵守单一职责原则
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.提高可读性,可维护性.。
3.降低变更带来的风险,条理清晰。
4.通常要严格尊守,不复杂的情况下,方法少,可以适当违反(在方法级别上保持单一职责原

则)。

相关推荐
码匠许师傅3 分钟前
【C++ 面试真题】聊聊 C++ 的拷贝构造与拷贝赋值
java·c++·面试
极创信息2 小时前
系统安全隐患全方位排查方案:标准化渗透测试全流程
java·opencv·struts·数据挖掘·eclipse·语音识别·hibernate
汉字萌萌哒2 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
喜欢的名字被抢了2 小时前
程序出问题怎么查,以及如何让它不掉线
java·运维·数据库
数据知道3 小时前
反序列化漏洞:Java、PHP、Python 三条线各讲透
java·网络·python·安全·网络安全·php
2601_949950634 小时前
Java 面试准备,用练题簿把“背过八股”变成“真正会答”
java·开发语言·面试·刷题·小程序推荐
Rain的Java大神之路4 小时前
MQ重复消费问题怎么解决
java·经验分享·后端·面试·架构·rabbitmq·rocketmq
無限進步D4 小时前
Java 函数式编程(Lambda)
java·开发语言
rannn_1114 小时前
【力扣hot100】链表专题下|138、148、23、146
java·算法·leetcode·链表·开发
lv__pf4 小时前
Spring配置类解析 【TL spring 11】
java·前端·spring