《Java面向對象程序設計》學習筆記——第 8 章 設計模式

?專欄:《Java面向對象程序設計》學習筆記

第 8 章 設計模式

一個好的設計系統往往是易維護、易擴展、易復用的。

8.1 設計模式簡介

8.1.1 什么是設計模式

一個設計模式 (pattern) 是針對某一類問題的最佳解決方案,而且己經被成功應用于許多系統的設計中。

即一個設計模式是從許多優秀的軟件系統中總結出的成功的可復用的設計方案。

8.1.3 什么是框架

框架不是設計模式,框架是針對某個領域,提供用于開發應用系統的類的集合。

8.2 策略模式

策略模式:定義一系列算法,把它們一個個封裝起來,并且使它們可相互替換。

本模式使得算法可獨立于使用它的客戶而變化。

8.2.1 策略模式的結構

  • 策略 (Strategy) :策略是一個接口,該接口定義若干個算法標識,即定義了若干個抽象方法。

  • 上下文 (Context) :上下文是依賴于策略接口的類(是面向策略設計的類)。

  • 具體策略(ConcreteStrategy):具體策略是實現策略接口的類。

8.2.3 策略模式的優點

  • 上下文( context )和具體策略( ConcreteStrategy )是松耦合關系。

  • 策略模式滿足“開-閉”原則,當增加新的具體策略時,不需要修改上下文類的代碼,上下文就可以引用新的具體策略的實例。

8.2.4 適合使用策略模式的情景

  • 一個類定義了多種行為,并且這些行為在這個類的方法中以多個條件語句的形式出現,那么可以使用策略模式避免在類中使用大量的條件語句。

  • 程序的主要類(相當于上下文角色)不希望暴露復雜的、與算法相關的數據結構,那么可以使用策略模式封裝算法,即將算法分別封裝到具體策略中。

  • 需要使用一個算法的不同變體。

8.3 訪問者模式

表示一個作用于某對象結構中的各個元素的操作。

它使得用戶可以在不改變各個元素的類的前提下定義作用于這些元素的新操作。

8.3.2 訪問者模式的使用

可以將這些類看作是一個小框架,用戶就可以使用這個小框架中的類編寫應用程序了。

8.3.3 雙重分派

訪問者模式使用了一種稱為“雙重分派”的技術:在訪問者模式中,

  • 被訪問者, 即EIement 元素角色element ,首先調用 accept (Visitor visitor )方法接收訪問者,

  • 被接收的訪問者 visitor 再調用 visit(EIement element) 方法訪問當前 element 對象。

“雙重分派”技術中的核心是將數據的存儲和操作解除耦合。

8.3.4 訪問者模式的優點

( 1 )在不改變一個集合中的元素的類的情況下,增加新的施加于該元素上的新操作。

( 2 )可以將集合中各元素的某些操作集中到訪問者中,不僅便于集合的維護,也有利于集合中元素的復用。

8.3.5 適合使用訪問者模式的情景

( 1 )在一個對象結構中,例如某個集合中,包含很多對象,想對集合中的對象增加一些新的操作。

( 2 )需要對集合中的對象進行很多不同的并且不相關的操作,而我們又不想修改對象的類,此時就可以使用訪問者模式。訪問者模式可以在 Visitor 類中集中定義一些關于集合中對象的操作。

8.4 裝飾模式

裝飾模式:動態地給對象添加一些額外的職責。就功能來說,裝飾模式相比生成子類更為靈活。

裝飾模式是動態地擴展一個對象的功能,而不需要改變原始類代碼的一種成熟模式。

8.4.2 裝飾模式的使用

使用模式給出了可以使用的類,可以將這些類看作是一個小框架,用戶就可以使用這個小框架中的類編寫應用程序。

8.4.4 裝飾模式相對繼承機制的優勢

減少子類數目,有利于系統的維護。

8.4.5 裝飾模式的優點

  • 被裝飾者和裝飾者是松耦合關系。

    由于裝飾 (Decorator) 僅僅依賴于抽象組件( Component ),因此具體裝飾只知道它要裝飾的對象是抽象組件的某一個子類的實例,但不需要知道是哪一個具體子類。

  • 裝飾模式滿足“開一閉原則”,不必修改具體組件,就可以增加新的針對該具體組件的具體裝飾。

8.4.6 適合使用裝飾模式的情景

