設計模式基礎——概述(1/2)

目錄

一、設計模式的定義

二、設計模式的三大類別

三、設計模式的原則

四、主要設計模式目錄

4.1?創建型模式(Creational Patterns)

4.2?結構型模式(Structural Patterns)

4.3?行為型模式(Behavioral Patterns)


一、設計模式的定義

設計模式(Design pattern)是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。這些模式代表了最佳實踐,通常由有經驗的面向對象的軟件開發人員采用,以解決在軟件設計過程中經常遇到的一般問題。

設計模式提供了一種通用的語言和框架,使得開發者可以更高效地溝通復雜的系統架構,并且允許他們復用已有的解決方案來避免重新發明輪子。每種設計模式都描述了一個在軟件開發中不斷重復出現的問題,以及解決這個問題的核心思想。它們有助于提高代碼的可讀性、可維護性和可靠性,并使軟件工程更加工程化和規范化。

二、設計模式的三大類別

設計模式分為三大類:創建型模式(關注對象的創建)、結構型模式(關注對象之間的組合)和行為型模式(關注對象之間的交互和職責分配)。

大家在看一些資料的時候,會發現,有人特意提到J2EE類設計模式。這通常指的是在Java 2平臺企業版(Java 2 Platform, Enterprise Edition,簡稱J2EE)中使用的一系列設計模式。這些設計模式是針對開發企業級應用的特殊需求而提出的,它們可能并不屬于經典的Gang of Four (GoF)設計模式分類中的三大類:創建型、結構型和行為型。

因此,說“J2EE設計模式”是一種單獨的設計模式類別或子集是合理的。這主要是因為J2EE應用程序有其獨特的架構特點和挑戰,比如處理多層體系結構、分布式計算、事務管理、安全性等。為了解決這些問題,開發者們總結了一系列特定于J2EE環境的最佳實踐,這些實踐有時被稱為“J2EE設計模式”。

需要注意的是,隨著技術的發展,特別是Java平臺從J2EE到Java EE(Java Platform, Enterprise Edition),再到現在的Jakarta EE(由Eclipse基金會維護的企業級Java規范),一些早期與J2EE相關的模式可能會發生變化或不再適用。同時,新的模式也可能出現以適應新的技術和框架。

比如,大家都熟知的MVC設計模式,這可是初學JAVA必須領會的模式,比如經典的Struts框架,就是基于MVC設計模式。MVC(Model-View-Controller)模式是軟件工程中的一種經典架構模式,它在J2EE時代就已經被廣泛采用,并且對后續的Web開發框架和企業級應用有著深遠的影響。然而,隨著技術的發展,尤其是從J2EE到Java EE再到Jakarta EE的過程中,許多新的編程模型和框架出現了,它們提供了不同的方式來組織和管理應用程序的結構。

雖然 MVC 仍然是一種有效的設計原則,但它可能不再像以前那樣直接映射到現代 Java 框架中的組件。例如,在Spring框架中,盡管基本的概念類似于MVC,但實現方式卻有所差異,比如通過DispatcherServlet處理請求、使用@Controller和@RequestMapping注解來定義控制器行為等。

此外,其他現代前端框架,如AngularJS、React或Vue.js,它們也采用了類似的模式,但具體實現和分工與傳統的MVC有所不同。這些框架通常將視圖和控制器的職責合并在一起,而模型則負責處理數據和業務邏輯。

因此,說MVC模式不再適合所有情況并不完全準確。它的核心思想——分離關注點,仍然是現代軟件設計中的重要原則。只不過,隨著時間的推移,這種思想可能會以不同的形式體現出來,或者與其他模式組合起來形成更復雜的架構。開發者需要根據具體的項目需求和技術選型來決定最適合的架構模式。

三、設計模式的原則

以下是幾個在軟件工程中常用的設計原則:

1. 單一職責原則(Single Responsibility Principle, SRP)
? ?- 一個類或模塊應該只有一個改變的原因。
? ?- 這個原則強調了將代碼的職責劃分得盡可能清晰和獨立。

