Java单一职责原则(SRP)实例
·
一、违反单一职责原则
案例1:万能用户类(耦合4个职责)
// 违反SRP:一个类承担 数据封装、校验、存储、展示 4个职责
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
// 职责1:校验用户合法性
public boolean isValid() {
return this.age >= 18 && this.name.length() > 1;
}
// 职责2:保存用户数据
public void saveUser() {
System.out.println("保存用户【" + this.name + "】到数据库");
}
// 职责3:打印用户信息
public void printInfo() {
System.out.println("姓名:" + this.name + ",年龄:" + this.age);
}
// getter/setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
// 测试类
public class SRPTest {
public static void main(String[] args) {
User user = new User("张三", 20);
if (user.isValid()) {
user.saveUser();
user.printInfo();
} else {
System.out.println("用户信息不合法");
}
}
}
案例2:万能工具类(耦合多种工具功能)
// 违反SRP:一个工具类承担 字符串处理、日期处理、数字校验 3个职责
public class CommonUtil {
// 职责1:字符串去空格
public static String trimSpace(String str) {
if (str == null) {
return "";
}
return str.trim();
}
// 职责2:日期格式化
public static String formatDate(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(date);
}
// 职责3:校验是否为正整数
public static boolean isPositiveInt(int num) {
return num > 0;
}
}
二、遵循单一职责原则
案例1:用户相关拆分(4个类,各司其职)
// 1. 实体类:仅封装用户数据(职责:数据存储)
public class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
// 2. 校验类:仅负责用户校验(职责:合法性校验)
public class UserValidator {
public boolean validate(User user) {
if (user == null) {
return false;
}
boolean nameValid = user.getName() != null && user.getName().length() > 1;
boolean ageValid = user.getAge() >= 18;
return nameValid && ageValid;
}
}
// 3. 存储类:仅负责用户存储(职责:数据持久化)
public class UserRepository {
public void save(User user) {
System.out.println("保存用户【" + user.getName() + "】到数据库");
}
}
// 4. 展示类:仅负责用户信息展示(职责:信息打印)
public class UserPrinter {
public void print(User user) {
System.out.println("姓名:" + user.getName() + ",年龄:" + user.getAge());
}
}
// 测试类(协调各模块)
public class SRPTest {
public static void main(String[] args) {
User user = new User("张三", 20);
UserValidator validator = new UserValidator();
UserRepository repository = new UserRepository();
UserPrinter printer = new UserPrinter();
if (validator.validate(user)) {
repository.save(user);
printer.print(user);
} else {
System.out.println("用户信息不合法");
}
}
}
案例2:工具类拆分(3个类,各司其职)
// 1. 字符串工具类:仅处理字符串相关(职责:字符串操作)
public class StringUtil {
public static String trimSpace(String str) {
if (str == null) {
return "";
}
return str.trim();
}
}
// 2. 日期工具类:仅处理日期相关(职责:日期操作)
public class DateUtil {
public static String formatDate(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(date);
}
}
// 3. 数字工具类:仅处理数字校验相关(职责:数字校验)
public class NumberUtil {
public static boolean isPositiveInt(int num) {
return num > 0;
}
}
// 测试类
public class UtilTest {
public static void main(String[] args) {
System.out.println(StringUtil.trimSpace(" test "));
System.out.println(DateUtil.formatDate(new Date()));
System.out.println(NumberUtil.isPositiveInt(10));
}
}
案例3:订单相关拆分(简化版,常用实战场景)
// 1. 订单实体类:仅封装订单数据
public class Order {
private String orderId;
private String userId;
private BigDecimal amount;
private String status;
// 构造器、getter
public Order(String orderId, String userId, BigDecimal amount, String status) {
this.orderId = orderId;
this.userId = userId;
this.amount = amount;
this.status = status;
}
public String getOrderId() {
return orderId;
}
public String getUserId() {
return userId;
}
public BigDecimal getAmount() {
return amount;
}
public String getStatus() {
return status;
}
}
// 2. 订单校验类:仅校验订单合法性
public class OrderValidator {
public boolean validate(Order order) {
if (order == null) {
return false;
}
// 校验订单号、金额、用户ID非空
boolean idValid = order.getOrderId() != null && !order.getOrderId().isEmpty();
boolean userIdValid = order.getUserId() != null && !order.getUserId().isEmpty();
boolean amountValid = order.getAmount() != null && order.getAmount().compareTo(BigDecimal.ZERO) > 0;
return idValid && userIdValid && amountValid;
}
}
// 3. 订单服务类:仅处理订单业务逻辑
public class OrderService {
public void createOrder(Order order) {
OrderValidator validator = new OrderValidator();
if (!validator.validate(order)) {
throw new IllegalArgumentException("订单信息不合法");
}
// 模拟订单创建逻辑
System.out.println("订单【" + order.getOrderId() + "】创建成功");
}
}
// 测试类
public class OrderTest {
public static void main(String[] args) {
Order order = new Order("ORDER001", "USER123", new BigDecimal("99.9"), "待支付");
OrderService orderService = new OrderService();
orderService.createOrder(order);
}
}
更多推荐

所有评论(0)