( 1 )程序希望動態地增強類的某個對象的功能,而又不影響該類的其他對象。

( 2 )采用繼承來增強對象功能不利于系統的擴展和維護。

8.5 適配器模式

8.6 工廠方法模式

8.7 責任鏈模式

8.8 小結

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

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

相關文章

[QT/C++]如何得知鼠標事件是由觸摸事件轉換而來的,使得鼠標觸摸事件分離

依據來源&#xff1a;https://doc.qt.io/qt-5/qml-qtquick-mouseevent.html 具體是在event事件或者mouse系列事件中捕獲到鼠標事件后&#xff0c;用如下代碼判斷鼠標事件是否由觸摸事件轉換而來的 if(mouseEvent->source()Qt::MouseEventSynthesizedBySystem){qDebug()<&…

Chrome

Chrome 簡介下載 簡介 Chrome 是由 Google 開發的一款流行的網絡瀏覽器。它以其快速的性能、強大的功能和用戶友好的界面而聞名&#xff0c;并且在全球范圍內被廣泛使用。Chrome 支持多種操作系統&#xff0c;包括 Windows、macOS、Linux 和移動平臺。 Chrome官網: https://ww…

css3新增選擇器總結

目錄 一、屬性選擇器 二、結構偽類選擇器 三、偽元素選擇器 四、UI狀態偽類選擇器 五、反選偽類選擇器 六、target選擇器 七、父親選擇器、后代選擇器 八、相鄰兄弟選擇器、兄弟們選擇器 一、屬性選擇器 &#xff08;除IE6外的大部分瀏覽器支持&#xff09; E&#…

嵌入式面試筆試刷題(day10)

文章目錄 前言一、數組和鏈表的區別二、什么是內存對齊三、IIC的時序四、static作用五、查看tty設備的方法六、查找指定文件命令七、三次握手和四次揮手1.三次握手2.四次揮手 八、半關閉狀態九、字節流和數據報總結 前言 本篇文章繼續講解筆試和面試。 一、數組和鏈表的區別 …

PHP 使用ThinkPHP實現電子郵件發送示例

文章目錄 首先我們需要設置我們的郵箱客戶端授權&#xff0c;獲取到授權碼找到我們的郵箱設置去賬號中找到這一堆服務&#xff0c;找到后開啟smtp服務開啟服務后管理服務 接下來需要去下載相應的第三方類庫(我這里使用的是PHPMailer)在thinkPHP中封裝一下郵件服務類實際調用效果…

Ajax_4(進階)同步異步+ 宏任務微任務 + Promise鏈 + async終極解決方案 +事件循環原理 + 綜合案例

Ajax(進階) 文章目錄 Ajax(進階)01-同步代碼和異步代碼什么是同步代碼&#xff1f;什么是異步代碼&#xff1f;代碼閱讀 02-回調函數地域概念缺點代碼示例 03-Promise鏈式調用概念細節好處代碼示例 04-Promise鏈式應用代碼示例 05-async函數和await概念代碼示例 06-async和awai…

Mysql 建索引規范

索引規范 今天在建線上表的時候&#xff0c;做了一個varchar的索引&#xff0c;運維說varchar的索引會占用很大的內存。 于是 上網搜了一下建索引規范 一、建表規約 【強制】&#xff08;1&#xff09; 存儲引擎必須使用InnoDB 解讀&#xff1a;InnoDB支持事物、行級鎖、并發…

數據結構—圖的應用

6.4圖的應用 概念回顧—生成樹 生成樹&#xff1a;所有頂點均由邊連接在一起&#xff0c;但不存在回路的圖。 一個圖可以有許多棵不同的生成樹、含有n個頂點 n-1 條邊的圖不一定是生成樹所有生成樹具有以下共同特點 生成樹的頂點個數與圖的頂點個數相同&#xff1b;生成樹是圖的…

如何運用小程序技術閉環運營鏈路?

如何通過線上小程序獲取用戶線索&#xff0c;提高企業抗風險能力&#xff0c;建立有效的營銷數字化系統一直是困擾每一個小程序開發者與運營者的問題。 當我們選擇使用小程序設計自己的運營流程時&#xff0c;從「推廣」到「轉化」&#xff0c;再到最終的「留存」都是運營過程…

ABeam×Startup丨德碩管理咨詢(深圳)創新研究團隊前往靈境至維·既明科技進行拜訪交流

