2单一职责原则SRP

Posted 未来_我来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2单一职责原则SRP相关的知识,希望对你有一定的参考价值。

一、什么是单一职责原则

  单一职责原则(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的主要内容,如果未能解决你的问题,请参考以下文章

设计模式 - 六大设计原则之SRP(单一职责)

设计模式 - 六大设计原则之SRP(单一职责)

面向对象设计原则一:单一职责原则(SRP)

[小黄书后台]路由级中间件及SRP单一职责原则

敏捷开发原则-SRP(单一职责原则)

深入理解JavaScript系列:S.O.L.I.D五大原则之单一职责SRP