設計模式簡單介紹

来源:https://www.cnblogs.com/zzdreamz/archive/2023/01/04/17026001.html
-Advertisement-
Play Games

抽象工廠模式 為什麼要用抽象工廠模式? * 舉個實際應用的例子,一個顯示器電路板廠商,旗下的顯示器電路板種類有非液晶的和液晶的;這個時候,廠商建造兩個工廠,工廠A負責生產非液晶顯示器電路板,工廠B負責生產液晶顯示器電路板;工廠一直就這樣運行著。有一天,總經理髮現,直接生產顯示器的其餘部分也挺掙錢,所 ...


註:所有知識來源於《設計模式:可復用軟體面向對象的基礎》

1 什麼是設計模式

Christopher Alexander說過:“每一個模式描述了一個在我們周圍不斷重覆發生的問題,以及該問題的解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重覆勞動。”
一般而言,一個模式有四個基本要素:
模式名(pattern name) 用一兩個此來描述模式的問題、解決方案和效果。
問題(problem) 描述了應該在何時使用模式,解釋了設計問題和問題存在的前因後果,可能描述了特定的設計問題,也可能描述了導致不靈活設計的類或對象結構,有時候問題部分會包括使用模式必須滿足的一系列先決條件。
解決方案(solution) 描述了設計的組成部分、他們之間的相互關係及各自的職責和協作方式。不描述一個特定而具體的設計或實現,而是提供設計問題的抽象描述和怎樣用一個具有一般意義的元素組合來解決這個問題。
效果(consequence) 描述了模式應用的效果及使用模式應權衡的問題。
設計模式命名、抽象和確定了一個通用設計結構的主要方面,這些設計結構能被用來構造可復用的面向對象設計。設計模式確定了所包含的類和實例,它們的角色、協作方式以及職責分配。每一個設計模式都集中於一個特定的面向對象設計問題或設計要點,描述了什麼時候使用它,在另一些設計約束條件下是否還能使用,以及使用的效果和如何取捨。

2 描述設計模式

使用統一的格式描述設計模式有助於學習、比較和使用設計模式。
模式名和分類 模式名簡潔地描述了模式地本質,分類主要是使用該模式的目的。
意圖 意圖是回答“設計模式是做什麼的?它的基本原理和意圖是什麼?它解決的是什麼樣的特定設計問題?”
別名 模式的其他名稱
動機 用以說明一個設計問題以及如何用模式中的類、對象來解決該問題的特定情景。
適用性 什麼情況下可以使用該設計模式?該模式可用來改進哪些不良設計?怎麼識別這些情況?
結構 原書是採用基於對象建模技術(OMT)[RBP+91]的表示法對模式中的類進行圖形描述,使用了交互圖[JCJO92,BOO94],我會採用統一建模語言UML來進行描述。
參與者 指設計模式中的類和/或對象以及他們各自的職責。
協作 模式的參與者怎樣協作以實現他們的職責。
效果 模式怎樣支持它的目標?使用模式的效果和所需做的權衡是什麼?系統結構的哪些方面可以獨立改變?
實現 實現模式時需要知道的一些提示、技術要點及應避免的缺陷,以及是否存在某些特定於實現語言的問題。
代碼示例 使用具體的編程語言進行實現,原文采用C++或Smalltalk,我會採用Java來進行實現。
已知應用 實際系統中發現的模式的例子。
相關模式 與這個模式緊密相關的模式有哪些?期間重要的不同之處是什麼?這個模式應與哪些其他模式一起使用?

3 23種設計模式一句話介紹

表1 設計模式的分類

目的
創建型 結構型 行為型
範圍 Factory Method Adapter Interpreter
Template Method
對象 Abstract Factory
Builder
Prototype
Singleton
Adapter
Bridge
Composite
Decorator
Facade
Flyweight
Proxy
Chain of Responsibility
Command
Iterator
Mediator
Memento
Observer
State
Strategy
Visitor

圖1 設計模式之間的關係
設計模式之間的關係

3.1 創建型

Abstract Factory 抽象工廠模式,提供一個創建一系列相關或相互依賴對象的介面,而無需指定它們具體的類。
Builder 建造者模式,將一個複雜對象的構建與它的實現部分分離,使它們都可以獨立地變化。
Factory Method 工廠方法模式,定義一個用於創建對象的介面,讓子類決定將哪一個類實例化,是一個類的實例化推遲到其子類。
Prototype 原型模式,用原型實例指定創建對象的種類,並且通過拷貝這個原型來創建新的對象。
Singleton 單例模式,保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。

3.2 結構型