2. 開閉原則(Open-Closed Principle, OCP)
? ?- 對擴展開放,對修改關閉。
? ?- 這個原則建議通過抽象來實現代碼的可擴展性,而盡量避免直接修改現有代碼。

3. 里氏替換原則(Liskov Substitution Principle, LSP)
? ?- 子類型必須能夠替換其基類型。
? ?- 這個原則要求在繼承體系中,子類應當可以無限制地替代父類,并且不會導致錯誤或異常。

4. 接口隔離原則(Interface Segregation Principle, ISP)
? ?- 客戶端不應該被迫依賴于他們不需要的方法。
? ?- 這個原則提倡創建更小、更專業的接口,而不是大型、通用的接口。

5. 依賴倒置原則(Dependency Inversion Principle, DIP)
? ?- 高層模塊不應該依賴低層模塊,兩者都應該依賴抽象。
? ?- 抽象不應該依賴細節,細節應該依賴于抽象。
? ?- 這個原則有助于提高代碼的靈活性和可維護性。

6. 合成復用原則(Composite Reuse Principle, CRP)
? ?- 盡量使用對象組合,而不是繼承來達到復用的目的。
? ?- 這個原則鼓勵使用關聯關系來實現代碼復用,從而降低耦合度。

7. 迪米特法則(Law of Demeter, LoD)或最少知道原則
? ?- 一個對象應該對其他對象有盡可能少的了解。
? ?- 這個原則旨在減少模塊之間的耦合度,提高代碼的可讀性和可維護性。

8. 契約式編程(Programming by Contract, PBC)
? ?- 類和方法之間應有明確的約定(契約),包括前置條件、后置條件和不變條件。
? ?- 這個原則可以幫助確保代碼的正確性和可靠性。

9. 命令查詢分離原則(Command-Query Separation, CQS)
? ?- 方法要么改變對象的狀態(命令),要么返回結果(查詢),但不能同時做這兩件事。
? ?- 這個原則有助于提高代碼的可預測性和可測試性。

以上這些原則都是為了幫助開發者編寫出更加健壯、可讀、可維護和可擴展的代碼。在實際項目中,需要根據具體場景靈活應用這些原則,并與其他設計原則相平衡。

四、主要設計模式目錄

4.1?創建型模式(Creational Patterns)

創建型設計模式是用于處理對象的創建過程,它們將對象的實例化和使用解耦。以下是創建型模式中的一些主要模式:

1. 工廠方法(Factory Method)
? ?- 定義一個用于創建對象的接口,讓子類決定實例化哪一個類。
? ?- 使得一個類的實例化延遲到其子類。

2. 抽象工廠(Abstract Factory)
? ?- 提供一個創建一系列相關或相互依賴對象的接口,而無需指定具體的類。
? ?- 適用于需要提供多個相關的對象系列的情況。

3. 建造者(Builder)
? ?- 將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。
? ?- 適用于需要生成的產品有多種表現形式或者組裝方式時。

4. 原型(Prototype)
? ?- 提供了一個從現有對象復制新對象的方法,而不是通過new操作符直接創建新的對象。
? ?- 當系統需要大量創建相似對象,而且創建過程很耗時的時候,適合使用此模式。

5. 單例(Singleton)
? ?- 確保一個類只有一個實例,并且提供一個全局訪問點。
? ?- 適用于只需要一個實例來協調系統的某些活動的情況。

這些模式的主要目的是隱藏對象的創建細節,使得代碼更加靈活和可擴展,同時減少了代碼之間的耦合度。在實際開發中,根據具體的需求和場景選擇合適的創建型模式可以使代碼更加健壯和易于維護。

4.2?結構型模式(Structural Patterns)

結構型設計模式關注于對象和類的組合方式,它們提供了如何將對象組織在一起以便更好地實現系統功能的方法。以下是結構型模式中的一些主要模式:

1. 適配器(Adapter)
? ?- 將一個類的接口轉換成客戶希望的另一個接口。
? ?- 使得原本不兼容的類可以一起工作。

