設計模式之總結篇

来源:http://www.cnblogs.com/daily-note/archive/2017/10/13/7660157.html
-Advertisement-
Play Games

十一宅了,也沒學習看啥書,所有時間花在了圍棋上,雖然很頹廢,不過令人欣慰的是居然升了3級,現在是6k水平,之前晚上下的多,停在9k挺長時間的,居然在10.1突破了,這麼看來我能升段的目標還是可能實現的,這麼看自信還真是挺重要的,而我一直不算個自信的人,本來打算10.1假期完成這個設計模式總結的,但是 ...


      十一宅了,也沒學習看啥書,所有時間花在了圍棋上,雖然很頹廢,不過令人欣慰的是居然升了3級,現在是6k水平,
之前晚上下的多,停在9k挺長時間的,居然在10.1突破了,這麼看來我能升段的目標還是可能實現的,這麼看自信還真是挺重要的,而我一直不算個自信的人,
本來打算10.1假期完成這個設計模式總結的,但是懶癌爆發,就拖到今天啦。

設計模式的6大原則
這也是個老生常談的問題,我也不免俗
1.單一職責原則
       一個類只承擔一個職責
2.開放-封閉原則
       對擴展開放,對修改關閉,即儘量以擴展的方式來維護系統
3.里氏替換原則
      表示我們可以在代碼中使用任意子類來替代父類並且程式不受影響,這樣可以保證我們使用“繼承”並沒有破壞父類
4.介面隔離原則
       客戶端不應該依賴於它不需要的介面,兩個類之間的依賴應該建立在最小介面的基礎上。這條原則的目的是為了讓那些使用相同介面的類只需要實現特定必要的一組方法,而不是大量沒用的方法專而小的介面,而不是總介面

5.依賴倒置原則
      抽象不依賴於細節,而細節應該依賴於抽象。提倡“面向介面”編程,而非“面向實現”編程

6.迪米特法則
      用設計行話就是“高內聚,低耦合”,減少類之間的相互依賴,修改系統的某一部分的時候,不會影響到其他部分,使系統有更好的維護性

設計模式分類
創建型:
  單例:保證一個類只有一個實例,其中jdk中枚舉(Enum)類是單例。
       簡單工廠:靜態工廠方法,根據傳遞參數的不同,返回不同的實例。
       工廠方法:定義創建對象的介面,讓子類去決定具體使用哪個類。
  Collection.iterator()
  java.lang.Proxy#newProxyInstance()
  java.lang.Object#toString()
  java.lang.Class#newInstance()
  java.lang.reflect.Array#newInstance()
  java.lang.reflect.Constructor#newInstance()
  java.lang.Boolean#valueOf(String)
  java.lang.Class#forName()
       抽象工廠:提供一個創建一系列相關的對象的介面,而無須指定它的具體實現類
  jdk中 java.sql.*
       原型:用原型實例指定創建對象的種類,並通過複製原型實例得到對象
  jdk中 java.lang.Object#clone(),java.lang.Cloneable
       建造者:簡化複雜對象的創建,將複雜對象的構造與表示相分離,使得同樣的構造過程可以產生不同的複雜對象
       jdk中 java.sql.PreparedStatement


結構型:
       適配器:將一個類的介面轉換成用戶希望的另一個介面
  jdk中 java.io.OutputStreamWriter(OutputStream),java.util.Arrays#asList()
  橋接:將抽象部分與實現部分分離,從而使得它們可以獨立變化,使各部分組件化
  jdk中的JDBC
  組合:將對象組裝成樹狀結構以表示“部分-整體”的關係
  java.util.Map#putAll(Map),java.util.List#addAll(Collection)
  裝飾:動態的為對象添加額外職責
  jdk中IO包
  外觀:為系統的一組介面提供一個一致的界面,使外觀一致
  jdk中java.lang.Class
  享元:它使用共用物件,用來儘可能減少記憶體使用量以及分享資訊給儘可能多的相似物件
  jdk中 java.lang.Integer#valueOf(int)
  java.lang.Boolean#valueOf(boolean)
  java.lang.Byte#valueOf(byte)
  java.lang.Character#valueOf(char)
  代理:為其他對象提供一種代理以控制對該對象的訪問
  jdk中 java.lang.reflect.Proxy
  java.rmi.*

