【設計模式-1】軟件設計模式概述

1. 軟件設計模式的產生背景

“設計模式”這個術語最初并不是出現在軟件設計中,而是被用于建筑領域的設計中。
1977 年,美國著名建筑大師、加利福尼亞大學伯克利分校環境結構中心主任克里斯托夫·亞歷山大(Christopher Alexander)在他的著作《建筑模式語言:城鎮、建筑、構造(A Pattern Language: Towns Building Construction)中描述了一些常見的建筑設計問題,并提出了 253 種關于對城鎮、鄰里、住宅、花園和房間等進行設計的基本模式。

在這里插入圖片描述

1987 年,肯特·貝克(Kent Beck)和沃德·坎寧安(Ward Cunningham)首先將克里斯托夫·亞歷山大的模式思想應用在 Smalltalk 中的圖形用戶接口的生成中,但沒有引起軟件界的關注。

1994 年,艾瑞克·伽馬(ErichGamma)、理査德·海爾姆(Richard Helm)、拉爾夫·約翰森(Ralph Johnson)、約翰·威利斯迪斯(John Vlissides)等 4 位作者合作出版了《設計模式:可復用面向對象軟件的基礎》(Design Patterns: Elements of Reusable Object-Oriented Software)一書,系統地介紹了23種經典的設計模式,這是設計模式領域里程碑的事件,導致了軟件設計模式的突破。這 4 位作者在軟件開發領域里也以他們的“四人組”(Gang of Four,GoF)匿名著稱。

2. 軟件設計模式的概念與意義

2.1 軟件設計模式的概念

軟件設計模式(Software Design Pattern),又稱設計模式,是一套被反復使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。它描述了在軟件設計過程中的一些不斷重復發生的問題,以及該問題的解決方案。也就是說,它是解決特定問題的一系列套路,是前輩們的代碼設計經驗的總結,具有一定的普遍性,可以反復使用。其目的是為了提高代碼的可重用性、代碼的可讀性和代碼的可靠性。

2.2 學習設計模式的意義

設計模式的本質是面向對象設計原則的實際運用,是對類的封裝性、繼承性和多態性以及類的關聯關系和組合關系的充分理解。正確使用設計模式具有以下優點。

  1. 提高代碼復用性:設計模式提供了一種標準化的解決方案,避免了重復造輪子。
  2. 增強代碼可維護性:通過使用設計模式,代碼結構更加清晰,易于理解和修改。
  3. 提升開發效率:開發人員可以直接使用成熟的設計模式,減少設計時間。
  4. 促進團隊協作:設計模式為開發團隊提供了一種共同的語言,便于溝通和協作。
  5. 降低系統復雜度:通過合理的模式選擇,可以將復雜問題分解為更小的、可管理的部分。

3. 軟件設計模式的基本要素

軟件設計模式使人們可以更加簡單方便地復用成功的設計和體系結構,它通常包含以下幾個基本要素:模式名稱、別名、動機、問題、解決方案、效果、結構、模式角色、合作關系、實現方法、適用性、已知應用、例程、模式擴展和相關模式等,其中最關鍵的元素包括以下 4 個主要部分。

3.1 模式名稱(Pattern Name)

  • 每一個模式都有自己的名字,通常用一兩個詞來描述,可以根據模式的問題、特點、解決方案、功能和效果來命名。模式名稱(PatternName)有助于我們理解和記憶該模式,也方便我們來討論自己的設計。例如,“單例模式”、“工廠模式”等。

3.2 問題(Problem)

  • 描述了設計模式所要解決的具體問題或場景。例如,如何確保一個類只有一個實例,或者如何動態地創建對象。

3.3 解決方案(Solution)

  • 模式問題的解決方案(Solution)包括設計的組成成分、它們之間的相互關系及各自的職責和協作方式。因為模式就像一個模板,可應用于多種不同場合,所以解決方案并不描述一個特定而具體的設計或實現,而是提供設計問題的抽象描述和怎樣用一個具有一般意義的元素組合(類或對象的 組合)來解決這個問題。

3.4 效果(Consequences)

  • 描述了模式的應用效果以及使用該模式應該權衡的問題,即模式的優缺點。主要是對時間和空間的衡量,以及該模式對系統的靈活性、擴充性、可移植性的影響,也考慮其實現問題。顯式地列出這些效果(Consequence)對理解和評價這些模式有很大的幫助。

