設計模式(Design Patterns)的簡單講解

来源:https://www.cnblogs.com/ygsworld/archive/2019/04/03/10647954.html
-Advertisement-
Play Games

模式的誕生與定義 -Context(模式可適用的前提條件)-Theme或Problem(在特定條件下要解決的目標問題)-Solution(對目標問題求解過程中各種物理關係的記述) 設計模式的分類 Gof設計模式 創建型模式(關註對象的創建過程,對類的實例化過程進行抽象,描述如何將對象的創建和使用分離 ...


  • 模式的誕生與定義
  1. 模式(Pattern)起源於建築業而非軟體業(小本本記下來~~)
  2. 模式之父--美國加利佛尼亞大學環境結構中心研究所所長Christopher Alexander博士;
  3. 模式 :

    -Context(模式可適用的前提條件)
    -Theme或Problem(在特定條件下要解決的目標問題)
    -Solution(對目標問題求解過程中各種物理關係的記述)

  4. 模式是在特定環境下人們解決某類重覆出現問題的一套成功有效的解決方案。(簡單來說就是為了減少工作量)。
  5. 程式設計的最大的特點:  變化   因為環境、設備、用戶的需求等原因,  導致程式經常發生變化
  6. 基本結構
  7. 設計模式的定義:一套被反覆使用的,多數人知曉的,經過分類遍目的、代碼設計經驗的總結,使用設計模式是為了可重覆使用代碼,讓代碼更容易被他人理解並且提高代碼的可靠性(目的)。設計模式是一種對軟體系統中不斷重覆出現的設計問題的解決方案進行文檔化的技術,也是一種共用專家設計經驗的技術。
  8. 基本要素 :模式名稱(Pattern Name)、問題(Problem) 、解決方案(Solution)、效果(Consequences)
  • 設計模式的分類
  1. 根據目的(模式是用來做什麼的):可分為創建型(Creational),結構型(Structural)行為型(Behavioral)三類
  2. 根據範圍,即模式主要是處理類之間的關係還是處理對象之間的關係,可分為類模式對象模式兩種:
    1. 類模式處理類和子類之間的關係,這些關係通過繼承建立,在編譯時刻就被確定下來,是一種靜態關係
    2. 對象模式處理對象間的關係,這些關係在運行時變化,更具動態性
  • GoF設計模式
  1.   “四人組(Gang of Four,GoF,分別是Erich Gamma, Richard Helm, Ralph Johnson和John Vlissides)”於1994年歸納發表了23種在軟體開發中使用頻率較高的設計模式,旨在用模式來統一溝通面向對象方法在分析、設計和實現間的鴻溝。
  2. 創建型模式(關註對象的創建過程,對類的實例化過程進行抽象,描述如何將對象的創建和使用分離)
    抽象工廠模式(Abstract Factory) ★★★★★
    建造者模式(Builder) ★★☆☆☆
    工廠方法模式(Factory Method) ★★★★★(GoF 之外:簡單工廠模式)
    原型模式(Prototype) ★★★☆☆
    單例模式(Singleton) ★★★★☆

  3. 結構型模式(關註如何將現有類或對象組織在一起形成更加強大的結構)
    適配器模式(Adapter) ★★★★☆
    橋接模式(Bridge) ★★★☆☆
    組合模式(Composite) ★★★★☆
    裝飾模式(Decorator) ★★★☆☆
    外觀模式(Facade) ★★★★★
    享元模式(Flyweight) ★☆☆☆☆
    代理模式(Proxy) ★★★★☆

  4. 行為型模式(關註系統中對象間的交互,研究系統在運行時對象之間的相互通信與協作進一步明確對象的職責)
    職責鏈模式(Chain of Responsibility) ★★☆☆☆
    命令模式(Command) ★★★★☆
    解釋器模式(Interpreter) ★☆☆☆☆
    迭代器模式(Iterator) ★★★★★
    中介者模式(Mediator) ★★☆☆☆
    備忘錄模式(Memento) ★★☆☆☆
    觀察者模式(Observer) ★★★★★
    狀態模式(State) ★★★☆☆
    策略模式(Strategy) ★★★★☆
    模板方法模式(Template Method) ★★★☆☆
    訪問者模式(Visitor) ★☆☆☆☆

  • 常用面向對象設計的原則
  1. 單一職責原則(Single Responsibility Principle, SRP)| ★★★★☆ : 一個對象應該只包含單一的職責,並且該職責被完整地封裝在一個類中 
    1. 另一種定義方式:就一個類而言,應該僅有一個引起它變化的原因。簡單而言,就是一個類如果職責越多,那麼它被覆用的可能性就越低。即這個類中一個職責變化,可能會影響到其他的職責的運作。因此,單一職責原則就是實現高內聚,低耦合,將一個類的職責降低到最小,即類的數目很多,類中職責很少,因而類被覆用的可能性被提高。
  2. 開閉原則(Open-Closed Principle,OCP) | ★★★★★ : 軟體實體應當對擴展開放,對修改關閉
    1. 開閉原則是復用設計的第一塊基石。在軟體實體中應在儘量不修改原有代碼的情況下進行擴展
  3. 里氏代換原則(Liskov Substitution Principle,LSP)| ★★★★★ : 所有引用基類的地方必須能透明地使用其子類的對象 
    1. 在軟體中將一個基類對象替換成它的子類對象,程式將不會產生任何的錯誤和異常,反之不成立。例如:我喜歡動物,那麼我一定喜歡狗,因為狗是動物的子類,反之不成立
  4. 依賴倒轉原則(Dependence Inversion Principle,DIP) |  ★★★★★ : 高層模塊不應該依賴低層模塊,它們應該依賴抽象。抽象不應該依賴於細節,細節應該依賴於抽象
    1. 要針對介面編程,不針對實現編程。一個具體類應當只實現介面或抽象類中聲明過的方法,而不給出多餘的方法,否在無調用到在子類中增加的新方法
  5. 介面隔離原則(Interface Segregation Principle,ISP)| ★★☆☆☆ : 客戶端不應該依賴那些它不需要的介面 
    1. 當一個介面太大時,將它分割成一些更細小的介面,使用該介面的客戶端只要知道與之相關的方法即可
  6. 合成復用原則(Composite Reuse Principle,CRP)| ★★★☆☆:優先使用對象組合,而不是繼承來達到復用的目的
    1. 在一個新的對象里通過關聯關係(包括組合和聚合關係)來使用一些已有的對象,使之成為新對象的一部分,新對象通過委派調用已有對象的方法達到復用功能的目的
  7. 迪米特法則(Law of Demeter,LoD)| ★★★☆☆ : 每一個軟體單位對其他的單位都只有最少的知識,而且局限於那些與本單位密切相關的軟體單位 
    1. 又稱最少知識原則,一個軟體實體應儘可能少地與其他類發生相互作用
  • 設計模式的優點

  1.   融合了眾多專家的經驗,並以一種標準的形式供廣大開發人員所用
  2.   提供了一套通用的設計辭彙和一種通用的語言,以方便開發人員之間進行溝通和交流,使得設計方案更加通俗易懂
  3.   讓人們可以更加簡單方便地復用成功的設計和體繫結構
  4.   使得設計方案更加靈活,且易於修改
  5.   將提高軟體系統的開發效率和軟體質量,且在一定程度上節約設計成本
  6.   有助於初學者更深入地理解面向對象思想,方便閱讀和學習現有類庫與其他系統中的源代碼,還可以提高軟體的設計水平和代碼質量
  • 設計模式的缺點
  1.   要說缺點的話,每一種都有它適用的地方和不適用之處,若使用不當,缺點往往會暴露的很明顯。因此,學習到位,理解透徹,運用的多了,自然懂得如何揚長避短了,因而模式的缺點就儘可能的最小化了

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

-Advertisement-
Play Games
更多相關文章
  • 有如下代碼要實現換膚功能 這裡通過一個下拉框應用不用主題 首先我們把主題變數抽取出來 這裡包含三個主題red,gredd,blue,每個主題內的font-color變數對應不同的值, 然後我們寫一個主題化的mixin,包括一個themed函數 這段代碼的功能主要是對需要主體化的地方,對樣式根據不同主 ...
  • layui table動態表頭 改變表格頭部 重新載入表格 ...
  • 最近有個需求,是用vue做的頁面,其中嵌入了一個tinymce編輯器,編輯器設置了自動調整高度,也就是說編輯器中內容越多,高度就會自動撐高 我們需要再頁面最下方放一個保存按鈕,保存按鈕必須固定在屏幕下方,本來想用position:fixed這種簡單方法,但是業務比較特殊,不能這麼用,無奈只能用pos ...
  • 前言 鎖,顧名思義就是鎖住一些資源,當只有我們拿到鑰匙的時候,才能操作鎖住的資源。在我們的Java,資料庫,還有一些分散式的環境中,總是充斥著各種各樣的鎖讓人頭疼,例如“公平鎖”、“自旋鎖”、“讀寫鎖”、“分散式鎖”等等。 其實真實的情況是,鎖並沒有那麼多,很多概念只是從不同的功能特性,設計,以及鎖 ...
  • 一般情況下,在我們做訪問許可權管理的時候,會把用戶的正確登錄後的基本信息保存在Session中,以後用戶每次請求頁面或介面數據的時候,拿到 Session中存儲的用戶基本信息,查看比較他有沒有登錄和能否訪問當前頁面。 Session的原理,也就是在伺服器端生成一個SessionID對應了存儲的用戶數據 ...
  • 定義 提供了一個統一的介面,用來訪問子系統中一群介面 適用場景 詳解 外觀模式,主要理解外觀。通俗一點可以認為這個模式是將子系統封裝到一起,提供給應用的層面就提供一個方法。不直接由應用層直接訪問子系統。 下麵我們看看ibatis的源碼來具體理解外觀模式。 上述代碼其實是完成一個創建MetaObjec ...
  • 簡單工廠模式概述 簡單工廠模式的結構與實現 結構: 實現 1 abstract class Product 2 { 3 public void MethName() 4 { 5 //公共方法的實現 6 } 7 public abstract void MethodDiff(); 8 //聲明抽象業務 ...
  • 定義: 指原型實例指定創建對象的種類,並且通過拷貝這些原型創建新的對象。不需要知道任何創建的細節,不調用構造函數適用場景: 詳解: 接下來我們分下麵幾部分講解: 1.原型模式的核心 其實很簡單,就是實現Cloneable介面,然後重寫clone()方法。上面我們已經說過 ,當你在上面的適用場景中的時 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...