?單一職責(zé)(Simple Responsibility Pinciple,SRP)是指不要存在多于一個(gè)導(dǎo)致類變更的原因。假設(shè)我們有一個(gè)類負(fù)責(zé)兩個(gè)職責(zé),一旦需求發(fā)生變更,修改其中一個(gè)職責(zé)的業(yè)務(wù)邏輯代碼時(shí),有可能導(dǎo)致另一個(gè)職責(zé)的功能發(fā)生故障。這樣一來,這個(gè)類就存在兩個(gè)導(dǎo)致類變更的原因。
?如何去解決這個(gè)問題呢?很簡(jiǎn)單,將兩個(gè)職責(zé)用兩個(gè)類來實(shí)現(xiàn),進(jìn)行解耦。后期需求變更和維護(hù)互不影響。這樣的設(shè)計(jì),可以降低類的復(fù)雜度,提高類的可讀性,提高系統(tǒng)的可維護(hù)性,降低代碼變更引起的風(fēng)險(xiǎn)。
?總而言之,就是盡可能的讓一個(gè)類,接口或者方法只負(fù)責(zé)一項(xiàng)職責(zé)。
?來看一段代碼幫助理解,還是拿書舉例。現(xiàn)在這些書,成了電子書。電子書分免費(fèi)書和付費(fèi)書。免費(fèi)書可以任意觀看,付費(fèi)書僅限VIP觀看,功能職責(zé)不一樣。先創(chuàng)建一個(gè)Book類:
/**
* @Author: zhouzhen
* @email: zhouzhen0517@foxmail.com
* @Description
* @Date: Create in 12:39 2020/4/9
*/
public class Book {
public void read(String bookName) {
if("免費(fèi)書".equals(bookName)) {
System.out.println("可以任意觀看");
} else {
System.out.println("僅限VIP觀看");
}
}
}
來看一下調(diào)用代碼
public static void main(String[] args) {
Book book = new Book();
book.read("免費(fèi)書");
book.read("付費(fèi)書");
}
?從上面的代碼看,Book類承擔(dān)了兩種處理邏輯。假如現(xiàn)在要對(duì)電子書進(jìn)行加密,免費(fèi)書和付費(fèi)書的加密邏輯不一樣,必須修改代碼。而修改代碼勢(shì)必會(huì)相互影響,容易帶來不可控的風(fēng)險(xiǎn)。現(xiàn)在我們來對(duì)職責(zé)進(jìn)行解耦,來看代碼,分別創(chuàng)建兩個(gè)類:FreeBook和PayBook。
FreeBook的代碼如下:
/**
* @Author: zhouzhen
* @email: zhouzhen0517@foxmail.com
* @Description
* @Date: Create in 13:41 2020/4/10
*/
public class FreeBook {
public void read(String bookName) {
System.out.println(bookName + "可以任意觀看");
}
}
PayBook的代碼如下:
/**
* @Author: zhouzhen
* @email: zhouzhen0517@foxmail.com
* @Description
* @Date: Create in 13:41 2020/4/10
*/
public class PayBook {
public void read(String bookName) {
System.out.println(bookName + "僅限VIP觀看");
}
}
調(diào)用代碼如下:
public static void main(String[] args) {
FreeBook freeBook = new FreeBook();
PayBook payBook = new PayBook();
freeBook.read("免費(fèi)書");
payBook.read("付費(fèi)書");
}
?修改之后,各個(gè)類負(fù)責(zé)各自的職責(zé),開發(fā)起來簡(jiǎn)單,維護(hù)起來也容易。我們?cè)趯?shí)際開發(fā)中會(huì)有項(xiàng)目依賴,組合,聚合這些關(guān)系,還有項(xiàng)目的規(guī)模,周期,技術(shù)人員的水平,對(duì)進(jìn)度的把控。出于各方面的妥協(xié),很多類的設(shè)計(jì)都不符合單一職責(zé)原則。但是,我們?cè)诰帉懘a的過程中,還是要盡可能的讓接口和方法保持單一職責(zé),對(duì)項(xiàng)目的后期維護(hù)是有很大幫助的。
文章參考
《Spring5核心原理》〔中〕譚勇德(Tom)