首页 > 其他分享 >「撸一手好代码」设计模式之单一职责原则

「撸一手好代码」设计模式之单一职责原则

时间:2024-10-13 20:46:54浏览次数:10  
标签:职责 一手 user 用户 param User 设计模式 String

在软件开发的世界里,随着项目规模的扩大和复杂度的增加,保持代码的清晰和可维护性变得尤为重要。而单一职责原则正是我们手中的一把利剑,帮助我们构建更加健壮、灵活的系统。

一、什么是单一职责原则?

单一职责原则(Single Responsibility Principle,简称SRP)是面向对象设计的基本原则之一,它指出:一个类应该仅有一个引起它变化的原因。换句话说,一个类应该负责一项职责,并且这个职责应该被完整地封装在类内。当职责过多时,类之间的耦合度会增加,一旦某个职责发生变化,就可能会影响到其他职责的实现,从而增加修改和维护的难度。

二、为什么需要单一职责原则?

  1. 提高代码的可读性:每个类职责单一,使得代码更容易被理解和阅读。
  2. 增强代码的可维护性:当需要修改或扩展某个功能时,只需关注与该功能相关的类,减少了出错的可能性。
  3. 促进代码的重用:职责单一的类更有可能被其他系统或模块重用。
  4. 降低耦合度:减少了类之间的依赖关系,使得系统更加灵活,易于扩展和测试。

三、如何应用单一职责原则?

  1. 识别职责:首先,我们需要仔细分析类的功能,识别出它承担的所有职责。
  2. 评估职责:然后,评估这些职责之间是否存在紧密的联系。如果某个职责与其他职责相对独立,或者其变化频率与其他职责不同,那么它可能就是一个需要被分离出来的职责。
  3. 重构代码:将识别出的独立职责分配给新的类,并在旧类和新类之间建立合理的接口或依赖关系。

四、反向示例及后果

示例:多职责的UserManager
假设我们有一个UserManager类,它原本只负责用户信息的增删改查操作。但随着时间的推移,为了满足业务需求,这个类被不断扩展,增加了用户认证、权限检查、发送邮件通知等多种功能。

class UserManager {
    // 用户信息管理
    void addUser(User user) { ... }
    void updateUser(User user) { ... }
    User getUserById(int id) { ... }

    // 用户认证
    boolean authenticateUser(String username, String password) { ... }

    // 权限检查
    boolean checkPermission(User user, String permission) { ... }

    // 发送邮件通知
    void sendEmailNotification(User user, String subject, String body) { ... }
}

后果

  1. 代码难以理解与维护:由于UserManager类包含了多种不相关的职责,其他开发者在阅读或修改代码时可能会感到困惑,难以快速定位问题。
  2. 高耦合度:不同的职责之间可能存在紧密的联系,一旦某个职责的实现发生变化,就可能影响到其他职责。
  3. 难以复用:由于功能混杂,UserManager类很难被其他系统或模块重用。
  4. 扩展性差:当需要添加新的用户相关功能时,由于类的职责已经过多,可能不得不继续在这个类中增加方法,导致类变得更加庞大和复杂。譬如邮件发送,如果需要包含抄送人怎么办?如果按用户组发送怎么办?等等。

五、如何避免反向示例中的后果?

遵循单一职责原则,将UserManager类拆分为多个职责单一的类,如UserRepository(负责用户信息的增删改查)、UserAuthenticator(负责用户认证)、PermissionChecker(负责权限检查)和EmailService(负责发送邮件通知)等。

/**
 * 负责用户信息的增删改查
 */
public class UserRepository {

    /**
     * 添加用户
     * @param user
     */
    void addUser(User user) {
        // do something
    }

    /**
     * 编辑用户
     * @param user
     */
    void updateUser(User user) {
        // do something
    }

    /**
     * 根据id获取用户信息
     * @param id
     * @return
     */
    User getUserById(int id) {
        // do something
        return new User();
    }
}
/**
 * 负责用户认证
 */
public class UserAuthenticator {

