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

单一职责原则

单一职责原则(Single Responsibility Principle,SRP)是软件设计中的一个重要原则。它的核心思想是一个类应该只有一个引起它变化的原因,即一个类只负责一项职责。按照这个原则,一个类只应该有一个功能,避免类承担过多的责任。

概述

单一职责原则的目的是降低类的复杂度,提高代码的可维护性和可读性。遵循这个原则可以让代码更易于理解、修改和扩展。如果一个类具有多个职责,当这些职责中的一个发生变化时,就可能影响到这个类的其他职责,从而导致代码的修改变得困难且容易出错。

应用场景

复杂类拆分:一个类承担了多个职责,可以通过将不同职责拆分成多个类来简化代码。
代码维护:在代码的维护阶段,如果发现某个类过于复杂或经常因为不同的原因发生变化,可以考虑重新设计这个类,使其遵循单一职责原则。
提高测试性:单一职责的类更容易编写单元测试,因为它们的功能单一,测试的范围更小、更集中。
示例代码
以下是一个没有遵循单一职责原则的示例,以及如何重构它使其遵循单一职责原则。

示例 1:不遵循单一职责原则

class Employee {
    private String name;
    private double salary;

    public Employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }

    // 负责打印员工信息
    public void printEmployeeDetails() {
        System.out.println("Employee Name: " + name);
        System.out.println("Employee Salary: " + salary);
    }

    // 负责计算员工年薪
    public double calculateAnnualSalary() {
        return salary * 12;
    }

    // 负责保存员工信息到数据库
    public void saveEmployee() {
        // 数据库保存逻辑
        System.out.println("Saving employee to database");
    }
}

在上述代码中,Employee 类违反了单一职责原则,它同时承担了以下几个职责:

  • 打印员工信息
  • 计算员工年薪
  • 保存员工信息到数据库

示例 2:遵循单一职责原则的重构
为了遵循单一职责原则,我们可以将这些职责分离到不同的类中:

// 员工类,只负责员工的基本信息
class Employee {
    private String name;
    private double salary;

    public Employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

    public double getSalary() {
        return salary;
    }
}

// 员工薪资类,只负责与薪资相关的操作
class EmployeeSalaryCalculator {
    public double calculateAnnualSalary(Employee employee) {
        return employee.getSalary() * 12;
    }
}

// 员工打印类,只负责打印员工信息
class EmployeePrinter {
    public void printEmployeeDetails(Employee employee) {
        System.out.println("Employee Name: " + employee.getName());
        System.out.println("Employee Salary: " + employee.getSalary());
    }
}

// 员工数据保存类,只负责保存员工信息
class EmployeeRepository {
    public void saveEmployee(Employee employee) {
        // 数据库保存逻辑
        System.out.println("Saving employee to database");
    }
}

重构后的优点

  1. 类的职责更明确:每个类都只负责一项功能,使得代码更加清晰。
  2. 修改影响最小化:如果将来需要修改某个职责的实现,例如改变计算年薪的方式,只需修改 EmployeeSalaryCalculator
    类,而不会影响其他类。
  3. 代码可维护性增强:代码变得更加容易理解和维护,因为每个类的功能单一且明确。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值