主頁 > 軟體設計 > 設計模式 - 概述

設計模式 - 概述

2022-11-19 07:27:00 軟體設計

設計模式

      設計模式這一概念最早起源于建筑領域,是Christopher Alexander在其著作《建筑模式語言》中首次提及, 而后經過歲月的洗禮與沉淀,由我們的前輩們引入到軟體設計領域, 其作為一種設計問題的思想,經過眾多軟體開發前輩們經過反復的實踐和踩坑之后得到的經驗,逐漸趨于成熟和完善,應用這種經驗可以試我們的代碼更加規范, 重用度更高,增加了代碼的可讀性,可靠性和魯棒性 ,便于更好的開發和維護,學習這些模式也可以有助于開發經驗不足的開發人員用一種跟簡單快捷的方式來設計軟體,其核心偏向與設計問題,這是與演算法存在不同的地方, 演算法核心是解決問題,

設計模式可歸納為創建型,行為型和結構型設計模式

下面列出了常見的設計模式以及所屬分類,后面會持續更新相關模式的詳細文章

類別 描述 包含設計模式
創建型 這種模式提供了一種在創建物件的同時隱藏了物件創建邏輯的方式, 而不是通過簡單的new運算子直接實體化物件,使程式在判斷針對某個指定的實體需要創建哪些物件更加靈活

簡單工廠模式(Simple Factory Pattern)

工廠模式(Factory Pattern)

抽象工廠模式(Abstract Factory Pattern)

單例模式(Single Factory Pattern)

建造者模式(Builder Pattern)

原型模式(Prototype Pattern)

行為型 這種模式是為了滿足特定行為而設計的解決方案,關注類和物件的組合

配接器模式(Adaptor Pattern)

橋接模式(Bridge Pattern)

過濾器模式(Filter Pattern)

組合模式(Composite Pattern)

裝飾器模式(Decorator Pattern)

外觀模式(Facade Pattern)

享元模式(Flyweight Pattern)

代理模式(Proxy Pattern)

結構型 這種模式是從結構上解決程式的耦合問題,描述了類和物件之間的通信

責任鏈模式(Chain of responsibility Pattern)

命令模式(Command Pattern)

解釋器模式(Interpreter Pattern)

迭代器模式(Iterator Pattern)

中介者模式(Mediator Pattern)

備忘錄模式(Memento Pattern)

觀察者模式(Observer Pattern)

狀態模式(State Pattern)

空物件模式(Null Object Pattern)

策略模式(Strategy Pattern)

模板模式(Template Pattern)

訪問者模式(Visitor Pattern)

設計模式之六大原則

名稱 描述
單一職責原則 Single Responsibility Principle, 簡稱SRP.  每個類應該實作單一職責, 換句話說就是有且僅有一個原因引起類的變更
里氏替換原則

為良好的定義繼承定義了一個規范

1. 子類必須完全實作父類的方法

2. 子類可以有自己的特性

3. 覆寫或實作父類的方法時, 輸入引數可以被放大

4. 覆寫或實作父類的方法時,輸出結果可以被縮小

依賴倒置原則

Dependency Inversion Principle, DIP. 是面向介面編程的設計原則

1. 高層模塊不應依賴低層模塊

2. 抽象不應該依賴細節, 細節應該依賴抽象. 具體表現就是抽象類或介面不應依賴實作類, 實作類應依賴介面或抽象類

三種寫法

1. 建構式依賴

2. 定義抽象方法構造依賴物件

3. 介面宣告依賴物件

介面隔離原則

它所描述的類間的依賴關系應該建立在最小的介面上, 客戶端不應該依賴它不需要的介面

要求介面滿足以下規范

1. 介面盡量小. 介面應盡量細粒度設計, 增加介面靈活性

2. 介面要高內聚. 就是提高介面, 類, 模塊的處理能力. 盡量少的減少對外互動

3. 定制服務.  介面可以為客戶端單獨定制服務. 可以為不同的客戶提供不同的介面. 比如說, 一個介面只想給內部人員使用, 對外部隱藏, 那就需要定制服務了

4. 保持有限的介面設計. 介面設計靈活可能帶來結構的復雜化, 增加開發和維護難度

迪米特法則 Law of Demeter, Lod 也叫最少知識原則. 描述的是一個物件應該對自己需要呼叫的物件類知道的最少. 只需要關心呼叫, 不需要關心實作
開閉原則 廣義的解釋就是對擴展開放, 對修改關閉. 這是一個樂觀的原則, 積極的擁抱變化, 假設變化必然發生, 應盡量通過擴展軟體的行為去實作這些變化, 而不是通過修改已有的代碼來完成變化. 一般是通過新增子類等方式覆寫父類方法來實作擴展

 設計模式存在的六種關系

關系名稱 UML符號標識 描述
泛化關系 帶三角箭頭的實線,箭頭指向父類 屬于類的繼承關系,指明子類如何特化父類的所有特征和行為
依賴關系 帶箭頭的虛線,箭頭指向獨立的類 描述的是類的使用存在依賴關系,也叫使用關系(USE-A),表示兩個活動中一個活動的變更會影響另一個活動,例如一個類用另一個類作為其資料成員,一個類向另一個類發訊息等
實作關系 帶三角箭頭的虛線,箭頭指向介面 描述了類是介面的全部實作
組合關系 帶實心菱形的實線,菱形指向整體,箭頭指向部分 描述的是整體與部分的關系,部分不能離開整體而單獨存在,例如公司和部門,部門不能離開公司而單獨存在,是關聯關系的一種
關聯關系 帶普通箭頭的實線,箭頭指向被關聯者 描述的是兩個類元之間的關系,例如類指向用例,水指向氣候,學生指向課程等
聚合關系  帶空心菱形的實心線,菱形指向整體,箭頭指向部分  描述的整體與部分的關系,部分能離開整體而單獨存在,例如自行車和車座,電腦和顯示幕等

 

強弱順序:泛化 > 實作 > 組合 > 聚合 > 關聯 > 依賴 

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/536146.html

標籤:其他

上一篇:設計模式 - 概述

下一篇:快取一致性探討(雙刪法及其改進方案)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more