概念
-
- 定義:不要存在多餘一個導緻類變更的原因
- 展現:一個類/接口/方法隻負責一項職責
- 優點:降低類的複雜度、提高類的可讀性,提高系統的可維護性、降低變更引起的風險
編碼
單一職責的展現(類)
執行個體
-
Bird.java
/**
* @Description 鳥
* @date Dec 6, 2021
* @Version 1.0
*/
public class Bird {
public void mainMoveMode(String birdName) {
if ("鴕鳥".equals(birdName)) {
System.out.println(birdName + "用腳走");
} else {
System.out.println(birdName + "用翅膀飛");
}
}
}
-
-
Test.java
/**
* @Description 測試類
* @date Dec 6, 2021
* @Version 1.0
*/
public class Test {
public static void main(String[] args) {
Bird bird = new Bird();
bird.mainMoveMode("大雁");
bird.mainMoveMode("鴕鳥");
}
}
-
- 輸出
大雁用翅膀飛
鴕鳥用腳走
-
- 不難看出上述代碼可維護性較差
改進
-
-
FlyBird.java
/**
* @Description 飛的鳥類
* @date Dec 6, 2021
* @Version 1.0
*/
public class FlyBird {
public void mainMoveMode(String birdName) {
System.out.println(birdName + "用翅膀飛");
}
}
-
-
WalkBird.java
/**
* @Description 走的鳥類
* @date Dec 6, 2021
* @Version 1.0
*/
public class WalkBird {
public void mainMoveMode(String birdName) {
System.out.println(birdName + "用腳走");
}
}
Test.java
/**
* @Description 單一原則測試類
* @date Dec 6, 2021
* @Version 1.0
*/
public class Test {
public static void main(String[] args) {
FlyBird flyBird = new FlyBird();
flyBird.mainMoveMode("大雁");
WalkBird walkBird = new WalkBird();
walkBird.mainMoveMode("鴕鳥");
}
}
-
- 輸出
大雁用翅膀飛
鴕鳥用腳走
-
- 把一個類進行拆分,使每個類的職責變單一,不至于修改時引入新問題
單一職責的展現(接口)
執行個體
-
-
ICourse.java
/**
* @Description 課程
* @date Dec 6, 2021
* @Version 1.0
*/
public interface ICourse {
/**
* 擷取課程名稱
*/
String getCourseName();
/**
* 擷取課程視訊
*/
byte[] getCourseVideo();
/**
* 學習課程
*/
void studyCourse();
/**
* 退課
*/
void refundCourse();
}
-
-
接口職責分為擷取課程資訊與管理課程,兩個職責存在影響ICourse
改進
-
-
ICourseManager.java
/**
* @Description 課程管理
* @date Dec 6, 2021
* @Version 1.0
*/
public interface ICourseManager {
/**
* 學習課程
*/
void studyCourse();
/**
* 退課
*/
void refundCourse();
}
-
-
ICourseContent.java
/**
* @Description 課程内容
* @date Dec 6, 2021
* @Version 1.0
*/
public interface ICourseContent {
/**
* 擷取課程名稱
*/
String getCourseName();
/**
* 擷取課程視訊
*/
byte[] getCourseVideo();
}
-
-
CourseImpl.java
/**
* @Description 課程實作類
* @date Dec 6, 2021
* @Version 1.0
*/
public class CourseImpl implements ICourseContent, ICourseManager{
@Override
public String getCourseName() {
return null;
}
@Override
public byte[] getCourseVideo() {
return new byte[0];
}
@Override
public void studyCourse() {
}
@Override
public void refundCourse() {
}
}
類圖如下
-
- 類圖如下
-
- 總結:單一職責也就是規定一個類應該隻有一個發生變化的原因