初窺設計模式 策略模式及相關應用場景

2021-08-19 16:09:04 字數 1422 閱讀 5763

一直覺得設計模式是非常高階的東西,之前也簡單的了解過一些,但總是沒有找到合適的應用場景,所以也沒能深入的去理解他。直到最近在工作中,需要寫乙個聯絡歷史的功能,每個記錄後邊要顯示該條記錄是多久之前產生的。寫完的時候用了很多的if else來判斷,看起來很不優雅,請教了leader之後,給我指點了一下,按照思路嘗試之後,一下子有種豁然開朗的感覺。其實設計模式並非高不可攀或是難以應用的東西,很多**只要我們嘗試去優化他,多想想其他的方式,就能摸到一點設計模式的門檻。所以今天就來記錄分享一下這個場景。

參考資料:

在策略模式(strategy pattern)中,乙個類的行為或其演算法可以在執行時更改。這種型別的設計模式屬於行為型模式。

在策略模式中,我們建立表示各種策略的物件和乙個行為隨著策略物件改變而改變的 context 物件。策略物件改變 context 物件的執行演算法。

意圖:定義一系列的演算法,把它們乙個個封裝起來, 並且使它們可相互替換。

主要解決:在有多種演算法相似的情況下,使用 if…else 所帶來的複雜和難以維護。

何時使用:乙個系統有許多許多類,而區分它們的只是他們直接的行為。

如何解決:將這些演算法封裝成乙個乙個的類,任意地替換。

關鍵**:實現同乙個介面。

優點: 1、演算法可以自由切換。 2、避免使用多重條件判斷。 3、擴充套件性良好。

缺點: 1、策略類會增多。 2、所有策略類都需要對外暴露。

需要寫乙個聯絡歷史的功能,每個記錄後邊要顯示該條記錄是多久之前產生的。寫完的時候用了很多的if else來判斷時間,看起來很不優雅,在這裡就可以用到策略模式的思路。把判斷條件寫成乙個物件陣列,然後直接遍歷陣列來得到結果,這樣**優雅,也便於後續的擴充套件和維護,非常棒棒。

**:

intervalconfig: [,,,,,,],

// 支援整數,date,時間字串三種格式轉為時間戳

tots(t) ,

now() ,

// 返回from距今還有多久

gettimeinterval(from) )

config = intervalconfig[index]

n = math.floor(seconds / config.divisor)

return n + config.text

}

結果顯示:

初窺設計模式之簡單工廠

設計模式在我看來整合了軟體設計者眾人的智慧型。我們想要利用前人智慧型設計軟體,而不是自己從頭開始摸索,那麼我們就需要站在巨人的肩膀上。設計模式便是巨人的肩膀。最近開始啃gof這些設計模式,希望通過在blog上的梳理加深自己的印象。簡單工廠模式 factory 裡的工廠其實是超級工廠。所有的建立任務都...

行為型 策略模式及相關應用

定義了演算法家族,分別封裝起來,讓它們之間可以互相替代,此模式讓演算法的辯護權啊不會影響到使用演算法的使用者。適用場景 在 期間商家有不同的 策略 返現 立減和滿減。策略抽象類 public inte ce promotionstrategy 返現策略 public class fanxianpro...

設計模式應用三 策略模式

商場打折 策略可以簡單分為 原價購買 滿減 返利三種策略 系統的操作都要有日誌記錄,通常會把日誌記錄在資料庫裡面,方便後續的管理,但是在記錄日誌到資料庫的時候,可能會發生錯誤,比如暫時連不上資料庫了,那就先記錄在檔案裡面。日誌寫到資料庫與檔案中是兩種演算法,但呼叫方不關心,只負責寫就是 根據狀態進行...