設計模式的總結

来源:http://www.cnblogs.com/gdnyfcuso/archive/2017/06/22/7062988.html
-Advertisement-
Play Games

學習設計模式主要是利用早上的時間,習慣於早起,之前學習的一些模式都做了一些記錄,基於自己理解的記錄。還有一些學習過,沒有做記錄的,今天就對他們做一個總結。方便自己以後的使用。 所謂的設計模式,是用的多了,方便,符合幾大原則,有優點就有缺點,有適用場景就有不適用場景,所以模式是固定的,人的思維是不固定 ...


 

學習設計模式主要是利用早上的時間,習慣於早起,之前學習的一些模式都做了一些記錄,基於自己理解的記錄。還有一些學習過,沒有做記錄的,今天就對他們做一個總結。方便自己以後的使用。

所謂的設計模式,是用的多了,方便,符合幾大原則,有優點就有缺點,有適用場景就有不適用場景,所以模式是固定的,人的思維是不固定,怎麼在這些固定的事物上來挖掘出自己不固定的思維方式,可以做到舉一反三,舉一反十,這才是值得好好思考的事情。

學習是有規律的,是有方法的,不同的事物,不同的人,不同的時間,不同的場合所採用的方式都不相同,我覺得無論學什麼,學到精華,學到思想,學以至用,什麼是至用就像自己創造的它一樣,但很顯然我還沒有達到,之所以沒有達到,是花費的時間不夠多,是所需要的基本知識不具備,還有那個很少卻起關鍵作用的天賦,不要覺得天賦不重要,天賦很重要,努力也很重要,不扯其他了,摘錄了一些模式特色的記錄。從設計模式的分類來看有三大塊:創建型,結構型,行為型。

 

創建型模式

抽象工廠:提供一個創建一系列相關依賴對象的介面,而無需指定它們具體的類。

建造者:將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

工廠方法:定義一個用於創建對象的介面,讓子類決定實例化哪一個類,工廠模式使一個類的實例化延遲到其子類。

原型:用原型實例指定創建對象的各類,並且通過拷貝這些原型創建新的對象。

 

單例:保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。

 

為什麼需要創建型模式?

隱藏了這些類的實例是如何被創建和放在一起,整個系統關於這些對象所知道的是由抽象類所定義的介面。這樣,創建型模式在創建了什麼,誰創建它,它是怎麼被創建的,以及何時創建這些方面提供了很大的靈活性。

 

什麼時候考慮用創建型模式?

當一個系統應該獨立於它的產品創建,構成和表示時,應該考慮用創建性模式。

 

 

結構型模式

適配器:是將一個類的介面轉換成客戶希望的另外一個介面,適配器模式使得原本由於介面不相容而不能一起工作的類可以一起工作。想使用一個已經存在的類,而它的介面不符合要求,或者希望創建一個可以復用的類,該類可以與其他不相關的類或不可預見的類協同工作。

 

橋接:是將抽象部分與的它的實現部分分離,使它們都可以獨立地變化。

組合:將對象組合成樹形結構以表示部分與整體的層次結構,組合模式使得用戶對單個對象和組合對象的使用具有一致性。通過對象組合的方式,把兩個角色之間的繼承關係改為了組合的關係,從而使這兩者可以應對各自獨立的變化。客戶可以一致地使用組合當結構和單個對象。任何用到基本對象的地方都可以使用組合對象。

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

外觀:為子系統中的一組介面提供一個一致的界面,外觀模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。如果兩個類不必直接通信,那麼就不要讓這兩個類發生直接的相互作用。應該讓一個軟體中的子系統間的通信和相互依賴關係達到最小,而個體辦法就是引入一個外觀對象,它為子系統間提供了一個單一而簡單的屏障。

享元:為運用共用技術有效地支持大量細粒度的對象。對象使得記憶體占用過多,而且如果都是大量重覆的對象,就是資源的極大浪費。

代理:為其他對象提供一種代理以控制這個對象的訪問。

 

行為模式

觀察者:定義對象間的一種一對多的依賴關係,當一個對象的狀態發生變化的時候,所有依賴它的對象都得到通知並被自動更新。

模板方法:定義一個操作的演算法骨架,而將一些步驟延遲到子類中,模板方法使得之類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。

 

