天天看點

設計原則 - 單一職責原則

概念

  • 定義:不要存在多餘一個導緻類變更的原因
  • 展現:一個類/接口/方法隻負責一項職責
  • 優點:降低類的複雜度、提高類的可讀性,提高系統的可維護性、降低變更引起的風險

編碼

單一職責的展現(類)

執行個體

  • ​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() {

    }
}
類圖如下      
  • 類圖如下
  • 總結:單一職責也就是規定一個類應該隻有一個發生變化的原因

源碼