設計模式和七大原則概述及單一職責原則詳解

来源:https://www.cnblogs.com/changming06/archive/2023/08/21/changming06_01.html
-Advertisement-
Play Games

本文閱讀nacos-2.0.2的config源碼,編寫示例,分析推送配置、監聽配置的原理。 # 客戶端 ## 創建NacosConfigService對象 ```java Properties properties = new Properties(); properties.setProperty ...


設計模式的目的

編寫軟體過程中,程式員面臨著來自,耦合性,內聚性以及可維護性,擴展性,重用性等方面的挑戰。設計模式是為了讓程式,具有更好的

  • 1.代碼重用性(相同代碼,不用重覆編寫)
  • 2.可讀性(編程規範性,便於其他程式員的閱讀和理解)
  • 3.可擴展性(當需要增加新的功能時,非常的方便)
  • 4.可靠性(當我們增加新的功能後,對原有的功能沒有影響)
  • 5.使程式呈現高內聚,低耦合的特性
    設計模式(design pattern)包含了面向對象的精髓,"懂了設計模式,你就懂了面向對象分析和設計的精要"。學習設計模式,更多的是學是一種設計和分析的思想。

七大原則

設計模式的原則,其實就是程式員在編程時,應當遵守的原則,也是各種設計模式的基礎(即設計模式設計的依據)。
​ 設計模式常用的七大原則有:單一職責原則,介面隔離原則,依賴倒轉原則,里氏替換原則,開閉原則,迪米特法則,合成復用原則。

單一職責原則

介紹

對類來說,即一個類,應該只負責一項職責,如果類A負責兩個不同的職責,職責1和職責2。當職責1發生改變的時候,就可能會影響到職責2,所以,可以將類A分成A1,A2兩個類。

案例1
/**
 * 這些案例,只是為了講解具體的原則和設計模式設計的,不要在意其實用性
 * @author 長名06
 * 單一職責原則 案例1
 * 案例1 問題分析
 * 存在一個類,負責多項職責,即可能有公路上跑火車的情況出現
 */
public class SingResponsibility1 {
    public static void main(String[] args) {
        Vehicle vehicle = new Vehicle();
        vehicle.run("汽車");
        vehicle.run("自行車");
        vehicle.run("火車");
    }
}

class Vehicle{
    public void run(String vehicle){
        System.out.println(vehicle + "在公路上運行");
    }
}

案例2

/**
 * @author 長名06
 * 單一職責原則 案例2
 * 分析,此案例確實完美依照了單一職責原則,但是導致的問題是
 * 需要額外創建三個類,消耗大
 */
public class SingResponsibility2 {
    public static void main(String[] args) {
        RoadVehicle vehicle = new RoadVehicle();
        vehicle.run("汽車");
        AirVehicle airVehicle = new AirVehicle();
        airVehicle.run("飛機");
        WaterVehicle waterVehicle = new WaterVehicle();
        waterVehicle.run("輪船");
    }
}

class RoadVehicle {
    public void run(String vehicle) {
        System.out.println(vehicle + "在公路上運行");
    }
}

class AirVehicle {
    public void run(String vehicle) {
        System.out.println(vehicle + "在天空中運行");
    }
}

class WaterVehicle {
    public void run(String vehicle) {
        System.out.println(vehicle + "在水中運行");
    }
}
/**
 * @author 長名06
 * 單一職責原則 案例3
 * 分析 此案例實現,雖一定程度上違反了單一職責原則,但是
 *  相比於案例2 減少了 類的創建,也就是說在類的方法級別上
 *  遵守了單一職責原則
 */
public class SingResponsibility3 {
    public static void main(String[] args) {
        Vehicle2 vehicle2 = new Vehicle2();
        vehicle2.runInRoad("汽車");
        vehicle2.runInAir("飛機");
        vehicle2.runInWater("輪船");
    }
}

class Vehicle2{
    public void runInRoad(String vehicle){
        System.out.println(vehicle + "在公路上運行");
    }

    public void runInAir(String vehicle){
        System.out.println(vehicle + "在天空中運行");
    }

    public void runInWater(String vehicle){
        System.out.println(vehicle + "在水上運行");
    }
}

分析和總結

  • 1.降低類的複雜度,一個類只負責維持一項職責;
  • 2.提高類的可讀性,可維護性;
  • 3.降低類變更可能會引起的風險;
  • 4.通常情況下,我們應當遵守單一職責原則,只有邏輯非常簡單,才可以在代碼級別違反單一職責原則;只有方法很少,才能在方法上保持單一原則。

只是為了記錄,自己的學習歷程,且本人水平有限,不對之處,請指正。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 從研發的角度來看如果系統上下文清晰、應用架構設計簡單、應用拆分合理應該稱之為架構合理。基於以上的定義可以從以下三個方面來梳理評估: ...
  • ### 歡迎訪問我的GitHub > 這裡分類和彙總了欣宸的全部原創(含配套源碼):[https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) ### 本篇概覽 - 前文[《Docker下elasticse ...
  • ## 面向對象三要素 封裝:顧名思義,將函數或變數集中定義在類中,而非散亂分佈。 繼承:擴展類的功能。 多態:在擴展類的功能的基礎之上,實現其內部方法的多樣性。 ### 多態的本質 針對某個類型的方法調用,其真正執行的方法取決於運行時期實際類型的方法。 ```java package Project ...
  • 之前用的python2.7+robotframework進行的自動化測試,python3的還沒嘗試,今天嘗試了下,搭建環境的時候也是各種報錯,搞了幾小時才搞好了。 一、python安裝 下載python然後安裝,地址:https://www.python.org/,安裝時勾選添加到環境變數,安裝後c ...
  • ## 一、前言 - 還在為排查Java程式線上問題頭痛嗎,看我們用阿裡開源的診斷神器 Arthas 來幫您 - 本文開篇主要介紹 阿裡開源的診斷神器Arthas 3.7.0版本,watch、jad、classloader 命令,以 Debian 11、openjdk 11 為例 ## 二、Artha ...
  • ## 題目描述 給你兩個 非空 的鏈表,表示兩個非負的整數。它們每位數字都是按照 逆序 的方式存儲的,並且每個節點只能存儲 一位 數字。請你將兩個數相加,並以相同形式返回一個表示和的鏈表。你可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。 ## 例子 > 輸入:l1 = [2,4,3], l ...
  • 虛擬機類載入的時機和過程 一、類載入的時機 類從被載入到虛擬機記憶體中開始,到卸載出記憶體為止,它的整個生命周期包括:載入(Loading)、驗證(Verification)、準備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸載( ...
  • - Future :獲取非同步返回的結果需要使用輪詢的方式,消耗cup ```java ExecutorService executorService = Executors.newFixedThreadPool(10); Future future = executorService.submit( ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...