2. 橋接(Bridge)
? ?- 將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
? ?- 提供了一種將抽象部分和實現部分解耦的方式。

3. 裝飾器(Decorator)
? ?- 動態地給一個對象添加一些額外的職責。
? ?- 提供一種比繼承更有彈性的替代方案來擴展對象的功能。

4. 外觀(Facade)
? ?- 為子系統中的一組接口提供一個一致的界面。
? ?- 它定義了一個高層接口,使得子系統更容易使用。

5. 享元(Flyweight)
? ?- 使用共享技術有效地支持大量細粒度的對象。
? ?- 減少內存使用并提高程序性能。

6. 代理(Proxy)
? ?- 為其他對象提供一種代理以控制對這個對象的訪問。
? ?- 可以用于創建輕量級的對象或延遲加載、權限檢查等場景。

這些模式通過改變對象間的組合關系,提高了代碼的復用性、靈活性和可擴展性,并降低了系統的復雜性。在實際開發中,根據具體的需求和場景選擇合適的結構型模式可以使代碼更加健壯和易于維護。

4.3?行為型模式(Behavioral Patterns)

行為型設計模式關注于對象之間的通信和責任分配,它們描述了如何在類或對象之間劃分算法的職責。以下是行為型模式中的一些主要模式:

1. 模板方法(Template Method)
? ?- 在一個抽象類中定義了一個算法的框架,而將一些步驟延遲到子類中。
? ?- 它允許子類在不改變結構的情況下重定義算法的特定步驟。

2. 命令(Command)
? ?- 將一個請求封裝為一個對象,從而使用戶可以使用不同的請求、隊列或者日志請求,同時還可以支持可撤銷的操作。
? ?- 通過將操作與接收者分離,使得新的請求類型易于添加。

3. 策略(Strategy)
? ?- 定義了一系列算法,并將每一個算法封裝起來,讓它們可以相互替換。
? ?- 策略模式讓算法的變化獨立于使用該算法的客戶。

4. 責任鏈(Chain of Responsibility)
? ?- 允許將請求沿著處理者鏈傳遞,直到被處理為止。
? ?- 消除請求發送者和接收者之間的耦合關系。

5. 狀態(State)
? ?- 允許對象在內部狀態變化時改變其行為。
? ?- 當控制流基于對象的狀態時,使用狀態模式更合適。

6. 觀察者(Observer)
? ?- 定義了一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都會得到通知并自動更新。
? ?- 提供了一種對象間的一對多發布/訂閱機制。

7. 訪問者(Visitor)
? ?- 表示一個作用于某元素結構中的各元素的操作。
? ?- 它使你可以在不修改各元素類的前提下定義作用于這些元素的新操作。

8. 備忘錄(Memento)
? ?- 在不破壞封裝性的前提下,捕獲一個對象的內部狀態以便稍后恢復它。
? ?- 提供了一種狀態保存和回滾的方法。

9. 中介者(Mediator)
? ?- 定義一個中介對象來封裝一系列的對象交互。
? ?- 降低了系統的復雜性和耦合度。

10. 迭代器(Iterator)
? ? - 提供一種順序訪問聚合對象的元素的方式,而不暴露其底層表示。
? ? - 支持以統一的方式遍歷各種數據結構。

11. 解釋器(Interpreter)
? ? - 給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
? ? - 當需要實現一個小規模的語言或者表達式解析時,適合使用此模式。

這些模式通過合理地組織對象間的交互,提高了代碼的復用性、靈活性和可擴展性,并簡化了復雜的系統設計。在實際開發中,根據具體的需求和場景選擇合適的行為型模式可以使代碼更加健壯和易于維護。

先整理這么多,后面我們有時間詳細一起學習幾個常用的設計模式。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208005.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208005.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208005.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue腳手架 生命周期 組件化開發

