參考文章:https://blog.csdn.net/zhengzhb/article/details/7278174
參考書籍:設(shè)計模式之禪 --- 秦小波 著
定義:應(yīng)該有且只有一個原因引起類的改變
一句話描述:當(dāng)類只有一個作用時,改變這個類的原因也只有一個,即一個類只負(fù)責(zé)一類職責(zé)限寞。
代碼重現(xiàn):
public interface IUserDao {
int serUserName(String UserName);
String getUserNameById(String UserId);
int setUserPassword(String Password);
String getUserPasswordById(String UserId);
boolean updateUserPassword(String Password);
boolean deleteUser(User user);
}
public class UserDao implements IUserDao {
省略........
}
??現(xiàn)在有一個IUserDao 接口帖旨,這個接口有兩個職責(zé)柿赊,一個是負(fù)責(zé)User的屬性T1栅炒,一個是負(fù)責(zé)User 的行為T2取逾。顯然,對于一般程序員來講蝶溶,都不會這樣設(shè)計,沒有正確的將業(yè)務(wù)邏輯與業(yè)務(wù)對象正確區(qū)分。這樣的設(shè)計結(jié)果會導(dǎo)致一個類(接口)信息雜糅抖所,讓代碼管理陷入混亂梨州。比如當(dāng)T1發(fā)生改變時,那么IUserDao 需要修改田轧;同樣暴匠,T2變化時,IUserDao 依舊需要修改傻粘。T1每窖,T2的變化本來沒有直接影響的,但是有間接影響:T1變化導(dǎo)致IUserDao 的修改弦悉,有可能會導(dǎo)致T2發(fā)生故障風(fēng)險窒典,畢竟兩者是在同一個類中。
問題產(chǎn)生:
IUserDao接口中有T1和T2兩個職責(zé)稽莉。任意一個職責(zé)的改變瀑志,都會對IUserDao產(chǎn)生變化,這個變化最終有可能導(dǎo)致另一個職責(zé)發(fā)生故障風(fēng)險肩祥。
問題解決:
為了避免上述問題的產(chǎn)生后室,應(yīng)該將IUserDao中的T1和T2職責(zé)分開,單獨放在不同的接口中混狠,分別實現(xiàn)其職責(zé)岸霹,這樣兩者修改時,并不會接觸到另一個職責(zé)的代碼将饺,從而徹底消除影響贡避。
所以上述代碼重新拆分:
User行為接口 IUserBiz:
public interface IUserBiz {
boolean updateUserPassword(String Password);
boolean deleteUser(User user);
}
User屬性接口 IUserBo:
public interface IUserBo {
int serUserName(String UserName);
String getUserNameById(String UserId);
int setUserPassword(String Password);
String getUserPasswordById(String UserId);
}
當(dāng)User的屬性職責(zé)(IUserBo)發(fā)生改變時,并不會影響到行為職責(zé)(IUserBiz)予弧。
可能有人要問:IUserBo是只有一個原則:User屬性職責(zé)刮吧;IUserBiz是只有一個原則:User行為職責(zé),但是UserDao卻有兩個原則:屬性職責(zé)和行為職責(zé)掖蛤,這樣也是符合單一職責(zé)原則嗎杀捻?
其實這樣想也有道理,但是不要忘了蚓庭,我們是面向接口編程致讥,我們對外公布的是接口,而不是具體的實現(xiàn)類器赞,并且若一定要實現(xiàn)接口和類的單一職責(zé)原則垢袱,那么我們就需要在 IUserBo 和 IUserBiz 與UserDao 上再加一個各自接口的實現(xiàn)類UserBo,UserBiz港柜,然后在UserDao使用組合请契,這樣就完全滿足單一職責(zé)原則的要求。這樣寫帶來的后果是強耦合(組合是一種強耦合的關(guān)系),類的復(fù)雜性提高爽锥,數(shù)量增加涌韩,完全就是為了設(shè)計而設(shè)計。
通過上面的例子救恨,我們來總結(jié)一下單一職責(zé)原則有什么好處:
①類的復(fù)雜性降低贸辈,實現(xiàn)什么原則都有清晰明確的定義;
②可讀性提高肠槽,復(fù)雜性降低擎淤;
③可維護(hù)性提高;
④變更引起的風(fēng)險降低秸仙;
建議:接口一定要做到單一職責(zé)嘴拢,類的設(shè)計盡量做到只有一個原因引起的變化