## 一、定義
單一職責原則(Single Responsibility Principle, SRP):一個軟件實體(模塊、類、方法)**只負責一個**
功能領域中的相應職責,或者可以定義為:就一個類而言,應該**只有一個引起它變化**的原因。
單一職責原則是實現**高內聚、低耦合**的指導方針,它是**最簡單但又最難運用**的原則
## 二、優點
1.降低模塊、類或方法的復雜度。
2.提高類可讀性,系統的可維護性。
3.降低變更引起的風險。
## 三、示例
~~~
/**
* 小明同學的周末
*/
public class XiaoMing {
public void activity(String activity){
if("學習".equals(activity)){
System.out.println("小明周末在家學習!");
}else{
System.out.println("小明周末出去運動了!");
}
}
}
~~~
~~~
public class Test {
public static void main(String[] args) {
XiaoMing xm = new XiaoMing();
xm.activity("學習");
System.out.println("------");
xm.activity("運動");
}
}
~~~
~~~
小明周末在家學習!
------
小明周末出去運動了!
~~~
在這個示例中,一個方法包含了兩個職責運動和學習,很明顯兩種職責的業務邏輯是不一樣的,必須要修改代碼。
而修改代碼邏輯勢必會相互影響容易造成不可控的風險。我們對職責進行分離解耦,來看代碼:
~~~
//學習
public void study(String study){
System.out.println("小明周末在家" + study + "!");
}
//運動
public void motion(String motion){
System.out.println("小明周末出去" + motion + "!");
}
~~~
~~~
public class Test {
public static void main(String\[\] args) {
XiaoMing xm = new XiaoMing();
xm.study("學習");
System.out.println("--------------");
xm.motion("運動");
}
}
~~~
~~~
小明周末在家學習!
--------------
小明周末出去運動!
~~~
修改后的代碼由原先的activity()方法解耦成兩個職責單一的方法,每個方法只有一種可能讓它產生變化,
這是方法層面的單一原則,我們在看看類方面。
~~~
public class Study {
//java學習
public void javaStudy(String name){
System.out.println("在家學習" \+ name);
}
//php學習
public void phpStudy(String name){
System.out.println("在家學習" \+ name);
}
//練習吉他
public void guitarStudy(String name){
System.out.println("在家練習" \+ name);
}
//練習唱歌
public void singStudy(String name){
System.out.println("在家練習" \+ name);
}
}
~~~
在上面的示例中我們看到Study類中包含了四個方法,雖然這四個方法都是學習相關的,但是細分的話我們能發現它們的職責還是不那么單一。學習JAVA和PHP,從性質上說它們兩個是知識方面的,而練習吉他和唱歌,更偏向于技能和興趣愛好方面。所以我們需要把它解耦成兩個職責單一的類。
~~~
/**
* Create By Ke Shuiqiang 2020/3/6 15:42
* 知識學習
*/
public class KnowledgeSudy {
//java學習
public void javaStudy(String name){
System.out.println("在家學習" + name);
}
//php學習
public void phpStudy(String name){
System.out.println("在家學習" + name);
}
}
/**
* Create By Ke Shuiqiang 2020/3/6 15:44
* 興趣愛好學習
*/
public class InterestStudy {
//練習吉他
public void guitarStudy(String name){
System.out.println("在家練習" + name);
}
~~~
- 前言
- 第一章 設計七大原則
- 第1節 開閉原則
- 第2節 依賴倒置原則
- 第3節 單一職責原則
- 第4節 接口隔離原則
- 第5節 迪米特法則
- 第6節 里氏替換原則
- 第7節 合成復用原則
- 第二章 簡單工廠模式
- 第1節 使用場景
- 第2節 示例代碼
- 第三章 創建者模式
- 第1節 工廠方法模式
- 第2節 抽象工廠模式
- 第3節 建造者模式
- 第4節 原型模式
- 第5節 單例模式
- 第四章 結構型模式
- 第1節 適配器模式
- 第2節 橋接模式
- 第3節 組合模式
- 第4節 裝飾者模式
- 第5節 外觀模式
- 第6節 享元模式
- 第7節 代理模式
- 第五章 行為模式
- 第1節 責任鏈模式
- 第2節 命令模式
- 第3節 迭代器模式
- 第4節 中介者模式
- 第5節 備忘錄模式
- 第6節 觀察者模式
- 第7節 狀態模式
- 第8節 策略模式
- 第9節 模板方法模式
- 第10節 訪問者模式
- 第11節 解釋器模式