設計模式復習小結

1.容易忘得設計原則

接口隔離:指接口中的功能太雜則可以拆分一下。防止實現類實現了接口后自動依賴了一些不需要的功能。不同功能拆分成不同的接口。

里氏代換:強調父類能出現的地方,子類一定能正常跑。

迪米特法則:又稱最少知識原則,只與直接朋友通信,提高模塊獨立性。

單一職責,合成復用,開閉原則

依賴倒轉: 指聚合/組合時使用抽象而非具體的子實現類。對抽象編程。降低客戶與實現模塊之間的藕合。“父類引用指向子類對象” 這說明 依賴倒轉結合使用了里氏代換原則。

2、控制反轉,指我寫了一套抽象的支付代碼,spring幫我去管理是阿里支付還是微信支付。
這個概念建立在依賴倒轉原則上。即編碼基于抽象。

 依賴倒轉是說我依賴的時候不依賴具體實現了,我依賴倒轉了,變成了依賴抽象。控制反轉強調的是誰創建對象。比如由容器進行構造器注入,setter注入等。

我先依賴倒轉,依賴抽象支付工具,寫抽象代碼,然后控制反轉注入bean交給spring。這樣我的工作就大大簡化。不需要自己去太多關注支付方式。

3.關于適配器模式 與 橋接模式的聯系與區別。

適配器的典型用法: 事后補救,解決接口不兼容的問題。

