设计模式—单一职责原则

1.背景

单一职责原则(SRP:Single responsibility principle)又称单一功能原则,面向对象五个基本原则(SOLID)之一。它规定一个类应该只有一个发生变化的原因。该原则由罗伯特·C·马丁(Robert C. Martin)于《敏捷软件开发:原则、模式与实践》一书中给出的。马丁表示此原则是基于汤姆·狄马克(Tom DeMarco)和Meilir Page-Jones的著作中的内聚性原则发展出的。

2.概念

就一个类而言,应该仅有一个引起它变化的原因。应该只有一个职责。每一个职责都是变化的一个轴线,如果一个类有一个以上的职责,这些职责就耦合在了一起。这会导致脆弱的设计。当一个职责发生变化时,可能会影响其它的职责。另外,多个职责耦合在一起,会影响复用性。此原则的核心就是解耦和增强内聚性。

通俗的讲:

方法级别的单一职责原则:一个方法只负责一件事

类级别的单一职责原则: 一个类只负责一件事

类库级别的单一职责原则:一个类库应该职责清晰

项目级别的单一职责原则:一个项目应该职责清晰(客户端、管理后台、后台服务、任务调度服务、分布式引擎)

系统级别的单一职责原则:为通用功能拆分子系统(日志系统、权限系统、存储系统)

3.针对的场景

有一个类T负责两个不同的职责:职责P1和职责P2。当因为职责P1的需求发生改变而需要修改类T的时候,有可能会导致原本运行正常的职责P2功能发生故障。

举例:下面示例中一个图片加载类负责3个不同的职责:图片下载、保存到缓存、图片显示

cs 复制代码
public class ImageLoader {
    /**
     * 下载
     */
    public Bitmap download(String url){
        Bitmap bitmap = null;
        // 下载图片
        //...
        return bitmap;
    }
    
    public void displayImage2(ImageView imageView, String url){
        Bitmap bitmap = download(url);
        // 图片显示
        //...
        // 图片缓存
        imageCache(bitmap);
    }
    
    public void imageCache(Bitmap bitmap){
        // 图片缓存
        //...
    }
}

4.解决方案

遵循单一职责原则,分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。这样,当修改类T1的时候,不会使职责P2发生故障风险。同理,当修改T2的时候,也不会使职责P1发生故障风险。

举例:针对上面案例中的代码,我们进行优化,我们把图片下载、保存到缓存、图片显示这几个职责定义成单独类,而不是一个类全搞定。

cs 复制代码
/**
 * 下载类
 */
public class Download {
    /**
     * 下载
     *
     * @param url 下载地址
     * @return 图片
     */
    public Bitmap download(String url) {
        Bitmap bitmap = null;
        System.out.println("下载图片");
        return bitmap;
    }
}
/**
 * 缓存类
 */
public class Cache {
    /**
     * 缓存图片
     * @param bitmap 图片
     */
    public void imageCache(Bitmap bitmap){
        System.out.println("缓存图片");
    }
}
/**
 * 图片加载类
 */
public class ImageLoader {
    /**
     * 3加载图片
     * @param imageView 图片控件
     * @param url 图片地址
     */
    public void displayImage3(ImageView imageView, String url){
        Download download = new Download();
        Bitmap bitmap = download.download(url);
        // 图片显示
        System.out.println("显示图片");
        //...
        // 图片缓存
        Cache cache = new Cache();
        cache.imageCache(bitmap);
    }
}

5.优点

  • 降低类的复杂度,一个类只负责一个职责。

  • 提高类的可读性,提高系统的可维护性。

  • 降低变更引起的风险。变更是必然的,如果单一职责原则遵守得好,就可以达到职责/功能的解耦。

相关推荐
高晶5 小时前
无乘法器实现LC二阶滤波器:基于移位运算的快速算法与四种精度推导
算法·设计模式·程序员
高晶5 小时前
主从自动分配算法:平均值乘以设备数一半的选举基准值解析
算法·设计模式·程序员
延晗5 小时前
【从零开始 DeepSeek Harness 插件开发教程】二、一切皆插件:简单理解一下 Cordis 内核与 DSH 心智模型
设计模式·deepseek
高晶6 小时前
Android 通讯录应用开发实战:从零搭建 SQLite 数据持久化完整项目
android·设计模式·前端框架
日和雫12 小时前
封装、继承、多态 & 组合,为什么组合大于继承?
设计模式
代钦塔拉15 小时前
【C++/Qt 进阶】设计模式系列(6):桥接模式——把“两个独立变化的维度“拆开
c++·qt·设计模式
haluhalu.15 小时前
深入理解AIAgent(1.3)--- 设计模式
人工智能·python·设计模式·langchain
高晶2 天前
CANopen 在 BMS 系统中的 C 语言实战指南
设计模式·程序员
博风2 天前
13、设计模式应用举例:工厂方法模式:创建药品对象
设计模式·工厂方法模式
代钦塔拉2 天前
【C++/Qt 进阶】设计模式系列(5):适配器模式——给“不兼容的接口“贴一层翻译膜
c++·qt·设计模式