4. 設計模式的應用場景

  1. 單例模式:用于需要全局唯一實例的場景,如數據庫連接池、日志管理器。
  2. 工廠模式:用于需要動態創建對象的場景,如依賴注入框架。
  3. 觀察者模式:用于事件驅動系統,如GUI框架中的事件監聽。
  4. 適配器模式:用于整合不兼容的接口,如舊系統與新系統的對接。
  5. 裝飾器模式:用于動態擴展對象功能,如Java的I/O流。

5. 設計模式的局限性

盡管設計模式有很多優點,但也存在一些局限性:

  1. 過度使用:濫用設計模式可能導致代碼過度設計,增加復雜性。
  2. 學習成本:掌握設計模式需要時間和經驗,新手可能難以理解。
  3. 適用性:并非所有場景都適合使用設計模式,需要根據具體問題選擇。

6. 總結

設計模式是軟件開發中的寶貴財富,它提供了一種高效、可復用的解決方案,幫助開發人員應對復雜系統的設計挑戰。通過理解設計模式的背景、概念、意義和基本要素,開發人員可以更好地應用這些模式,提升代碼質量和開發效率。然而,設計模式并非銀彈,合理使用才能發揮其最大價值。在實際開發中,應根據具體需求選擇合適的設計模式,避免過度設計。

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

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

相關文章

Python爬蟲基礎——認識網頁結構(各種標簽的使用)

1、添加<div>標簽的代碼定義了兩個區塊的寬度和高度均為100px&#xff0c;邊框的格式也相同&#xff0c;只是區塊中顯示的內容不同&#xff1b; 2、添加<ul>和<ol>標簽分別用于定義無序列表和有序列表。<il>標簽位于<ul>標簽或<ol>標簽之…

Spring boot接入xxl-job

Spring boot接入xxl-job 導入maven包加入配置增加配置類創建執行器類&#xff08;寫job的業務邏輯&#xff09;去控制臺中配置job 導入maven包 <dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>…

[Git] git pull --rebase / git rebase origin/master

1. git pull --rebase 這個命令是用來更新當前分支的&#xff0c;它會從遠程倉庫拉取更新&#xff0c;然后將你的本地提交重新應用到更新后的基礎之上。它相當于先執行 git fetch&#xff0c;然后在當前分支上執行 git rebase origin/。使用 --rebase 而不是默認的 merge 可以…

去掉el-table中自帶的邊框線

1.問題:el-table中自帶的邊框線 2.解決后的效果: 3.分析:明明在el-table中沒有添加border,但是會出現邊框線. 可能的原因: 由 Element UI 的默認樣式或者表格的某些內置樣式引起的。比如,<el-table> 會通過 border-collapse 或 border-spacing 等屬性影響邊框的顯示。 4…

空間不足導致Oracle集群內存使用率暴增

一、現象 操作系統內存使用率告警&#xff0c;已達到98%,&#xff0c;告警內容如下&#xff1a; 【全景監控&#xff1a;Oracle主機內存使用監控】 【主機名】&#xff1a;XXXXX11 【主機IP】主機IP&#xff1a;*.126.15 【告警內容】當前內存使用率為98.9%&#xff0c;超警…

spark匯總

目錄 描述運行模式1. Windows模式代碼示例 2. Local模式3. Standalone模式 RDD描述特性RDD創建代碼示例&#xff08;并行化創建&#xff09;代碼示例&#xff08;讀取外部數據&#xff09;代碼示例&#xff08;讀取目錄下的所有文件&#xff09; 算子DAGSparkSQLSparkStreaming…

矩母函數(MGF)

矩母函數&#xff08;MGF&#xff09;簡介 矩母函數&#xff08;Moment Generating Function&#xff0c;MGF&#xff09;是概率統計中描述隨機變量分布特征的重要工具。MGF的主要用途是通過導數來計算隨機變量的矩&#xff08;比如均值、方差等&#xff09;&#xff0c;同時它…

React中的合成事件

合成事件與原生事件 區別&#xff1a; 1. 命名不一樣&#xff0c;原生用純小寫方式&#xff0c;react用小駝峰的方式 原生&#xff1a;onclick React的&#xff1a;onClick 2. 事件處理函數的寫法不一樣 原生的是傳入一個字符串&#xff0c;react寫法傳入一個回調函數 3.…

ajax與json

目錄 1、ajax1.1、什么是ajax1.2、ajax核心AJAX 工作原理示例代碼重要屬性和方法兼容性 1.3、jQuery ajax什么是jQuery ajaxjQuery AJAX 核心概念基本用法1. **使用 $.ajax() 方法**2. **使用簡化方法****使用 $.get() 方法****使用 $.post() 方法** 常用配置選項示例&#xff…

