1. 程式人生 > >2單一職責原則SRP

2單一職責原則SRP

客戶 AS == password connect pre ons 不能 validate

一、什麽是單一職責原則

  單一職責原則(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 }

2單一職責原則SRP