一、案例背景
原有项目中全部登录相关逻辑写在一个Login类里,该类同时承担了页面展示、数据库连接、用户账号校验、程序入口多项完全不同的职责,违背了单一职责原则。
单一职责核心:一个类只负责一项职责,只对应一个业务变化原因。当 UI 界面改动、数据库更换、登录校验规则修改时,都要修改同一个 Login 类,代码耦合严重,极易引发连带 bug。

二、原始代码问题分析
原始 Login 类包含四类无关功能:
1.display():前端界面展示,负责页面渲染
2.getConnection():获取数据库连接,数据层操作
3.findUser():账号密码校验,业务逻辑处理
4.main():程序启动入口
四类功能分别对应 UI、数据库、业务、测试四个方向的需求变更,修改任意一处都要改动 Login 类,不符合单一职责。

三、重构思路
按照职责拆分,拆分成三个独立类:
1.LoginView(视图类):只负责页面展示 display ()
2.DBUtil(工具类):只负责创建数据库连接 getConnection ()
3.LoginService(业务类):只负责用户登录校验 findUser ()
客户端类负责组装调用,实现功能解耦。

四、重构后代码实现

  1. 视图类:LoginView(仅界面展示职责)
/**
 * 职责:只做登录页面展示
 */
public class LoginView {
    public void display(){
        System.out.println("渲染登录页面,展示账号密码输入框");
    }
}
  1. 数据库工具类:DBUtil(仅数据库连接职责)
/**
 * 职责:只负责数据库连接获取
 */
public class DBUtil {
    public Connection getConnection(){
        System.out.println("创建数据库连接");
        return null;
    }
}
  1. 登录业务类:LoginService(仅登录校验职责)
/**
 * 职责:只处理账号密码校验的业务逻辑
 */
public class LoginService {
    private DBUtil dbUtil = new DBUtil();

    public boolean findUser(String username,String password){
        // 拿到数据库连接,查询用户信息
        dbUtil.getConnection();
        System.out.println("校验账号:"+username+",密码:"+password);
        return "admin".equals(username) && "123456".equals(password);
    }
}
  1. 客户端调用类
public class Client {
    public static void main(String[] args) {
        // 视图展示
        LoginView view = new LoginView();
        view.display();

        // 业务登录校验
        LoginService service = new LoginService();
        boolean result = service.findUser("admin","123456");
        System.out.println(result ? "登录成功":"登录失败");
    }
}

五、重构后优势
1.界面改版只修改LoginView,不碰数据库和登录校验代码;
2.更换数据库驱动只修改DBUtil,不影响界面与业务;
3.修改登录校验规则只改动LoginService,其余类完全不受影响;
4.类职责清晰,代码可读性、可维护性大幅提升。

六、总结
单一职责原则本质:各司其职,解耦拆分。一个类不要包揽多个不相干的功能,当一个类存在多个修改理由时,就需要拆分。日常开发中遇到大类臃肿,优先用单一职责做分层拆分。

更多推荐