閱讀191 返回首頁    go 阿裏雲 go 技術社區[雲棲]


設計模式六大原則---單一職責原則

            背景

       隨著科技的進步手機的功能越來越多,效果也越來越好;但是攝影愛好者們用的還是單反,記者采訪時用的還是錄音筆,商務辦公時用得多的還是電腦。。。也許你可以說有一天手機可能會取代它們,但是你不可否認的是大多數時候一件產品簡單點,職責單一些或許是更好的選擇。


       概述

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

  上一篇:go 線程間共享數據
  下一篇:go Java中獲取前一天和後一天時間