01.单一职责原则

单一职责原则

概述

简单来说就是一个类只描述一件事, 比如我们熟知的 userDao.java 只负责 用户域功能。如果userDao既操作user表又操作order表,这显然不合理。正确的做法是让orderDao.java去操作order表。

对类来说的,一个类应该只负责一项职责。如类A负责两个不同职责:职责1,职责2。当职责1需求变更而改变A时,可能造成职责2执行错误,所以需要将类A的粒度分解为A1,A2。

代码分析

反例

java 复制代码
public class SingleResponsibility1 {
    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle();
        vehicle.run("汽车");
        vehicle.run("轮船");
        vehicle.run("飞机");
    }
}

//交通工具类
//1.在方式1中的run方法,违反了单一职责原则
//2.解决方法非常简单,根据交通方案的不同 ,分解成不同的类即可
class Vehicle{
    public void run (String vehicle){
        System.out.println(vehicle+"在公路上运行......");
    }
}

正例

java 复制代码
public class SingleResponsibility2 {
    public static void main(String[] args) {
        RoadVehicle roadVehicle = new RoadVehicle();
        roadVehicle.run("汽车");

        AirVehicle airVehicle = new AirVehicle();
        airVehicle.run("飞机");

        WaterVehicle waterVehicle = new WaterVehicle();
        waterVehicle.run("轮船");
    }

}

//交通工具类
//1.遵守单一职责原则
//2.但是这样改动很大,即将类分解,同时修改了客户端
//3.改进: 直接修改Vehicle类,改动的代码会比较少 => 方案3
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 vehicle = new Vehicle2();
        vehicle.run("汽车");
        vehicle.runWater("轮船");
        vehicle.runAir("飞机");
    }
}

//交通工具类
//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. 降低变更引起的风险(假想,现在需求变更,要求汽车只能在7点~21点在公路上运行而飞机每半小时只能起飞一架,比较以下三种方式实现变更的代码修改量);
  4. 通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单一职责原则;只有类中的方法数量足够少,才可以在方法级别保持单一职责原则;

关注我,共同进步,每周至少一更。------Wayne

相关推荐
xuxie9917 分钟前
N11 ARM-irq
java·开发语言
wefly20171 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
luanma1509801 小时前
PHP vs C++:编程语言终极对决
开发语言·c++·php
寂静or沉默1 小时前
2026最新Java岗位从P5-P7的成长面试进阶资源分享!
java·开发语言·面试
kyriewen112 小时前
给浏览器画个圈:CSS contain 如何让页面从“卡成PPT”变“丝滑如德芙”
开发语言·前端·javascript·css·chrome·typescript·ecmascript
娇娇yyyyyy3 小时前
QT编程(18): Qt QItemSelectionModel介绍
开发语言·qt
豆豆的java之旅3 小时前
软考中级软件设计师 数据结构详细知识点(含真题+练习题,可直接复习)
java·开发语言·数据结构
sthnyph3 小时前
QT开发:事件循环与处理机制的概念和流程概括性总结
开发语言·qt
大尚来也3 小时前
Java 反射:从“动态魔法”到生产实战的避坑指南
开发语言
无心水4 小时前
Java时间处理封神篇:java.time全解析
java·开发语言·python·架构·localdate·java.time·java时间处理