一、违反单一职责原则

案例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);
    }
}

更多推荐