設計模式六大原則:介面隔離原則

来源:https://www.cnblogs.com/az4215/archive/2019/09/07/11481076.html
-Advertisement-
Play Games

介面隔離原則(Interface Segregation Principle): 1、客戶端不應依賴它不需要的介面 2、類間的依賴關係應該建立在最小的介面上 其實通俗來理解就是,不要在一個介面裡面放很多的方法,這樣會顯得這個類很臃腫。介面應該儘量細化,一個介面對應一個功能模塊,同時介面裡面的方法應該 ...


目錄: 

  設計模式六大原則:單一職責原則

  設計模式六大原則:介面隔離原則 

  設計模式六大原則:依賴倒置原則

  設計模式六大原則:里氏替換原則

  設計模式六大原則:迪米特法則

  設計模式六大原則:開閉原則

介面隔離原則(Interface Segregation Principle):

  1、客戶端不應依賴它不需要的介面

  2、類間的依賴關係應該建立在最小的介面上

  其實通俗來理解就是,不要在一個介面裡面放很多的方法,這樣會顯得這個類很臃腫。介面應該儘量細化,一個介面對應一個功能模塊,同時介面裡面的方法應該儘可能的少,使介面更加靈活輕便。或許有的人認為介面隔離原則和單一職責原則很像,但兩個原則還是存在著明顯的區別。單一職責原則是在業務邏輯上的劃分,註重的是職責。介面隔離原則是基於介面設計考慮。例如一個介面的職責包含10個方法,這10個方法都放在同一介面中,並且提供給多個模塊調用,但不同模塊需要依賴的方法是不一樣的,這時模塊為了實現自己的功能就不得不實現一些對其沒有意義的方法,這樣的設計是不符合介面隔離原則的。介面隔離原則要求"儘量使用多個專門的介面"專門提供給不同的模塊。

經典案例:

  類A通過Interface1依賴類B,1,2,3;類B通過Interface1依賴D,1,4,5。

  

  1 internal class Program
  2 {
  3     private static void Main(string[] args)
  4     {
  5         A a = new A();
  6         B b = new B();
  7         a.use1(b);
  8         a.use2(b);
  9         a.use3(b);
 10     }
 11 }
 12 
 13 internal interface interface1
 14 {
 15     void operation1();
 16 
 17     void operation2();
 18 
 19     void operation3();
 20 
 21     void operation4();
 22 
 23     void operation5();
 24 }
 25 
 26 internal class B : interface1
 27 {
 28     public void operation1()
 29         {
 30             Console.WriteLine($"B->{nameof(operation1)}");
 31         }
 32 
 33     public void operation2()
 34         {
 35             Console.WriteLine($"B->{nameof(operation2)}");
 36         }
 37 
 38     public void operation3()
 39         {
 40             Console.WriteLine($"B->{nameof(operation3)}");
 41         }
 42 
 43     public void operation4()
 44         {
 45             Console.WriteLine($"B->{nameof(operation4)}");
 46         }
 47 
 48     public void operation5()
 49         {
 50             Console.WriteLine($"B->{nameof(operation5)}");
 51         }
 52 }
 53 
 54 internal class D : interface1
 55 {
 56     public void operation1()
 57         {
 58             Console.WriteLine($"D->{nameof(operation1)}");
 59         }
 60 
 61     public void operation2()
 62         {
 63             Console.WriteLine($"D->{nameof(operation2)}");
 64         }
 65 
 66     public void operation3()
 67         {
 68             Console.WriteLine($"D->{nameof(operation3)}");
 69         }
 70 
 71     public void operation4()
 72         {
 73             Console.WriteLine($"D->{nameof(operation4)}");
 74         }
 75 
 76     public void operation5()
 77         {
 78             Console.WriteLine($"D->{nameof(operation5)}");
 79         }
 80 }
 81 
 82 internal class A
 83 {
 84     public void use1(interface1 interface1)
 85         {
 86             interface1.operation1();
 87         }
 88 
 89     public void use2(interface1 interface1)
 90         {
 91             interface1.operation2();
 92         }
 93 
 94     public void use3(interface1 interface1)
 95         {
 96             interface1.operation3();
 97         }
 98 }
 99 
