一、什么是单一职责原则
单一职责原则(Single Responsibility Principle ): 就一个类而言,应该仅有一个引起它变化的 原因。
二、多功能的山寨手机
山寨手机的功能: 拍照、摄像、手机游戏、网络摄像头、GPS、炒股 等等。
功能多、但是每一个功能都不强。
拍摄功能 ------>专业摄像机或照相机
手机游戏 ------>PSP
网络摄像头---->专业摄像头
GPS功能------>专业GPS导航系统
三、烦人的山寨手机
每一个职责都是一个变化的轴线,当需求变化 时会反映为类的职责的变化。如果一个类承担的 职责多于一个,那么引起它变化的原因就有多个。 一个职责的变化甚至可能会削弱或者抑制类完成 其他职责的能力,从而导致脆弱的设计。
四、单一职责原则示例
接受客户端输入并提交到数据库。
原有设计: 一个类负责接受客户端输入,对客户端输入进 行校验,连接数据库,并提交数据到数据库。
现有设计: 一个功能也就是一个职责由一个类来负责。
原有设计:
1 import java.util.Scanner; 2 3 public class SaveToDB { 4 private String username; 5 private String upassword; 6 7 //获得客户端输入 8 public void shuru() { 9 Scanner scanner = new Scanner(System.in); 10 System.out.println("请输入用户名"); 11 username = scanner.nextLine(); 12 System.out.println("请输入密码"); 13 upassword = scanner.nextLine(); 14 } 15 16 //进行数据校验 17 public boolean validate() { 18 if(username == null || "".equals(username.trim())) { 19 System.out.println("用户名不能为空"); 20 return false; 21 } 22 if(upassword == null || "".equals(upassword.trim())) { 23 System.out.println("密码不能为空"); 24 return false; 25 } 26 return true; 27 } 28 29 //连接数据库 30 public void getConnection() { 31 System.out.println("获得数据库连接"); 32 } 33 34 //进行数据操作 35 public void save() { 36 System.out.println("将" + username + "保存到了数据库"); 37 System.out.println("将" + upassword + "保存到了数据库"); 38 } 39 }
测试
1 public class MainClass { 2 public static void main(String[] args) { 3 //接受客户端的输入 4 SaveToDB std = new SaveToDB(); 5 std.shuru(); 6 if(std.validate()) { 7 std.getConnection(); 8 std.save(); 9 } 10 } 11 }
==========================================================================
现有设计:
客户端输入
1 import java.util.Scanner; 2 3 public class Input { 4 private String username; 5 private String upassword; 6 7 //获得客户端输入 8 public void shuru() { 9 Scanner scanner = new Scanner(System.in); 10 System.out.println("请输入用户名"); 11 username = scanner.nextLine(); 12 System.out.println("请输入密码"); 13 upassword = scanner.nextLine(); 14 } 15 16 public String getUsername() { 17 return username; 18 } 19 20 public void setUsername(String username) { 21 this.username = username; 22 } 23 24 public String getUpassword() { 25 return upassword; 26 } 27 28 public void setUpassword(String upassword) { 29 this.upassword = upassword; 30 } 31 }
数据操作
1 public class DAOImp { 2 //进行数据操作 3 public void save(String username,String upassword) { 4 System.out.println("将" + username + "保存到了数据库"); 5 System.out.println("将" + upassword + "保存到了数据库"); 6 } 7 }
连接数据库
1 public class DBManager { 2 //连接数据库 3 public static void getConnection() { 4 System.out.println("获得数据库连接"); 5 } 6 }
数据校验
1 public class Validator { 2 //进行数据校验 3 public boolean validate(String username, String upassword) { 4 if(username == null || "".equals(username.trim())) { 5 System.out.println("用户名不能为空"); 6 return false; 7 } 8 if(upassword == null || "".equals(upassword.trim())) { 9 System.out.println("密码不能为空"); 10 return false; 11 } 12 return true; 13 } 14 }
测试
1 public class MainClass { 2 public static void main(String[] args) { 3 Input input = new Input(); 4 input.shuru(); 5 Validator validator = new Validator(); 6 if(validator.validate(input.getUsername(), input.getUpassword())){ 7 DBManager.getConnection(); 8 DAOImp dao = new DAOImp(); 9 dao.save(input.getUsername(), input.getUpassword()); 10 } 11 } 12 }