近日&#xff0c;德碩管理咨詢&#xff08;深圳&#xff09;&#xff08;以下簡稱“ABeam-SZ”&#xff09;創新研究團隊一行前往靈境至維既明科技有限公司&#xff08;以下簡稱“靈境至維”&#xff09;進行拜訪交流&#xff0c;探討線上虛擬空間的商業模式。 現場合影 &…

前臺測試轉后臺優化歷險記,應屆生薪資8K逆襲,從此扶搖直上九萬里!

優橙教育每一期都會有不少從前臺測試轉到后臺的小伙伴應邀而來&#xff0c;其實每個人的經歷都是大致相同的&#xff0c;這時候肯定會有很多小伙伴問&#xff0c;為什么出來花錢出來參加培訓而不是在項目上轉呢&#xff1f; 或許是因為在項目上摸爬滾打太久了&#xff0c;吃不下…

Qt掃盲-QWidget理論使用總結

QWidget理論使用總結 一、概述二、頂層 控件 和子 控件三、復合控件四、自定義控件和繪制五、大小提示和大小策略六、事件七、一組函數和屬性八、QWidget樣式表九、透明度和雙緩沖十、創建半透明窗口 一、概述 widget 是用戶界面的最小單位&#xff1a;它從window系統接收鼠標…

Jsoup爬取簡單信息

1. 豆瓣圖書最受關注 1.1 創建SpringBoot項目或者Maven項目 1.2 引入jsoup <dependency><!-- jsoup HTML parser library https://jsoup.org/ --><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.15.3<…

Qt應用開發(基礎篇)——堆棧窗口 QStackedWidget

一、前言 QStackedWidget繼承于QFrame&#xff0c;QFrame繼承于QWidget&#xff0c;是Qt常用的堆棧窗口部件。 框架類QFrame介紹 QStackedWidget堆棧窗口&#xff0c;根據下標切換&#xff0c;一次顯示一個小部件&#xff0c;常用于應用界面切換、圖片輪詢播放等場景。 二、QSt…

用Java調用C#的WebService接口

這是一個用Java調用C#版程序的例子,廢話不多說,上代碼: C#接口代碼: using System; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Web.Services.Description;[WebService(Namespace = " http://www.ta…

如何在Springboot項目中讀取zip壓縮包并且把文件導出成zip壓縮包

文章目錄 設想場景實現流程小結 設想場景 為方便老師錄入大量學生圖片信息&#xff0c;在添加照片時&#xff0c;學生的相關資料以身份證號碼圖片描述命名如 &#xff08;1231231234567一寸照片.jpg&#xff09; &#xff08;1231231234567身份證正面照片.jpg&#xff09; &am…

中小企業體育代言:探索費用策略與實際操作

隨著體育市場的不斷擴大和企業品牌的不斷提升&#xff0c;中小型企業正逐漸將目光投向了體育明星代言&#xff0c;希望通過這一策略來提升品牌知名度、美譽度&#xff0c;進而吸引目標消費者的注意力并提升銷售量。然而&#xff0c;中小型企業請體育明星代言的費用究竟是多少呢…

docker 離線模式-部署容器

有網絡的情況下下載需要的鏡像 比如(下面以tomcat為例子&#xff0c;其他鏡像類似) docker pull tomcat打包鏡像文件到本地 docker save tomcat -o tomcat.tar將tomcat.tar 上傳到內網服務器&#xff08;無外網環境&#xff09; 導入鏡像 docker load -i tomcat.tar創建容器…

element-ui的el-dialog,簡單的封裝。

el-dialog是使用率很高的組件 使用el-dialog很多都是按照文檔的例子&#xff0c;用一個變量控制是否顯示&#xff0c;再來一個變量控制標題。 如果我這個對話框多個地方使用的話還要創建多個變量&#xff0c;甚至關閉之后還要清空一些變量&#xff0c;應該可以簡化一點。我寫…

Windows Hyper-V Ubuntu 22.04 LTS安裝

文章目錄 Ubuntu準備Hyper-V啟用虛擬化支持services.msc 打開服務列表&#xff0c;關注Hyper-V服務是否啟動打開管理器創建虛擬機 啟動備份 Ubuntu 下載Ubuntu-Desktop&#xff0c;這是個iso文件。 準備 20GB以上的磁盤空間&#xff0c;ubuntu安裝后的虛擬磁盤文件超過15GB一…