Induction of Design Pattern

来源:https://www.cnblogs.com/mysticbinary/archive/2023/09/07/17676891.html
-Advertisement-
Play Games

網上查到的設計模式有23種,通過歸納去認識他們也是一種不錯的視角。 我這邊不按照主流的觀點去劃分為創建型、結構型、行為型三大類,我只歸納為創建型(Creational Class)、簡單功能場景(Simple Method Class)、複雜功能場景(Complex Method Class)三大類 ...


網上查到的設計模式有23種,通過歸納去認識他們也是一種不錯的視角。
我這邊不按照主流的觀點去劃分為創建型、結構型、行為型三大類,我只歸納為創建型(Creational Class)、簡單功能場景(Simple Method Class)、複雜功能場景(Complex Method Class)三大類。原因是結構、行為這種詞本身就比較泛,而模式本身就是一種比較交叉融合的狀態,所以根據我的理解,我主觀性的重新劃分,當然只是為了讓我理解和思考。

其實程式設計模式里,大多數的考慮初衷都是為了面向未來未知情況,在當前就先規劃做好擴展方式,方便能讓未來使用者使用方便的代碼結構。
也有能節省資源的設計模式、方便解耦的設計模式...

Creational Class

幫助機器(系統)節省資源的創建對象模式:

  • Singleton Pattern
  • Flyweight Pattern
  • Prototype Pattern(也叫克隆模式)

面對未來未知,由外部提供需求來創建對象模式,如下幾種應該說在各大框架里能常看到:

  • Simple Factory
  • Factory Methoed Pattern
  • Abstract Factory Pattern
    當抽象工廠模式只生產一個產品時,和工廠方法模式沒啥區別。當它生成一組或多個產品時,才有所區別。
  • Buidler Pattern

Simple Method Class

Simple Method Class就是非常好理解的設計模式,他們往往都能對應現實生活中某些機構、某種職業的運作模式,所以非常好理解。

  • Facade Pattern(也叫前臺接待模式)
  • Template Pattern
    模版模式也是一種應對未來未知情況的解決方案,部分可知,部分不可知;
  • 觀察者模式
    一種一對多的關係,當一個類的狀態發送改變,就通知所有依賴(有關係)的類;
  • 狀態模式/策略模式
    將狀態封裝成一個類,不同狀態的類,會有不同的行為。 狀態模式和策略模式是一樣的。
  • 中介者模式
    為瞭解耦各個類,只通過中介者去通信,有點繞。
  • Proxy Pattern
    • 代理對象充當了客戶端和目標對象之間的中介,從而可以在訪問目標對象時添加額外的邏輯;
    • 代理對象持有一個真實主題的引用,併在需要時創建或獲取真實主題對象;
    • 代理對象在調用真實主題之前或之後,執行一些額外的操作,例如許可權驗證、緩存、日誌記錄等。
  • 責任鏈模式
    責任鏈模式很容易理解(想想在公司請假的流程,員工發起,組長審批——>部門領導審批——>HR審批——>BOSS...)
    它也用到遞歸,控制不好就容易死迴圈;

下麵這些個模式一般不在程式設計的時候考慮,並且新程式在設計初期就不應該出現如下情況,會把程式搞複雜!反而,它們更適合運用在程式維護階段,程式已經運行起來,在不大規模的重構之前,也沒有好辦法的時候才考慮使用。當然還有一種情況,就是你使用別人寫好的介面,調用別人的SDK,你是無法修改調用的介面方法的,你能做的就是自己封裝多一層中間層,下麵是幾種不同場景介紹:

  • Adapter Pattern(適配器模式)
    當需要使用一個已存在的類,但其介面與要求的介面不匹配時。
  • Decorator Pattern(裝飾者模式)
    • 用於在不修改現有對象結構的前提下,動態地給對象添加額外的功能;
    • Decorator 和 Proxy有相似的地方,就是都是給現有類.方法增加額外功能,不同點在於Decorator是不修改現有對象結構

Complex Method Class

下麵這幾個模式就有點繞了,只能自己多思考了,無他法。

  • Composite Pattern
    需要用到遞歸,控制不好就容易死迴圈;
  • Bridge Pattern
  • 迭代器模式
    解耦思想,將行為和對象分離;
  • 備忘錄模式
    在不暴露對象內部狀態的情況下保存和恢復對象的狀態。
    為了完成這個保護和恢復功能涉及的類比較多,就容易複雜。
  • 命令模式
    也是一種解構思想,將行為和數據結構分離;
    命令模式還有一個撤銷操作,和備忘錄有相似;
  • 訪問者模式
    • TODO
  • 解釋器模式
    • TODO

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

-Advertisement-
Play Games
更多相關文章
  • JDK 代理和 CGLib 有什麼區別? 動態代理是一種機制,程式通過該機制在運行時動態生成代理對象並調用代理方法。動態代理主要有兩種實現機制,一種是基於反射動態代理的JDK,另一種是基於ASM動態代理機制的CGLib實現。現在讓我們談談兩種實現之間的區別以及如何實現它們 JDK 代理和 CGLib ...
  • ### 前言 上篇文章[10分鐘從源碼級別搞懂AQS(AbstractQueuedSynchronizer)](https://juejin.cn/post/7273506068104478760)說到JUC併發包中的同步組件大多使用AQS來實現 本篇文章通過AQS自己來實現一個同步組件,並從源碼級 ...
  • 函數是一組語句,可以在程式中重覆使用。函數不會在頁面載入時自動執行。函數將通過調用函數來執行。 ### 創建函數 要創建(通常稱為聲明)一個函數,請執行以下操作: - 使用 `func` 關鍵字。 - 指定函數的名稱,後跟括弧 `()`。 - 最後,在花括弧 `{}` 內添加定義函數應執行的代碼。 ...
  • 1.雙擊圖標 2.彈出如下對話框: 3、單擊按鈕Next,彈出如下對話框: 4、單擊按鈕I Agree,彈出如下對話框: 5、單擊按鈕Next,彈出如下對話框: 6、單擊Browse按鈕,可以重新設置安裝路徑 7、路徑重新設置後,單擊確定按鈕彈出如下對話框(註意,此時路徑已更改): 註意:如果想要設 ...
  • # 集合總結 ## 一、概述 1. 作用:存儲對象的容器,代替數組的,使用更加的便捷 2. 所處的位置:java.util 3. 體繫結構 ![image](https://img2023.cnblogs.com/blog/3245131/202309/3245131-202309071934421 ...
  • Vue 3 的Composition API + ``` ``` 這就把清單功能獨立出來,可在任意需要的地方復用。 基於組件去搭建應用,可實現對業務邏輯的復用。如有其他頁面也需要用到這功能,直接復用。 然後,就可基於新語法實現清單應用。 把之前的代碼移植過來後,使用ref包裹的響應式數據。修改tit ...
  • # Python名稱空間和作用域,閉包函數 - 名稱的查詢順序 - 名稱空間的作用域 - global和nonlocal關鍵字的使用 - 函數對象(函數名) - 函數的嵌套調用 - 函數的嵌套定義 - 閉包函數 ## 名稱空間 ### 定義 ```python # 什麼是名稱空間? 名稱空間即存放名 ...
  • 作者:七寸知架構 \ 鏈接:https://www.jianshu.com/p/ec40a82cae28 # 1 引言# 本文主要講解JDBC怎麼演變到Mybatis的漸變過程,**重點講解了為什麼要將JDBC封裝成Mybaits這樣一個持久層框架**。再而論述Mybatis作為一個數據持久層框架本 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...