单一职责原则
就一个类而言,应该仅有一个引起它变化的原因。例如一台山寨手机的功能:拍照、摄像、手机游戏、网络摄像头、GPS、炒股等等,虽然功能多,但是每一个功能都不强。
每一个职责都是一个变化的轴线,当需求变化时会反映为类的职责的变化。如果一个类承担的职责多于一个,那么引起它变化的原因就有多个。一个职责的变化甚至可能会削弱或者抑制类完成其他职责的能力,从而导致脆弱的设计。
一、单一职责原则示例
- 需求:接受客户端输入并提交到数据库
- 原设计:一个类负责接受客户端输入,对客户端输入进行校验,连接数据库,并提交数据到数据库
- 现设计:一个功能也就是一个职责由一个类来负责
1.1 SaveToDB
public class SaveToDB {
private String username;
private String password;
//接收客户端输入
public void input(){
//接收客户端的输入
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
username = scanner.nextLine();
System.out.println("请输入密码");
password = scanner.nextLine();
}
//校验
public boolean judge(){
if(username==null || "".equals(username.trim())){
System.out.println("用户名不能为空");
return false;
}
if(password==null || "".equals(password.trim())){
System.out.println("密码不能为空");
return false;
}
return true;
}
//连接数据库:用输入输出代替
public void getConnection(){
System.out.println("获得数据库连接");
}
//存储数据
public void saveData(){
System.out.println("存储数据成功");
}
}
1.2 MainClass
public class MainClass {
public static void main(String[] args){
SaveToDB saveToDB = new SaveToDB();
saveToDB.input();
if(saveToDB.judge()){
saveToDB.getConnection();
saveToDB.saveData();
}
}
}
对代码进行改造,实现一个职责由一个类来负责
1.3 Input
public class Input {
private String username;
private String password;
//接收客户端输入
public void input(){
//接收客户端的输入
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户名:");
username = scanner.nextLine();
System.out.println("请输入密码");
password = scanner.nextLine();
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
1.4 Vilidator
public class Vilidator {
public static boolean judge(String username,String password){
if(username==null || "".equals(username.trim())){
System.out.println("用户名不能为空");
return false;
}
if(password==null || "".equals(password.trim())){
System.out.println("密码不能为空");
return false;
}
return true;
}
}
1.5 DBManager
public class DBManager {
//连接数据库:用输入输出代替
public static void getConnection(){
System.out.println("获得数据库连接");
}
}
1.6 DBImp
public class DBImp {
//存储数据
public static void saveData(String username,String password){
System.out.println("存储数据成功");
System.out.println("姓名为:"+username);
System.out.println("密码为:"+password);
}
}