    /**
     * 用户认证
     * @param username
     * @param password
     * @return
     */
    boolean authenticateUser(String username, String password) {
        // do something
        return true;
    }
}
/**
 * 负责权限检查
 */
public class PermissionChecker {

    /**
     * 权限检查
     * @param user
     * @param permission
     * @return
     */
    boolean checkPermission(User user, String permission) {
        // do something
        return true;
    }
}
/**
 * 负责发送邮件通知
 */
public class EmailService {

    /**
     * 发送邮件通知
     * @param user
     * @param subject
     * @param body
     */
    void sendEmailNotification(User user, String subject, String body) {
        // do something
    }
}

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="Ew9pnusZ-1728785445491" src="https://live.csdn.net/v/embed/429031"></iframe>

「撸一手好代码」设计模式之单一职责原则

标签:职责,一手,user,用户,param,User,设计模式,String
From: https://blog.csdn.net/lk13962517093/article/details/142894446

相关文章

  • 设计模式学习整理
    学习参考:重构大师创建型模式创建型模式提供了创建对象的机制,能够提升已有代码的灵活性和可复用性。工厂方法模式在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型;实现方式:使用特殊的工厂方法代替对于对象构造函数的直接调用(即使用new运算符),对象仍将通......
  • 设计模式-责任连
    packagecom.example.cor.chain;importcom.example.cor.filter.Filter;importjavax.servlet.Servlet;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjava.io.IOException;publicclas......
  • 设计模式分类和软件设计原则
    1.设计模式分类类别名称描述设计模式创建型模式怎样创建对象,将对象的创建与使用分离单例、原型、工厂方法、抽象工厂、建造者结构型模式将类或对象按某种布局组成更大的结构代理、适配器、桥接、装饰、外观、亨元、组合行为型模式类或对象之间怎样相互协作......
  • 设计模式(二)
    第一类模式:创建者模式创建型模式的主要关注点是“怎么样创建对象?”,它的主要关注点是“将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为:单例模式工厂方法模式抽象工程模式原型模式建造者......
  • C#设计模式详解:从简单工厂到抽象工厂
    在C#中,简单工厂(SimpleFactory)和抽象工厂(AbstractFactory)是两种常用的设计模式,它们都属于创建型设计模式,用于创建对象而无需在代码中显式指定具体的类。尽管它们的目的相似,但在复杂性和灵活性方面存在显著差异。简单工厂(SimpleFactory)简单工厂模式是一种不属于GoF(四人帮......
  • 设计模式11
    packagecom.example.principle.ocp;publicclassApiInfo{privateStringapi;privatelongrequestCount;privatelongerrorCount;privatelongdurationOfSeconds;//privatelongtimeoutCount;publicStringgetApi(){r......
  • 设计模式详解(命令模式)
    命令模式(CommandPattern)是一种行为型设计模式,它将请求封装为一个对象,从而使得请求的发送者和接收者解耦。一、命令模式的核心思想命令模式的核心思想是将“请求”封装成为一个对象,从而使得我们可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的......
  • 设计模式
    重点:单例模式、工厂方法模式、建造者模式、适配器模式(类/对象)、代理模式、装饰器模式、迭代器模式、模板方法模式、策略模式、责任链模式、观察者模式1、设计模式的分类创建型模式用于描述“怎么样创建对象”,它的主要特征是“将对象的创建与使用分离”。GOF书中提到了单例......
  • 前端开发设计模式——组合模式
    目录一、组合模式的定义和特点1.定义2.特点:二、组合模式的实现方式1.定义抽象组件类2.创建叶节点类3.创建组合类:三、组合模式的应用场景1.界面布局管理2.菜单系统构建3.组件库开发四、组合模式的优点1.简化客户端代码2.增强代码的可拓展性3.清晰的层次结构表示......
  • 重修设计模式-行为型-观察者模式
    重修设计模式-行为型-观察者模式Defineaone-to-manydependencybetweenobjectssothatwhenoneobjectchangesstate,allitsdependentsarenotifiedandupdatedautomatically.在对象之间订阅一个一对多的依赖,当一个对象状态改变时,它的所有依赖对象都会自动......