《大設》第五篇之開閉原則

来源:http://www.cnblogs.com/liaidai/archive/2016/10/19/5976564.html
-Advertisement-
Play Games

前言 國際慣例,本文寫於本人使用《大話設計模式》一書學習設計模式的路上,適用於初學設計模式的道友交流之用,大神誤入,請留下您寶貴的意見,感激不盡; 開閉原則 定義 軟體實體應當對擴展開放,對修改關閉; 特征 1. 對擴展開放:當需要添加新的功能,或者說擴展功能時,我們不需要修改原來的代碼,只需要添加 ...


前言

  國際慣例,本文寫於本人使用《大話設計模式》一書學習設計模式的路上,適用於初學設計模式的道友交流之用,大神誤入,請留下您寶貴的意見,感激不盡;

開閉原則

定義

軟體實體應當對擴展開放,對修改關閉;

特征

  1. 對擴展開放:當需要添加新的功能,或者說擴展功能時,我們不需要修改原來的代碼,只需要添加新的類就可以滿足需求;

  2. 對修改關閉:對功能進行擴展時,不需要修改原有代碼的源代碼後者二進位代碼(只修改配置文件,並不算違背開閉原則);

理解

  在軟體的整個生命周期中,從需求的變更到系統的升級以及後期的維護,不可避免的要對原有的代碼進行重構,並且需要原有的代碼的測試結果與新的代碼的測試結果的對比,如果直接在原有代碼上修改,那麼就需要對原有代碼進行備份,等到新的代碼修改完成後運行比對,這樣做也未嘗不可,但是如果系統的部署比較複雜,或者說你要修改線上的代碼,這時候就比較困難了,那麼這時候怎麼辦呢?這就需要用到我們這裡所說的開閉原則;
  
  那麼什麼是開閉原則呢?簡單來說就是對修改關閉,對擴展開放,那麼怎麼才能做到對修改關閉,對擴展開放呢?需要做到以下幾點:

1.儘量不修改原來的代碼:除非是修改原來代碼中的錯誤,否則儘量不要去修改原來的代碼,但是也有例外,比如擴展了底層模塊,高層模塊還是需要發生一些變化的,不然低層模塊的擴展就是沒有任何意義的代碼片段;

2.以抽象代替實現:這也是我們一直所說的面向介面編程,當然這裡的抽象並不僅僅是指介面,還可以是抽象類(本人是搞java的,所以特指java,別的語言請選擇性參考);

3.以抽象隔離變化:首先,無論模塊是多麼的“封閉”,都會存在一些無法對之封閉的變化,既然不可能完全封閉,那麼設計人員必須對於其他設計的模塊應該對哪種變化封閉進行選擇,他必須猜測出最有可能發生的變化種類,然後構造抽象來隔離變化,其次,我們並沒有未卜先知的能力,所以在最初編寫代碼時可以假設變化不會發生,但是當變化發生時,我們就需要去創建抽象來隔離以後發生的同類的變化;

4.抽象層設計到整個項目的架構,因此抽象層需要儘量保持穩定,一旦確定就不要輕易修改;

5.避免不合理的抽象:開閉原則需要使用抽象,但是過度的抽象或者說不合理的抽象同樣會帶來很大的問題,因此抽象應該做到合理的抽象;

其他設計原則是實現開閉原則的一種手段:其中單一原則要求做到類的職責單一,里式提花原則要求不能破壞繼承體系,依賴倒置原則要求我們要面向介面編程,介面隔離原則要求做到介面要精簡單一,迪米特法則則是要求做到降低耦合度,如果遵循了前面的五個法則,那麼自然的也就做到了開閉原則,因此說開閉原則是設計原則的總綱(參考文章

優點

  1. 可復用行好:軟體系統完成之後,仍然可以對軟體進行擴展,理想狀態下可以做到無限擴展,通過擴展加入新的功能,十分靈活;
  2. 可維護性好:抽象層是固定的,因此在修改在進行擴展時不需要去考慮原有組件的穩定性,只需要實現或者繼承現有抽象層既可以做到擴展新的功能,這就使變化中的軟體系統具有一定的穩定性和延續性;

參考文章

  1. http://blog.csdn.net/zhengzhb/article/details/7296944
  2. http://blog.csdn.net/lovelion/article/details/7537584
  3. http://www.cnblogs.com/muzongyan/archive/2010/08/05/1793454.html
  4. 百度百科

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

-Advertisement-
Play Games
更多相關文章
  • error: invalid preprocessing directive #difine| 無效的巨集定義處理 巨集定義define 寫成了 difine。 ...
  • 英文文檔: bin(x) Convert an integer number to a binary string. The result is a valid Python expression. If x is not a Python int object, it has to define ...
  • 英文文檔: any(iterable) Return True if any element of the iterable is true. If the iterable is empty, return False. Equivalent to: 說明: 1. 接受一個可迭代器對象為參數,當參 ...
  • 英文文檔: ascii(object) As repr(), return a string containing a printable representation of an object, but escape the non-ASCII characters in the string r ...
  • JSTL和EL的使用 使用JSTL前的準備 想要使用JSTL,首先需要給工程導入JSTL的包(JSTL.jar和standard.jar). JSTL標簽庫 在JSTL中分為以下五個標簽 使用不同的標簽的時候需要在JSP中引入不同的庫 核心標簽(Core): 引入標簽庫 <c:set> <c:set ...
  • OSI 七層模型通過七個層次化的結構模型使不同的系統不同的網路之間實現可靠的通訊,因此其最主要的功能就是幫助不同類型的主機實現數據傳輸 。 完成中繼功能的節點通常稱為中繼系統。在OSI七層模型中,處於不同層的中繼系統具有不同的名稱。 一個設備工作在哪一層,關鍵看它工作時利用哪一層的數據頭部信息。網橋 ...
  • 最近我發現了一個有趣的問題,這個問題的答案乍一看下騙過了我的眼睛。看一下這三個類: package com.ds.test; public class Upper { String upperString; public Upper() { Initializer.initialize(this); ...
  • 20161018問題解析請點擊今日問題下方的“【Java每日一題】20161019”查看 今日問題:上面兩個對int類型數組(集合)的求和操作,性能分析哪個更優?(點擊以下“【Java每日一題】20161019”查看20161018問題解析) 題目原發佈於公眾號、簡書:【Java每日一題】20161 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...