命令:將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化:可以對象請求排隊或記錄請求,以及支持可撤銷的操作。

 

狀態:允許一個對象在其內部狀態改變時改變它的行為,讓對象看起來似乎修改了它的類。

 

職責鏈:使多個對象都有機會處理請求,從而避免請求的發送者和接收。者之間的耦合關係。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。

 

解釋器:給定一個語言,定義它的文法的一種表示,並定義一個翻譯器,這個解釋器該表示來解釋語言中的句子。

 

中介者:用一個中介對象來封裝一系列的對象交互,中介者使各對象不需要顯示地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的交互。

 

訪問者:表示一個作用於某對象結構中各元素的操作。它使你可以在不改變元素的類的前提下定義作用於這些元素的新操作。

 

策略:定義一系統的演算法,把它們一個個封裝起來,並且使用它們相互替換,本模式使得演算法可獨立於使用它的客戶而變化。

 

備忘錄:在不破壞封裝的前提下,捕獵一個對象內部的狀態,併在該對象之外保存這個狀態,這樣以後就可以將該對象恢復到原先保存的狀態。

 

迭代器:提供一種方法順序訪問一個聚合對象中各個元素,而又不需要顯露該對象的內部表示。

 


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

-Advertisement-
Play Games
更多相關文章
  • 函數式編程1.簡化代碼,2,調用方便,修改方便3.調用參數,形參數,與位置參數。關鍵參數,位置參數只能發在關鍵參數之後4.預設參數5.參數組(*args) 元組參數6 接受字典 ( **kwargs) 當同時使用時必須放到參數的最後程式運行的從文件的上邊到下邊的運行局部變數 一個變數只在函數中生效。... ...
  • 工具:python2.7 相關包:traits-4.6.0-cp27-cp27m-win32.whl, VTK-7.1.1-cp27-cp27m-win32.whl, mayavi-4.5.0+vtk71-cp27-cp27m-win32.whl 下載地址:http://www.lfd.uci.ed ...
  • 模塊 1. 模塊的分類 模塊,又稱構件,是能夠單獨命名並獨立地完成一定功能的程式語句的集合(即程式代碼和數據結構的集合體)。 (1)自定義模塊 自己定義的一些可以獨立完成某個功能的一段程式語句,可以是一個文件,也可以是一個目錄。 (2)第三方模塊 是由其他人寫的一些程式語句,我們可以用它來實現自己的 ...
  • 由於第3章第一題網上有很多種非常優秀的解法,我就不貼出來了,大家不妨自己探索。 練習3-2 編寫一個函數escape(s,t),將字元串t複製到字元串s中,併在複製過程中將換行符、製表符等不可見字元分別轉換成'\n'、'\t'等相應的可見的轉義字元序列。要求使用switch語句。再編寫一個具有相反功 ...
  • MyBatis 的配置文件包含了影響 MyBatis 行為甚深的設置(settings)和屬性(properties)信息。文檔的頂層結構如下: configuration 配置 properties 屬性 settings 設置 typeAliases 類型命名 typeHandlers 類型處理... ...
  • 在開始之前呢,先瞭解一下UIView和CALayer大體的區別(重點列舉了以下四點): UIView繼承自 UIResponder,因此UIView 可以處理響應事件,而CALayer繼承自NSObject,所以它只是負責內容的創建,繪製。 UIView負責對內容的管理,而CALayer則是對內容的 ...
  • 題目描述 設有N*N的方格圖(N<=9),我們將其中的某些方格中填入正整數,而其他的方格中則放 人數字0。如下圖所示(見樣例): A 0 0 0 0 0 0 0 0 0 0 13 0 0 6 0 0 0 0 0 0 7 0 0 0 0 0 0 14 0 0 0 0 0 21 0 0 0 4 0 0 ...
  • 方法的覆寫 類和父類有相同的方法,那麼類中方法的訪問許可權不能比父類中對應方法的訪問許可權嚴格,這就叫方法的覆寫,一般稱之為類覆寫了父類中的某個方法 覆寫方法的作用:對於一個類,向上轉換後(把類的實例化對象賦值給類的父類的對象),通過該父類的對象直接訪問該父類的對象的本類部分中被類所覆寫的方法時,將自動 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...