Vue腳手架 & 生命周期 & 組件化開發 一、今日目標 1.生命周期 生命周期介紹生命周期的四個階段生命周期鉤子聲明周期案例 2.綜合案例-小黑記賬清單 列表渲染添加/刪除餅圖渲染 3.工程化開發入門 工程化開發和腳手架項目運行流程組件化組件注冊 4.綜合案例-小兔…

yolov8 pose coco2yolo

import os import json from tqdm import tqdm import argparseparser argparse.ArgumentParser() # 這里根據自己的json文件位置,換成自己的就行 parser.add_argument(--json_path,defaultrC:\Users\k167\Desktop\dataset\person_dataset/instances_val2017_perso…

Echarts運用之柱狀圖常見問題及案例代碼

前言 ECharts 是一個開源的 JavaScript 可視化庫,用于生成各種類型的圖形和圖表。其中,柱狀圖(Bar chart)是一種常見的圖表類型,用于表示不同類別之間的數值比較。 初學者,可參考下我的另外一篇文章,從基礎到深入,解讀柱狀圖的運用。 Echarts之柱狀圖 常見問題及案例…

MQTT協議對比TCP網絡性能測試模擬弱網測試

MQTT正常外網壓測數據---時延diff/ms如下圖: MQTT弱網外網壓測數據 TCP正常外網壓測數據 TCP弱網外網壓測數據 結論: 在弱網場景下,MQTT和TCP的網絡性能表現會有所不同。下面是它們在弱網環境中的對比: 連接建立:M…

python文件讀寫

文章目錄 讀文件python2&python3差異示例代碼 文件路徑問題處理:字符編碼報錯 讀文件 python2&python3差異 普通模式(python2、python3通用) f open(fileName, moder)open函數在python2和python3差異點: python3支持…

【代碼隨想錄刷題】Day20 二叉樹06

文章目錄 1.【654】最大二叉樹1.1 題目描述1.2 解題思路1.3 java代碼實現1.4 總結 2.【617】合并二叉樹2.1 題目描述2.2 解題思路2.3 java代碼實現 3.【700】二叉搜索樹中的搜索3.1 題目描述3.2 解題思路3.3 java代碼實現 4.【98】驗證二叉搜索樹4.1 題目描述4.2 解題思路4.3 j…

盤點11月Sui生態發展,了解Sui的近期成長歷程!

11月是Web3的“回暖期”,行業持續展現增長趨勢。Sui緊隨行業腳步,開展了一系列生態活動。其中歷時一個多月的Quest 3游戲活動順利結束并公布獎勵,在多地區成功舉辦Move和Sui生態黑客松&交流會,還有針對中文社區開發者教育的星…

MQTT協議對比QUIC網絡性能測試模擬弱網測試

MQTT正常外網壓測數據---時延diff/ms如下圖: MQTT弱網外網壓測數據 QUIC正常外網壓測數據 QUIC弱網外網壓測數據 結論: 在弱網情況下,MQTT和QUIC(Quick UDP Internet Connections)這兩種協議的網絡性能表現也會有…

Axure原型圖表組件庫,數據可視化元件(Axure9大屏組件)

針對Axure制作的大屏圖表元件庫,幫助產品經理更高效地制作高保真圖表原型,是產品經理必備元件工具。現分享完整的組件庫,大家一起學習。 本組件庫的圖表模塊,已包含所有常用的圖表,以下為部分組件截圖示意。文末可下載…

頁面初始化后,需要滾動到某個元素的位置,但是該元素尚未渲染完成。

vue方式 <template><div class"doc"><!-- 判斷是否還在渲染期間 --><div class"fixed" v-show"loading">頁面仍在渲染中&#xff0c;請稍后</div><div class"green" v-show"!loading">…

TA-Lib學習研究筆記(九)——Pattern Recognition (2)

TA-Lib學習研究筆記&#xff08;九&#xff09;——Pattern Recognition &#xff08;2&#xff09; 形態識別的函數的應用&#xff0c;通過使用A股實際的數據&#xff0c;驗證形態識別函數&#xff0c;用K線顯示出現標志的形態走勢&#xff0c;由于入口參數基本上是open, hig…