100 internal class C
101 {
102     public void use1(interface1 interface1)
103         {
104             interface1.operation1();
105         }
106 
107     public void use4(interface1 interface1)
108         {
109             interface1.operation4();
110         }
111 
112     public void use5(interface1 interface1)
113         {
114             interface1.operation5();
115         }
116 }
view code

  顯然,上述設計不符合介面隔離原則。

  

  1 internal class Program
  2 {
  3     private static void Main(string[] args)
  4     {
  5         A a = new A();
  6         B b = new B();
  7         a.use1(b);
  8         a.use2(b);
  9         a.use3(b);
 10     }
 11 }
 12 
 13 internal interface interface1
 14 {
 15     void operation1();
 16 }
 17 
 18 internal interface interface2
 19 {
 20     void operation2();
 21 
 22     void operation3();
 23 }
 24 
 25 internal interface interface3
 26 {
 27     void operation4();
 28 
 29     void operation5();
 30 }
 31 
 32 internal class B : interface1, interface2
 33 {
 34     public void operation1()
 35         {
 36             Console.WriteLine($"B->{nameof(operation1)}");
 37         }
 38 
 39     public void operation2()
 40         {
 41             Console.WriteLine($"B->{nameof(operation2)}");
 42         }
 43 
 44     public void operation3()
 45         {
 46             Console.WriteLine($"B->{nameof(operation3)}");
 47         }
 48 }
 49 
 50 internal class D : interface1, interface3
 51 {
 52     public void operation1()
 53         {
 54             Console.WriteLine($"D->{nameof(operation1)}");
 55         }
 56 
 57     public void operation4()
 58         {
 59             Console.WriteLine($"D->{nameof(operation4)}");
 60         }
 61 
 62     public void operation5()
 63         {
 64             Console.WriteLine($"D->{nameof(operation5)}");
 65         }
 66 }
 67 
 68 internal class A
 69 {
 70     public void use1(interface1 interface1)
 71     {
 72         interface1.operation1();
 73     }
 74 
 75     public void use2(interface2 interface2)
 76     {
 77         interface2.operation2();
 78     }
 79 
 80     public void use3(interface2 interface2)
 81     {
 82         interface2.operation3();
 83     }
 84 }
 85 
 86 internal class C
 87 {
 88     public void use1(interface1 interface1)
 89     {
 90         interface1.operation1();
 91     }
 92 
 93     public void use4(interface3 interface3)
 94     {
 95         interface3.operation4();
 96     }
 97 
 98     public void use5(interface3 interface3)
 99     {
100         interface3.operation5();
101     }
102 }
view code
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在javascript中常見的瀏覽器相容問題,以及解決方式。 在前端工作當中我們遵循這樣的原則:漸進增強和優雅降級 漸進增強(progressive enhancement): 針對低版本瀏覽器進行構建頁面,保證最基本的功能,然後再針對高級瀏覽器進行效果、交互等改進和追加功能達到更好的用戶體驗 優雅 ...
  • ES6
    1.什麼是ES6? ES的全稱是ECMAScript,ES6就是ES2016之後的一個泛稱,是由ECMA國際標準化組織制定的一項腳本語言的標準化規範。 2.ES6新增語法 1. let ES6中新增的用於聲明變數的關鍵字 特點: 1.let聲明的變數具有塊級作用域的特點,只在所處的塊級作用域有效 i ...
  • 1. 效果圖展示 2. 工程目錄結構 註意: webapp下的resources目錄放置easyui和js(jQuery文件是另外的) 3. 代碼 index.jsp springmvc.xml配置靜態資源 註意: 1. EasyUI和JQuery文件是放在webapp/resources目錄下的, ...
  • JS是以事件驅動為核心的一門語言。 事件的三要素:事件源、事件、事件驅動程式。 例如: 常見的事件如下: DOM:文檔對象模型。DOM 為文檔提供了結構化表示,並定義瞭如何通過腳本來訪問文檔結構。目的其實就是為了能讓js操作html元素而制定的一個規範。 DOM就是由節點組成的。 解析過程 HTML ...
  • 處理方法:數組改變用push ...
  • 一、let和const 1、let與var的區別 不存在變數提升 塊級作用域 不允許重覆聲明 2、const常量 const與let一樣,唯一區別在於聲明的常量不能被修改 二、解構賦值 es6按照一定模式,從數組和對象中提取值,對變數進行賦值,被稱為解構 1、數組的解構 + "模式匹配",只要等號兩 ...
  • 摘要: 求職還是需要認真準備的。 原文: "超實用技術面試手冊,從工作申請、面試考題再到優勢談判,GitHub獲30000星" 作者:量子位 技術人員求職面試,單刷leetcode上的大廠題庫可能還不夠。 簡歷怎麼寫才能吸引HR的眼光,可能會被技術老大問到哪些常見問題,拿到Offer之後怎樣才能讓自 ...
  • 使用電腦逛淘寶,京東等商城時,將滑鼠移入圖片中,圖片會放大,之前一直在想這種是怎麼實現的,前兩天剛寫出來,純js實現的,無任何工具庫。下麵先來看下思路吧! 剛學js的時候可能對於佈局不是很重要,但學到面向對象編程後,佈局就變得很重要了,有時候佈局會影響到整體效果;先來看下佈局吧! 佈局就搞定了,比較 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...