設計模式的七大原則(2) --介面隔離原則

来源:https://www.cnblogs.com/zhxiansheng/archive/2019/07/25/11244991.html
-Advertisement-
Play Games

前言 上一節我們學習了單一職責原則,簡單來說就是各司其職,廚師就專註做好菜,不要跑到前堂做起小二。 但是呢,萬事無一絕對。如果只是小飯店有時候也不是特別嚴格。還是那句話, 原則是死的,人是活的 。 接下來我們來學習介面隔離原則。 基本介紹 客戶端不應該依賴它不需要的介面,即一個類對另一個類的依賴應該 ...


前言

上一節我們學習了單一職責原則,簡單來說就是各司其職,廚師就專註做好菜,不要跑到前堂做起小二。

但是呢,萬事無一絕對。如果只是小飯店有時候也不是特別嚴格。還是那句話,原則是死的,人是活的

接下來我們來學習介面隔離原則。

基本介紹

客戶端不應該依賴它不需要的介面,即一個類對另一個類的依賴應該建立在最小的介面上。

怎麼理解呢?

就是說,一個介面擁有的行為應該儘可能的小。

如果說這個介面定義了很多方法,但是呢,我們實現這個介面的時候並不需要這麼多的方法。那麼你就會發現,除了個別幾個你需要的方法實現了,很多不需要的方法也必須得實現了,造成很多空方法的出現。

這是一種很糟糕的設計,這樣做不僅會強制實現本來不該實現的方法,最嚴重的是會給使用者造成假象,即這個實現類擁有介面中所有的行為,結果調用方法時卻沒收穫到想要的結果。

案例

案例如下:

public interface Car {

    void run();

    void fly();

    void appearance();
}
public class Audi implements Car {
    public static void main(String args[]){
        Audi audi = new Audi();
        audi.run();
        audi.appearance();
        audi.fly();
    }

    @Override
    public void appearance() {
        System.out.println("我奧迪有炫酷的車燈");
    }

    @Override
    public void run() {
        System.out.println("我不光能跑,我還跑的很快");
    }

    @Override
    public void fly() {

    }
}

上訴代碼輸出結果

我不光能跑,我還跑的很快
我奧迪有炫酷的車燈

上訴代碼中的介面Car就沒有遵循最小介面原則。因為這個介面定義了一個並不屬於Car的方法fly()。你在實現這個介面的時候你也必須重寫fly()方法。

但是呢,車並沒有這個功能,所以大部分情況下你會將這個方法重寫了但是裡面是空方法。

首先代碼不簡潔。其次當某個人調用該類方法的時候,就會給使用者造成車會飛的假象。

default關鍵字

上述代碼在JDK1.8版本以後還能能寫成這種形式

public interface Car {

    default void run(){
        System.out.println("我能跑");
    }

    default void fly(){
        System.out.println(("我不能飛"));
    }

    void appearance();
}
public class Audi implements Car {
    public static void main(String args[]){
        Audi audi = new Audi();
        audi.run();         //我不光能跑,我還跑的很快
        audi.appearance();  //我有炫酷的車燈
        audi.fly();         //我不能飛
    }

    @Override
    public void appearance() {
        System.out.println("我有炫酷的車燈");
    }

    @Override
    public void run() {
        System.out.println("我不光能跑,我還跑的很快");
    }
}

在jdk1.8以後提供了default關鍵字,這個關鍵字的出現讓介面能夠有預設的實現方式。

比如Car介面的的run()方法和fly()方法實現了default關鍵字,那麼就能直接在介面當中把這個方法給實現了。

當某個類實現了這個介面的時候,就不需要強制重寫該方法。

有人就會問了,是不是在1.8版本以後就可以不需要遵循最小介面原則了?答案是否定了。

即便你不需要實現這個方法,但是在使用者眼中,就會給使用者造成車會飛的假象。

當然,還是那句話,人是活的,規則是死的。很多時候我們並不是說必須百分百按照這種要求來實現我們的代碼。

當你的代碼嚴格實現該原則的時候發現,導致代碼的可閱讀性,可擴展性降低。甚至邏輯也複雜了很多。那麼就可以按照具體的情況違背這種原則。

總結

介面隔離原則和職責單一原則有共同性。大家可以多思考一下。

還是那句話慢慢的學,一個一個掌握,才更深刻,貪多嚼不爛。

下一篇我們來學習依賴倒轉原則。


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

-Advertisement-
Play Games
更多相關文章
  • 2019年公司註冊好了想要通過互聯網宣傳推廣得到訂單,首先想要瞭解下本地的上海網站建設公司有哪些從中選擇一家價格比較低的公司去做,穹拓小編認為聽別人說哪家專業不如自己親自選擇,通過各種優勢對比後確定下來一家公司去做。可以通過百度或360搜索到一些網路公司,然後觀察他們自己的官網以及案例做的如何,然後 ...
  • 頁面跳轉 : <ion-row *ngFor="let item of aboutData.stockData" [routerLink]="[ '/stock-details']" /* 跳轉頁面*/ [queryParams]="item" /* 傳的參數*/> 新頁面取值: import { ...
  • 做網頁的時候常常會遇到半透明背景色的彈出框,通常回會想要點擊關閉按鈕或者背景色部分關閉彈窗 並且彈窗是背景色的後代 思路: 背景色盒子設置一個class類,通過jq 的點擊事件 獲取事件源對象(就是當前點擊的) 判斷點擊的是否是 背景色盒子 這裡通過類名判斷 $("背景色盒子的類").click(f ...
  • html: <ion-header> <ion-toolbar> <ion-title> 股票 </ion-title> </ion-toolbar> </ion-header> <ion-content> <ion-refresher slot="fixed" (ionRefresh)="doRe ...
  • 工廠模式用於創建對象時,有簡單工廠,工廠方法、抽象工廠。 簡單工廠:由一個工廠對象決定創建哪個實例的對象。簡單工廠適用於創建對象少的場景,客戶端只需要傳入參數,對於如何創建不用關心。 缺點:工廠類職責過重,不易於擴展複雜結構的實例對象,不符合開閉原則。 工廠方法:是指定義一個創建對象的介面,各個不同 ...
  • JVM垃圾回收器原理及使用介紹 垃圾收集基礎 引用計數法(Reference Counting) 標記-清除演算法(Mark-Sweep) 複製演算法(Copying) 標記-壓縮演算法(Mark-Compack) 增量演算法(Incremental Collecting) 分區演算法(partitionin ...
  • Bearer認證 HTTP提供了一套標準的身份驗證框架:伺服器可以用來針對客戶端的請求發送質詢(challenge),客戶端根據質詢提供身份驗證憑證。質詢與應答的工作流程如下:伺服器端向客戶端返回401(Unauthorized,未授權)狀態碼,併在WWW Authenticate頭中添加如何進行驗 ...
  • 前言 Bridge設計模式,將一個複雜類分成可以單獨開發的部分。分成的兩個部分,abstraction,implementation。字面上是抽象和實現,但不同於抽象方法及其實現。下麵摘錄Wiki的兩句話。 decouple an abstraction from its implementatio ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...