設計模式

代理模式

靦腆不敢當面送妹子禮物,於找到她閨蜜代轉
這裏的閨蜜就是代理

但是禮物是你送的
妹子也知道是你送的,但是獲取禮物通過閨蜜(代理)獲取的

場景:

  1. 遠程代理:比如net 的webservice,
  2. 虛擬代理
  3. 安全代理

工廠模式

簡單工廠 VS工廠方法
簡單工廠類中會有必要的判斷,應該產生哪一個具體的對象
工廠方法:定義一個創建對象的接口,讓子類去決實例化某一個類;工廠方法讓一個類的實例化延遲到其子類

抽象工廠模式

提供一個創建一系列相關或相互依賴對象的接口,而無需指定他們具體的類
比如mvc 開發中的dao層,都是先定義接口
在service層也是使用dao的接口類型
如果需要更換數據庫,這需要添加dao的新的實現類而其他使用到dao的地方可以被無感替換

原型模式

基於已有的對象"複製"一份新的出來
以簡歷爲例,如果需要20紛簡歷,那麼需要new 20次,如果某個字錯了,也需要改20個地方
如果使用原型模式
而如果使用原型模式(比如 clone 方法,避免了重新new),而且clone產生的對象,信息也可以修改,不影響之前的對象,但是會影響之後對象
clone 就是基於之前的對象,然後創建一個新的對象(屬性內容都一樣,但是內存地址是不一樣的)
場景:

  1. 對象的初始化操作比較耗時
  2. 初始化信息基本不變
    深複製與淺複製:
    前者是申請新的內存(啥都是2份)
    後者是新指針指向之前的對象內存(引用類型的屬性,只是複製引用,但是不會複製被引用的對象,也就是被引用的對象還是1份)
    java 實現拷貝的方法:

. clone 接口(注意是淺拷貝)
. serializable 序列化接口,通過對象流寫入文件,然後可以多次讀取,創建新的拷貝對象

模板方法模式

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

以考試抄寫題幹爲例
每個學生考試都需要抄寫考試題,
如果每人抄寫一份,可能出現題幹抄寫錯誤
但是如果將試卷復印出來,發給大家就好了.

於是可以將試卷題目提取出來成立一個類Paper
學生只需要拿到卷子答題即可
Paper 一個抽象方法,answer()
子類去實現,用以填寫答案;(每個學生自己填自己的試卷)
模板方法特點:

  1. 通過把不變行爲搬移到超類,去除子類中的重複代碼
  2. 提取共同點,抽象到父類

迪米特法則

如果兩類不必彼此直接通信,那麼這兩個類就不應當發生直接的相互作用。如果其中一個類需要調用另一個類的 某一個方法的化,可以通過第三者轉發這個調用。

建造者模式

用於創建一些複雜的對象,這些對象內部構建間的建造順序通常是穩定的,但是內部的構建面臨着複雜的變化

觀察者模式

或者是叫做訂閱發佈模式
觀察者對象持有所有訂閱了該觀察者的的對象,如果狀態發生變化,可以統一通知訂閱者
場景;
當一個對象的改變需要同時改變其他對象的時候
觀察者模式所做的工作實在解除耦合,讓耦合的雙方都依賴抽象,而不是依賴具體

適配器模式

翻譯
場景:想使用一個已存在的類,但是他的接口,也就是他的方法和你要求不同時,可以考慮使用適配器模式
特別是當項目中需要第三方接口支持時,一般不是去改變自己原有的接口,而是增加適配器本項目使用第三方提供的服務
在這裏插入圖片描述

備忘錄模式

用來記住狀態,比如遊戲中需要存檔,保存退出時玩家的狀態
缺點:角色狀態需要完整的存儲到備忘錄對象中,如果狀態數據很大很多,資源消耗也是也個問題.
在這裏插入圖片描述

組合模式

定義:將對象組合成樹形結構以表示"部分-整體"的側層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。
在這裏插入圖片描述
問題:一個公司有很多分公司,如何將一套系統應用到所有公司?
可以把總公司看做樹根,其他分公司就是子節點(分支)
在這裏插入圖片描述場景:需求中是體現部分與整體層次的結構時,希望用戶可以忽略組合對象與單個對象的不同,統一的使用組合結構中的所有對象時,就應該考慮使用組合模式
組合模式讓客戶可以一致的使用組合結構和單個對象

在這裏插入圖片描述

責任鏈模式

定義:使多個對象都有機會處理請求,從何避免請求的發送者與接收者之間的耦合關係,將這個對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理他爲止
優點: 可以隨時增加或修改處理一個請求的結構
注意:如果請求到達末端還不能處理,就會出現問題
在這裏插入圖片描述

享元模式

定義:運用共享技術有效支持大量細粒度的對象
實例:
java 中的String,字符串常量,在常量池是使用享元模式的,
String a=“java”;// 檢查常量池,如果不存在,新建,並創建引用返回
String b=“java”;//檢查常量池,存在,直接返回創建引用指向,並返回
a==b 是true,
(注意:使用 new 創建的對象是在堆上)
又如圍棋遊戲,一盤棋理論上有361個位置可以放棋子,常規面向對象,每盤棋可能有兩三百個棋子對象產生,如果使用享元模式,棋子可以減少到2個

訪問者模式

定義:表示一個作用於某對象結構中的個各元素的操作,它是你可以在不改變各元素的類的前提下,定義作用於這些元素的新操作
場景:訪問者模式將數據結構和作用於結構上的操作之間的耦合解脫開,是的操作集合可以相對自由地演化
**目的:**把處理從數據結構中分離出來。
比如很多系統可以按照算法和數據結構分開,如果這樣的系統有比較穩定的數據結構,又有易於變化的算法的話,使用訪問者模式比較合適,因爲訪問者模式使得算法操作的增加變得容易。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章