设计模式之单一职责模式

1
2
// 单一职责模式顾名思义就是一个类尽量保证只有一个职责。比如生活中相机只用来拍照、MP3只用来听歌。当我们把这些功能如果放在一起的话 就会变得很复杂。代码也一样 会导致代码维护困难。牵一发而动全身。
// 手机的发展有他自己的特点:然而编程时,我们却是要在类的职责分离上多思考,做到单一职责,这样的代码才是真正的以维护、易扩展、易复用、灵活多样。

例子

员工薪资计算

// 构建一个员工类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Employee {
private String id;
private String name;
private double salary;

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

// Getters and setters
public String getId() {
return id;
}

public String getName() {
return name;
}

public double getSalary() {
return salary;
}

public void setSalary(double salary) {
this.salary = salary;
}
}

// 员工数据管理类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class EmployeeDAO {
private List<Employee> employees = new ArrayList<>();

public void addEmployee(Employee employee) {
employees.add(employee);
}

public void removeEmployee(String id) {
employees.removeIf(employee -> employee.getId().equals(id));
}

public Employee findEmployee(String id) {
return employees.stream()
.filter(employee -> employee.getId().equals(id))
.findFirst()
.orElse(null);
}
}

// 薪资计算类

1
2
3
4
5
6
7
8
9
10
public class SalaryCalculator {
public double calculateMonthlySalary(Employee employee) {
// 这里可以加入更复杂的薪资计算逻辑
return employee.getSalary();
}

public double calculateYearlySalary(Employee employee) {
return employee.getSalary() * 12;
}
}

// 员工报告生成类

1
2
3
4
5
6
7
8
public class EmployeeReporter {
public String generateReport(Employee employee) {
return "Employee Report:\n" +
"ID: " + employee.getId() + "\n" +
"Name: " + employee.getName() + "\n" +
"Salary: $" + employee.getSalary();
}
}

// main函数(主类)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class EmployeeManagementSystem {
public static void main(String[] args) {
Single.EmployeeDAO dao = new Single.EmployeeDAO();
Single.SalaryCalculator calculator = new Single.SalaryCalculator();
Single.EmployeeReporter reporter = new Single.EmployeeReporter();

// 添加员工
Single.Employee john = new Single.Employee("E001", "John Doe", 5000);
dao.addEmployee(john);

// 计算薪资
double monthlySalary = calculator.calculateMonthlySalary(john);
System.out.println("John's monthly salary: $" + monthlySalary);

// 生成报告
String report = reporter.generateReport(john);
System.out.println(report);
}
}