設計模式六大原則---單一職責原則
背景
隨著科技的進步手機的功能越來越多,效果也越來越好;但是攝影愛好者們用的還是單反,記者采訪時用的還是錄音筆,商務辦公時用得多的還是電腦。。。也許你可以說有一天手機可能會取代它們,但是你不可否認的是大多數時候一件產品簡單點,職責單一些或許是更好的選擇。
概述
單一職責原則(Single Responsibility Principle,SRP)是設計模式六大設計原則中的第一個。所謂職責是指類變化的原因。軟件設計真正要做的許多內容就是發現職責並把那些職責相互分離。如果一個類有多於一個的動機被改變,那麼這個類有多於一個的職責。而單一職責原則指的是,就一個類而言,應該僅有一個引起它變化的原因。
問題由來
如果一個類的職責過多,就等於把這些職責耦合在一起,一個職責的變化可能會削弱或則抑製這個類完成其他職責的能力。這種耦合會導致脆弱的設計,當變化發生時,設計會糟到意想不到的破壞。
類P有兩個不同的職責,T1和T2。當由於職責T1發生變化時,需要修改類P時可能是原本正常的職責T2的功能發生故障。
這時我們就應該遵循單一職責原則,建立兩個不同的類分別負責T1和T1兩個職責,這樣我們修改其中一個時另一個就能避免發生功能故障。
舉例說明
下麵以一個用戶管理為例演示單一職責原則。在業務邏輯層上定義類UserManager,在數據訪問層定義類UserDao,在實體對象層定義類User,每個類具有不同的職責和功能。
public class User {
private String username;
private String userpass;
private int role;
//………….各個屬性的get、set方法
}
public class UserDao extends BaseDao {
//返回所有用戶
public List<User> getAllUser() {
List<User> userList = new ArrayList<User>();
......//訪問數據庫
return userList;
}
//根據用戶名查找用戶
public User getUserByName(String name) {
User user=null;
String sql="SELECT * FROM userdetail WHERE username=?";
...//查找相應用戶名的用戶
return user;
}
//添加新用戶
public boolean addUser(User user) {
//返回true 表示成功
}
}
public class UserManager {
private UserDao userDao = new UserDao();
//驗證用戶名和密碼
public boolean CheckUser(String name,String pass) {
boolean flag=false;
User user =userDao.getUserByName(name);
if(user!=null&&user.getUsername().equals(pass)) {
flag=true;
}
return flag;
}
//注冊新用戶
public void registUser(User user) {
if(userDao.getUserByName(user.getUsername()) !=null) {
System.out.println("用戶名已存在");
return;
}
if(UserDao.addUser(user)) {
//注冊成功
}else {
//注冊失敗
}
}
}
(示例from:https://wenku.baidu.com/view/d9459cabb0717fd5360cdcc3.html)
優點
降低類的複雜度,提高類的可讀性,提高係統的可維護性;使代碼真正的易維護、易擴展、易複用、靈活多樣。
最後更新:2017-04-03 12:55:00