行為型:
  責任鏈:實施一系列的操作,並且使調用雙方和操作之間有耦合關係
  jdk中 java.util.logging.Logger#log()
  javax.servlet.Filter#doFilter()
  命令:對一個客戶端請求封裝成抽象對象
  jdk中 java.lang.Runnable
  javax.swing.Action
  解釋器:一種按照規定語法進行解析的方案
  jdk中 java.util.Pattern
  java.text.Format
  迭代器:順序訪問集合中的所有元素
  jdk中 java.util.Iterator
  中介:用一個中介者對象封裝一系列的對象交互
  jdk中 java.lang.reflect.Method#invoke()
  備忘:備份或者恢複復雜對象的狀態
  jdk中 java.io.Serializable
  觀察者:當一個對象發生改變時,所有和它有依賴關係的對象都會得到通知
  jdk中 java.util.Observer/java.util.Observable
  java.util.EventListener
  狀態:類的行為是基於它的狀態改變
  jdk中 java.util.Iterator
  策略:定義了一系列的演算法,並將每一個演算法封裝起來,而且使它們還可以相互替換
  jdk中java.util.Comparator#compare()
  模板:定義一個操作流程的方法骨架,具體細節的實現放到子類中
  jdk中java.io.InputStream, java.io.OutputStream, java.io.Reader和java.io.Writer的所有非抽象方法
  java.util.AbstractList, java.util.AbstractSet和java.util.AbstractMap的所有非抽象方法
  javax.servlet.http.HttpServlet#doXXX()
  java.util.Collections#sort()
  訪問者:作用於某個對象群中各個對象的操作. 它可以使你在不改變這些對象本身的情況下,定義作用於這些對象的新操作
  jdk中javax.lang.model.element.Element 和javax.lang.model.element.ElementVisitor  設計模式寫到這裡算告一段落啦,雖然我看過幾遍,並且參考這種博客書籍寫下了這些篇內容,但是問自己這些模式就真的懂啦嘛,我可以肯定的說不是的,像其中解釋器訪問者都是什麼鬼,我依然很難解釋清楚,還是用的少,或者都是封裝完整的,很少需要自己去封裝這麼多的模式,這種思想的種子算埋下啦,至於開不開花真的靠悟性啦,我至今還未開悟...


系列博文參考博客及書籍在此一併列出:
博客:http://blog.csdn.net/lovelion/article/details/17517213
書:研磨設計模式
博客:http://www.cnblogs.com/zuoxiaolong/category/509144.html
博客:http://www.iteye.com/news/18725
等等...


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

-Advertisement-
Play Games
更多相關文章
  • 本文分享網址: http://www.cnblogs.com/DesertHero2013/p/7662721.html 1)目標:通過一個屬性的線性組合;來進行預測模型。即: 其中 是 ;w和b學成後,模型就確定了。 其實 可以理解成各個屬性值的權值。 2)性能度量: 求出均方誤差並使它最小化,就 ...
  • require 的使用方法如 require("MyRequireFile.php"); 。這個函數通常放在 PHP 程式的最前面,PHP 程式在執行前,就會先讀入 require 所指定引入的文件,使它變成 PHP 程式網頁的一部份。常用的函數,亦可以這個方法將它引入網頁中。 include 使用 ...
  • eclipse 導出Runnable JAR file 導出後如果系統沒有JRE,雙擊無法運行,需要用命令方法 安裝後解決,如圖 雙擊後閃退的原因,通過執行 java -jar TingGe.jar ,發現如圖 原來所需要的圖片、聲音等內容雖然打包到其中,但是路徑差了一個新的命名層,內容都在包里,而 ...
  • jquery框架中提供了$.ajax、$.get、$.post方法,用於進行非同步交互,由於Django中預設使用CSRF約束,推薦使用$.get 示例:實現省市區的選擇 最終實現效果如圖: 將jquery文件拷貝到static/js/目錄下 打開booktest/views.py文件,定義視圖are ...
  • 考慮用靜態工廠方法替代構造器 考慮使用靜態工廠方法來替代構造器的原因: 考慮下麵的程式: 該代碼的含義是返回一個很有可能是質數並且長度為3的BigInteger對像,這裡的長度只的是將整數裝換成二進位後的長度;很有可能指的是:不是質數的概率不超過2-100。 但是如果使用的是構造函數:BigInte ...
  • 今天在一段程式中看到這樣一個很奇怪的語句: 博主查了之後發現業界稱其萬能頭文件,這個頭文件包含瞭如下等頭文件,幾乎包含了所有的C++標準庫頭文件,使用後代碼中省去了相當多的頭文件的書寫 但也有以下兩個缺點: 1、因其包含的頭文件的過多,導致程式編譯慢 2、其不屬於標準庫裡面的頭文件,只是gcc的內部 ...
  • 閑來沒事,想整理下一些知識。 這篇文章是關於spring的web程式的搭建,有什麼不對的地方希望大家批評指正。 首先我們要瞭解什麼是spring,這裡可能很多大家也都明白,無非是一個管理對象的一個容器,主要體現在IOC註入和AOP切麵編程。 關於上面的兩點在後面一點會給大家更具體的說明一下是什麼。 ...
  • 視頻直播是指利用互聯網及流媒體技術進行直播,視頻因融合了圖像、文字、聲音等豐富元素,聲形並茂,效果極佳,逐漸成為互聯網的主流表達方式。初期相關參考:HTTP 長連接和短連接灰度發佈A/B測試今天先到這兒,希望對您在系統架構設計與評估,團隊管理, 項目管理, 產品管理,團隊建設 有參考作用 , 您可能... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...