CSS——26. 偽元素2(“::before ,::after”)

::before偽類 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>偽元素</title><style type"text/css">div::before{content: "我最棒";}}</style></head><body><!--…

Openssl1.1.1s rpm包構建與升級

rpmbuild入門知識 openssh/ssl二進制升級 文章目錄 前言一、資源準備1.下載openssh、openssl二進制包2.安裝rpmbuild工具3.拷貝源碼包到SOURCES目錄下4.系統開啟telnet&#xff0c;防止意外導致shh無法連接5.編譯工具安裝6.補充說明 二、制作 OpenSSL RPM 包1.編寫 SPEC 文件2.…

patchwork++地面分割學習筆記

參考資料&#xff1a;古月居 - ROS機器人知識分享社區 https://zhuanlan.zhihu.com/p/644297447 patchwork算法一共包含四部分內容&#xff1a;提出了以下四個部分&#xff1a;RNR、RVPF、A-GLE 和 TGR。 1&#xff09;基于 3D LiDAR 反射模型的反射噪聲消除 (RNR)&#xff…

基于Spring Boot的海濱體育館管理系統的設計與實現

風定落花生&#xff0c;歌聲逐流水&#xff0c;大家好我是風歌&#xff0c;混跡在java圈的辛苦碼農。今天要和大家聊的是一款基于springboot的海濱體育館管理系統的設計與實現。項目源碼以及部署相關請聯系風歌&#xff0c;文末附上聯系信息 。 項目簡介&#xff1a; 寵物醫院…

通過Android Studio修改第三方jar包并重新生成jar包

最近接手了來自公司其他同事的一個Unity項目,里面有一個封裝的jar包要改動一下,無奈關于這個jar包的原工程文件丟失了,于是自己動手來修改下jar包,并做下記錄。 一、導入第三方jar包 1、新建項目EditJarDemo(項目名隨便取) 2、新建libs文件夾,把你要修改的third.jar 復制…

淺嘗Selenium自動化框架

淺嘗Selenium自動化框架 Selenium基本介紹Selenium原理Selenium學習要點寫個Selenium Demo結束 Selenium基本介紹 Selenium 是一個開源的自動化測試工具&#xff0c;只用于測試 Web 應用程序。它支持多種編程語言&#xff08;如 Java、Python、C# 等&#xff09;來編寫測試腳本…

計算機網絡之---物理層設備

什么是物理層設備 物理層設備是指負責數據在物理媒介上傳輸的硬件設備&#xff0c;它們主要處理數據的轉換、信號的傳輸與接收&#xff0c;而不涉及數據的內容或意義。常見的物理層設備包括網卡、集線器、光纖收發器、調制解調器等。 物理層設備有哪些 1、網卡&#xff08;N…

SQL中的數據庫對象

視圖&#xff1a;VIEW 概念 ① 虛擬表&#xff0c;本身不存儲數據&#xff0c;可以看做是存儲起來的SELECT語句 ② 視圖中SELECT語句中涉及到的表&#xff0c;稱為基表 ③ 針對視圖做DML操作&#xff0c;對影響到基表中的數據&#xff0c;反之亦然 ④ 創建、刪除視圖本身&#…

flink的EventTime和Watermark

時間機制 Flink中的時間機制主要用在判斷是否觸發時間窗口window的計算。 在Flink中有三種時間概念&#xff1a;ProcessTime、IngestionTime、EventTime。 ProcessTime&#xff1a;是在數據抵達算子產生的時間&#xff08;Flink默認使用ProcessTime&#xff09; IngestionT…

web服務器架構,websocket

1. 非前后端分離架構 1. 前端html后端servlet 被tomcat服務器打包&#xff0c;統一指定根目錄入口。通過原生表單發送到后端&#xff0c;后端根據請求數據進行重定向或請求轉發&#xff0c;這樣就不能進行動態渲染&#xff0c;也就必須存在很多靜態html對應每一個請求。 這里…

Ubuntu 下測試 NVME SSD 的讀寫速度

在 Ubuntu 系統下&#xff0c;測試 NVME SSD 的讀寫速度&#xff0c;有好多種方法&#xff0c;常用的有如下幾種&#xff1a; 1. Gnome-disks Gnome-disks&#xff08;也稱為“Disks”&#xff09;是 GNOME 桌面環境中的磁盤管理工具&#xff0c;有圖形界面&#xff0c;是測試…