Adapter 適配器模式,將一個類的介面轉換成客戶希望的另一個介面。Adapter模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。
Bridge 橋接模式,將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
Composite 組合模式,將對象組合成樹形結構以表示“部分-整體”的層次結構,是的客戶對單個對象和組合對象的使用具有一致性。
Decorator 裝飾器模式,動態地給一個對象添加一些額外的職責,就擴展而言,Decorator比生成子類方式更為靈活。
Facade 外觀模式,為子系統中的一組介面提供一個一致的界面,定義了一個高層介面,這個介面使得這一子系統更容易使用。
Flyweight 享元模式,運用共用技術有效地支持大量細粒度的對象。
Proxy 代理模式,為其他對象提供一個代理以控制對這個對象的訪問。

3.3 行為型

Chain of Responsibility 職責鏈模式,接觸請求的發送者和接收者之間的耦合,是多個對象都有機會處理這個請求,將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它。
Command 命令模式,將一個請求封裝為一個對象,從而使你可用不同的請求對客戶端進行參數化,對請求排隊或記錄請求日誌,以支持可取消的操作。
Interpreter 解釋器模式,給定一個語言,定義它的文法的一種表示,並定義一個解釋器,該解釋器使用該表示來解釋語言中的句子。
Iterator 迭代器模式,提供一種方法順序訪問一個聚合對象中的各個元素,而又不需要暴露該對象的內部表示。
Mediator 中介者模式,用一個中介對象來封裝一些列的對象交互,中介者使各對象不需要顯示地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。
Memento 備忘錄模式,在不破壞封裝性的前提下捕獲一個對象的內部狀態,併在該對象之外保存這個狀態,這樣以後就可以將該對象恢復到保存的狀態。
Observer 觀察者模式,定義對象間的一種一對多的依賴關係,以便當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並自動刷新。
State 狀態模式,允許一個對象在其內部狀態改變時改變它的行為,對象看起來似乎修改了它所屬的類。
Strategy 策略模式,定義一系列的演算法,把它們一個個封裝起來,並且使它們可相互替換,本模式使得演算法的變化可獨立於使用它的客戶。
Template Method 模板方法模式,定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。Template Method 使得子類不改變一個演算法的結構即可重定義該演算法的某些特定的步驟。
Visitor 訪問者模式,表示一個作用於某對象結構中的各元素的操作,使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。


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

-Advertisement-
Play Games
更多相關文章
  • 一、背景 作為在後端圈開車的多年老司機,是不是經常聽到過,“mysql 單表最好不要超過 2000w”,“單表超過 2000w 就要考慮數據遷移了”,“你這個表數據都馬上要到 2000w 了,難怪查詢速度慢”。 這些名言民語就和“群里只討論技術,不開車,開車速度不要超過 120 碼,否則自動踢群”, ...
  • vivo 實時計算平臺是 vivo 實時團隊基於 Apache Flink 計算引擎自研的覆蓋實時流數據接入、開發、部署、運維和運營全流程的一站式數據建設與治理平臺。 ...
  • 之前數據分層處理,最後把輕度聚合的結果保存到 ClickHouse 中,主要的目的就是提供即時的數據查詢、統計、分析服務。這些統計服務一般會用兩種形式展現,一種是為專業的數據分析人員的 BI 工具,一種是面向非專業人員的更加直觀的數據大屏。 以下主要是面向百度的 sugar 的數據大屏服務的介面開發 ...
  • 大數據 ODS&DWD&DIM-SQL分享 需求 思路一:等差數列 斷2天、3天,嵌套太多 1.1 開窗,按照 id 分組,同時按照 dt 排序,求 Rank -- linux 中空格不能用 tab 鍵 select id,dt,rank() over(partition by id order b ...
  • 當我在實現線上客服源碼彈窗效果JavaScript SDK時,對外公開的SDK代碼就是使用的自執行函數的形式。 使用自執行函數來實現 JavaScript SDK 有以下好處: 封裝代碼:自執行函數可以將你的 JavaScript 代碼封裝起來,從而避免在全局作用域中定義變數,防止變數名稱衝突。 提 ...
  • 我們有時候會不知道斷點打在什麼地方,比如想知道dom什麼時候被修改的,網路請求在哪裡 ,什麼情況才斷點。類似情況有很多,需要對應使用不同的打斷點方式才可以提高效率,本文演示已VSCode Debugger為主,其實跟chrome是大同小異,不過更加直觀方便。可以參考該文章 【前端調試】- 更好的調試 ...
  • 事件委托與事件對象 事件冒泡與事件捕獲 事件流:用於描述頁面接收事件的順序。以下是事件流的兩種不同方案: 事件冒泡:事件由最具體的元素逐級向上傳遞到最不具體的元素。 事件捕獲:事件由最不具體的元素逐級向下傳遞到最具體的元素。 以上的兩種事件流方案是截然相反的,分別由IE開發團隊和Netscape開發 ...
  • var request = new XMLHttpRequest(); //請求種類和地址和.......(屑阿狗忘了,但暫時沒用 request.open('GET', '這裡填寫介面地址', true); //返回格式,json是js對象的存儲 request.responseType = 'j ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...