class Adapter implements NewInterface {
private LegacyClass legacyObj;

適配器類實現新接口,但是組合老的實現類。通過老的實現類的方法作為input,經過一定的轉換,來返回新接口方法格式的結果。

橋接模式的典型用法:事前規劃。選取一個主維度作為主體,去組合其他的維度。
抽象層與實現分離。比如統一的UI框架與不同OS的渲染。統一的數據格式與不同的db 驅動。
或者是多維度的分離,防止類爆炸。比如形狀與顏色,車的類型與引擎的類型。

二者也經常結合使用。比如橋接模式定義一個抽象層,如數據存儲,然后組合一個Adaptor類型的實現層。

這樣在實現一個具體數據存儲的時候,可以去組合不同驅動類型的adaptor。

回過頭來,簡單總結,這個橋接模式就是用抽象組合抽象。從而減少類定義的復雜度。

4.關于單一職責原則和接口隔離原則的練習與區別。
兩者都體現了高內聚,低耦合理念。

但是單一職責強調類的職責,比如訂單類與支付類的拆分。

接口隔離原則強調接口的拆分,比如飛行功能與汽車行駛的接口功能拆分。

5.訪問者模式:
一句話總結: 不想在貓,狗類中寫關于 健康檢查,喂食等代碼。
簡單寫一個accept 方法。調用入參的Visit。
具體的健康檢查,喂食,由入參類負責。

另外一般會有一個動物園類來組合元素集合。并提供依次accept的方法。方便獸醫、喂食人員調用。

適合于你有一堆類似的元素(貓狗等),然后你又想將來以不同的方式來批量對待他們。

精髓是將操作從數據結構中分離出來,適用于操作易變,但數據結構穩定的系統。比如編譯器,UI框架。
規避場景:數據結構容易變,或者不可預知的場景。即貓狗易變,而且我也不知道啥時候集合里面會多來一種動物。

備忘錄類 典型例子是游戲存檔
存儲游戲狀態快照,但是不想讓其他人訪問,隨意修改數據。
Momento 對象,對其他人如玩家提供窄接口,僅對發起人(游戲程序員、GM、或者是數據敏感的GAMEROLE類這樣的角色等)提供寬接口。

在java中的實現方案是,將PrivateMomento 設計為 GM類的成員內部類。

GM對外提供的backup restore 都是Momento類型。實際GM進行操作時,強轉為PrivateMomento再在內部方法中偷偷操作屬性等。

精髓:針對同樣一個操作,實現雙接口。對不同類暴漏的功能數量不一樣。增強安全性。
對于無關的人,我給你一個功能很少的接口類。等到了底層真正執行的時候,你會發現它強轉了向下轉型了另外一個功能更強大的類。

7.狀態模式
把狀態抽象成類,對于同一個方法,當前是什么狀態干什么事,減少if else 的使用。
比如向前Go訂單。-> 現在是下單那就發貨,是發貨那就簽收。

8.命令模式。
用一個 含有execute的 Command 接口。來解耦請求的發起與執行。
讓請求的發起,關注命令即可,而不需要關注誰執行,如何去執行。

比如燈 implemens Command {
execute{ 燈.on }}

看了jdk 21的代碼。 Collection 接口繼承了 Iterable 接口。
public interface Collection extends Iterable
所以所有的集合類都支持迭代器。

責任鏈模式典型場景: 多層審批
實際精髓是一個很復雜的活,我只要請求一次就行了。
典型寫法 abstract class Handler{setNext(Handler)}

細分有純(經典審批),不純(如filter),動態排序的鏈(插件化架構)等。

DEBUG日志→控制臺,ERROR日志→郵件+文件。

?Web請求過濾?
Servlet Filter鏈:身份驗證→參數校驗→業務處理。

拓展知識,filter依賴Servlet規范的doFilter函數,依賴 Servlet容器,可以攔截靜態資源。
Interceptor基于動態代理實現。依賴Spring框架,僅攔截Contoller請求(springBoot2.0之前。后來的版本需要手動放行一下)。可以訪問Handler,ModelAndView等Spring上下文。

?執行流程與順序?
?Filter?:
請求 → Tomcat容器 → Filter → Servlet
多個Filter按配置順序鏈式執行(責任鏈模式)

?Interceptor?:
請求 → DispatcherServlet → Interceptor.preHandle() → Controller → Interceptor.postHandle() → 視圖渲染 → Interceptor.afterCompletion()

支持更細粒度的生命周期控制(如preHandle返回false可中斷請求)。

請求先經過Filter才進入DispatcherServlet。
所以先Fileter后intercepter。

掌握兩者生命周期差異(Filter在Servlet前后,Interceptor在Controller前后),并強調Interceptor與Spring的協同優勢(如Bean注入、路徑精確控制)。實際項目中常組合使用,例如Filter處理全局安全,Interceptor處理業務權限。

模板方法:
父類定義算法骨架,并允許子類重寫特定步驟。在源碼中應用廣泛。

AbstractApplicationContext類中的finishBeanFactoryInitialzation方法調用了子類的getBean方法。因為getBean的實現與環境息息相關。具體的實現類有classPathXMLApplicationContext的基于XML配置的。或者基于配置類+注解方式的AnnotationConfigWebApplicationContext。

抽象類InputStream類中定義了read方法。
需要子類去實現。但是read前后還有一些其他邏輯,子類就不需要去關注了。比如讀多少字節,什么時候停止。子類只要保證能正確讀取一個字節即可。

HttpServlet中的 doGet doPost交給子類實現。子類專注于業務細節。

HttpServlet比較老的概念,原生Servlet開發痛點是每個Servlet需要獨立配置web.xml路由映射。

而SpringMVC 通過@requestMapping注解替代配置。

?底層依賴關系?:
Controller 的調用依賴 DispatcherServlet(HttpServlet 的子類),但 Controller ?并非 Servlet 的直接實現?。

Controller 是 Spring MVC 對 Servlet 的高層抽象,通過注解和框架機制簡化開發,提升可維護性。讓程序員專注于業務細節,忽略協議處理。

12。常見應用場景:spring Spel源碼, jdk正則, mybitis sql解析引擎。缺點是太負責的語法在性能上難以支撐。其價值在于為特定領域語言提供輕量級解析方法。

將運算、變量都定義為對象
將表達式解析為 表達式 運算符 表達式。遞歸的去運算,直到能算出結果,簡單的使用了遞歸。性能比較差。

13.手寫策略模式

要記得有個環境類。聚合了策略。
可以set策略,執行策略。

表達時,可以說字節切換推薦策略,比如按熱度,時間,相關性。

加分項:配置中心,熱更新。

工廠模式+配置文件解決策略類過多的問題。

缺點是客戶端要了解策略。

java關鍵字都是小寫
public interface SortingStrategy{
void sort (int data);
}

BubbleSort
@Override
QuickSort
@Override

SortContext

setStrategy
executeSort

public class StrategyDemo

public class StrategyDemo {
public static void main(String[] args) {
int[] data = {5, 2, 9, 1, 5};

    SortContext context = new SortContext();// 動態切換策略context.setStrategy(new BubbleSort());context.executeSort(data); // 輸出:使用冒泡排序context.setStrategy(new QuickSort());context.executeSort(data); // 輸出:使用快速排序
}

}

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

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

相關文章

昇騰CANN集合通信技術解讀——細粒度分級流水算法

隨著AI技術的演進,模型的計算復雜度和參數量呈現幾何級數增長,這使得傳統單機單卡部署在算力供給與顯存容量方面顯得力不從心,從而直接推動了分布式訓練/推理技術的快速發展。今年年初爆火的DeepSeek在訓練及推理Prefill階段采用了分級流水Al…

水泥廠自動化升級利器:Devicenet轉Modbus rtu協議轉換網關

在水泥廠的生產流程中,工業自動化網關起著至關重要的作用,尤其是JH-DVN-RTU疆鴻智能Devicenet轉Modbus rtu協議轉換網關,為水泥廠實現高效生產與精準控制提供了有力支持。 水泥廠設備眾多,其中不少設備采用Devicenet協議。Devicen…

使用Matplotlib創建炫酷的3D散點圖:數據可視化的新維度

文章目錄 基礎實現代碼代碼解析進階技巧1. 自定義點的大小和顏色2. 添加圖例和樣式美化3. 真實數據應用示例實用技巧與注意事項完整示例(帶樣式)應用場景在數據科學和可視化領域,三維圖形能為我們提供更豐富的數據洞察。本文將手把手教你如何使用Python的Matplotlib庫創建引…

Copilot for Xcode (iOS的 AI輔助編程)

Copilot for Xcode 簡介Copilot下載與安裝 體驗環境要求下載最新的安裝包安裝登錄系統權限設置 AI輔助編程生成注釋代碼補全簡單需求代碼生成輔助編程行間代碼生成注釋聯想 代碼生成 總結 簡介 嘗試使用了Copilot,它能根據上下文補全代碼,快速生成常用…

React 進階特性

1. ref ref 是 React 提供的一種機制,用于訪問和操作 DOM 元素或 React 組件的實例。它可以用于獲取某個 DOM 元素的引用,從而執行一些需要直接操作 DOM 的任務,例如手動設置焦點、選擇文本或觸發動畫。 1.1. 使用 ref 的步驟 1. 創建一個 ref:使用 React.createRef 或 …

基于PHP的連鎖酒店管理系統

有需要請加文章底部Q哦 可遠程調試 基于PHP的連鎖酒店管理系統 一 介紹 連鎖酒店管理系統基于原生PHP開發,數據庫mysql,前端bootstrap。系統角色分為用戶和管理員。 技術棧 phpmysqlbootstrapphpstudyvscode 二 功能 用戶 1 注冊/登錄/注銷 2 個人中…

【大廠機試題解法筆記】報文響應時間

題目 IGMP 協議中,有一個字段稱作最大響應時間 (Max Response Time) ,HOST收到查詢報文,解折出 MaxResponseTime 字段后,需要在 (0,MaxResponseTime] 時間 (s) 內選取隨機時間回應一個響應報文,如果在隨機…

邏輯回歸暴力訓練預測金融欺詐

簡述 「使用邏輯回歸暴力預測金融欺詐,并不斷增加特征維度持續測試」的做法,體現了一種逐步建模與迭代驗證的實驗思路,在金融欺詐檢測中非常有價值,本文作為一篇回顧性記錄了早年間公司給某行做反欺詐預測用到的技術和思路。百度…

Python爬蟲實戰:研究demiurge框架相關技術

1. 引言 在當今數字化時代,互聯網上蘊含著海量的有價值信息。爬蟲技術作為獲取這些信息的重要手段,被廣泛應用于學術研究、商業分析、輿情監測等多個領域。然而,構建一個高效、穩定且可維護的爬蟲系統面臨諸多挑戰,如網頁結構復雜多變、反爬機制日益嚴格、數據處理流程繁瑣…

Jenkins | Jenkins構建成功服務進程關閉問題

Jenkins構建成功服務進程關閉問題 1. 原因2. 解決 1. 原因 Jenkins 默認會在構建結束時終止所有由構建任務啟動的子進程,即使使用了nohup或后臺運行符號&。 2. 解決 在啟動腳本中加上 BULID_IDdontkillme #--------------解決jenkins 自動關閉進程問題-----…

深度學習習題2

1.如果增加神經網絡的寬度,精確度會增加到一個特定閾值后,便開始降低。造成這一現象的可能原因是什么? A、即使增加卷積核的數量,只有少部分的核會被用作預測 B、當卷積核數量增加時,神經網絡的預測能力會降低 C、當卷…

猜字符位置游戲-position gasses

import java.util.*;public class Main {/*字符猜位置游戲;每次提交只能被告知答對幾個位置;根據提示答對的位置數推測出每個字符對應的正確位置;*/public static void main(String[] args) {char startChar A;int gameLength 8;List<String> ballList new ArrayList&…

解析兩階段提交與三階段提交的核心差異及MySQL實現方案

引言 在分布式系統的事務處理中&#xff0c;如何保障跨節點數據操作的一致性始終是核心挑戰。經典的兩階段提交協議&#xff08;2PC&#xff09;通過準備階段與提交階段的協調機制&#xff0c;以同步決策模式確保事務原子性。其改進版本三階段提交協議&#xff08;3PC&#xf…

Towards Open World Object Detection概述(論文)

論文&#xff1a;https://arxiv.org/abs/2103.02603 代碼&#xff1a;https://github.com/JosephKJ/OWOD Towards Open World Object Detection 邁向開放世界目標檢測 Abstract 摘要 Humans have a natural instinct to identify unknown object instances in their environ…

QT3D學習筆記——圓臺、圓錐

類名作用Qt3DWindow3D渲染窗口容器QEntity場景中的實體&#xff08;對象或容器&#xff09;QCamera控制觀察視角QPointLight點光源QConeMesh圓錐幾何網格QTransform控制實體的位置/旋轉/縮放QPhongMaterialPhong光照材質&#xff08;定義顏色、反光等&#xff09;QFirstPersonC…

CSS | transition 和 transform的用處和區別

省流總結&#xff1a; transform用于變換/變形&#xff0c;transition是動畫控制器 transform 用來對元素進行變形&#xff0c;常見的操作如下&#xff0c;它是立即生效的樣式變形屬性。 旋轉 rotate(角度deg)、平移 translateX(像素px)、縮放 scale(倍數)、傾斜 skewX(角度…

夏普比率(Sharpe ratio)?

具有投資常識的人都明白&#xff0c;投資光看收益是不夠的&#xff0c;還要看承受的風險&#xff0c;也就是收益風險比。 夏普比率描述的正是這個概念&#xff0c;即每承受一單位的總風險&#xff0c;會產生多少超額的報酬。 用數學公式描述就是&#xff1a; 其中&#xff1…

C#學習第29天:表達式樹(Expression Trees)

目錄 什么是表達式樹&#xff1f; 核心概念 1.表達式樹的構建 2. 表達式樹與Lambda表達式 3.解析和訪問表達式樹 4.動態條件查詢 表達式樹的優勢 1.動態構建查詢 2.LINQ 提供程序支持&#xff1a; 3.性能優化 4.元數據處理 5.代碼轉換和重寫 適用場景 代碼復雜性…

計算機網絡備忘錄

計算機網絡 - 網絡互聯與互聯網 計算機網絡重點學習本章&#xff0c;屬于核心知識 包含網絡層和傳輸層 的 相關協議 計算機網絡層次重點掌握網絡層與傳輸層。其中網絡層主要是IP協議&#xff0c;解決主機-主機通信&#xff0c;傳輸層主要是TCP/UDP 協議&#xff0c;解決應用-…

跨界破局者魯力:用思辨與創新重塑汽車流通行業標桿

來源&#xff1a;投資家 在汽車流通行業深度變革的浪潮中&#xff0c;東莞東風南方汽車銷售服務有限公司塘廈分公司總經理魯力歷經近二十年行業深耕&#xff0c;構建了一條從汽車銷售顧問到區域運營掌舵者的進階范本。作為東風日產體系內兼具理論建構與實戰穿透力的標桿管理者…