反向傳播算法

反向傳播算法的數學解釋 反向傳播算法是深度學習中用于訓練神經網絡的核心算法。它通過計算損失函數相對于網絡權重的梯度來更新權重&#xff0c;從而最小化損失。 反向傳播的基本原理 反向傳播算法基于鏈式法則&#xff0c;它按層反向傳遞誤差&#xff0c;從輸出層開始&…

寒冬不再寒冷:氣膜體育館如何打造溫馨運動天地

取暖季即將來臨&#xff0c;隨著氣溫逐漸下降&#xff0c;人們在寒冷的冬季里如何保持運動熱情和身體的健康成為了一項挑戰。而在這個時候&#xff0c;氣膜體育館成為了運動愛好者們的理想場所&#xff0c;提供如春般溫暖舒適的運動環境。那么&#xff0c;讓我們一起揭秘氣膜體…

2024年SEO策略:如何優化您的知識庫?

如今很多人在遇到問題時都會求助于谷歌。谷歌已經成為提供解決方案不可或缺的工具。作為全球搜索引擎的巨頭&#xff0c;擁有大量用戶流量。這就是為什么確保您的產品和服務在谷歌搜索結果中排名靠前是至關重要的&#xff0c;如果您想獲得更多的客戶&#xff0c;SEO是一個非常關…

Filed II 繪制超聲 3D/2D 點擴散函數

點擴散函數可以較好地描述超聲對成像目標分辨能力,利用 filed II 仿真工具實現點擴算函數 PSF 的 3D 和 2D 繪制。 定義換能器基本參數 f0=5e6; % Transducer center frequency [Hz] fs=100e6; % Sampling frequency [Hz] c=1540; % Speed of sound [m/s] width=0.15/1000

<Linux> 文件系統

目錄 前言&#xff1a; 一、 磁盤 &#xff08;一&#xff09;磁盤的物理結構 &#xff08;二&#xff09;磁盤的物理存儲結構 1. 數據存儲 2. 存儲結構 二、磁盤的邏輯抽象 三、磁盤信息 &#xff08;一&#xff09;具體結構 &#xff08;二&#xff09;重新認識目錄…

SOLIDWORKS Flow Simulation電子機箱散熱

這一次我們來聊聊電子冷卻問題&#xff0c;以這個機箱散熱問題為例&#xff0c;我們一般的散熱設計要求是CPU不能超過80℃&#xff0c;北橋芯片溫度不能超過85℃&#xff0c;南橋芯片不超過95℃。在實際情況下芯片內部的各處溫度是不一樣&#xff0c;面對與芯片級別的散熱分析我…

mysql中MDL(元數據鎖)的長事務讀寫阻塞如何解決

MDL&#xff0c;即元數據鎖是什么&#xff0c;我們已經介紹過了 那其存在的長事務讀寫阻塞問題&#xff0c;一般是怎么解決的呢&#xff0c;主要有兩種解決方法。 online ddl MySQL5.6開始&#xff0c;推出一項新功能Online DDL&#xff0c;在ALTER或者CREATE INDEX等語句后添…

【教學類-35-05】17號的學號字帖(A4豎版1份)

作品展示&#xff1a; 背景需求&#xff1a; 大四班17號男孩目前無法自主數學數字。他表示自己能夠認識數字&#xff0c;但不會寫。 保育老師說&#xff1a;我曾經教過他&#xff0c;抓著手示范的。但是他記不住。家里估計也不練習的。年齡還沒到&#xff0c;下學期再看看能不…

有限空間作業中毒窒息事故頻發,漢威科技創新方案護航

工貿企業有限空間是我國重大事故多發頻發的重點領域之一&#xff0c;安全問題形勢嚴峻。 有限空間是指封閉或者部分封閉、未被設計為固定工作場所&#xff0c;人員可以進入&#xff0c;通風不良&#xff0c;易造成有毒有害物質、易燃易爆氣體積聚或者氧含量不足的空間&#xf…