設計模式學習總結 3 策略模式

2022-05-17 14:59:19 字數 1466 閱讀 3879

策略模式(strategy):

屬於行為模式

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

什麼意思呢,我想的是,演算法獨立於客戶,我們把一些演算法具體實現封裝起來,成為具體的類,而每乙個演算法獨立為一種具體策略,把演算法和環境(context)獨立開來,這樣有利於演算法的擴充套件,很明顯,這種模式很適合用於策略容易發生變化的業務。還是以具體的例項做基礎吧。

假設這樣的業務,遊樂場,我們針對不同的專案,計算不同的開銷,其實我不了解具體開銷是不是以演算法的形式,但是我們假設每一種開銷有一種固定演算法。假設一開始,我們支援過山車,碰碰車,海盜船,最簡單的實現是這樣:

enum

gametype ;

class

economic:

}}

當然這樣也是可以實現,但是這樣不好,如果我們需要支援更多的專案,我們還要加多的列舉type,然後新增加乙個case,比如自由落體專案,那還得修改**。很明顯違背了"開放封閉原則"。這樣的例子是最好用策略模式的,首先,這裡的確需要多種演算法(策略),並且演算法可能增加(變化)。運用策略模式,那麼我們首先需要抽象乙個策略基類。然後將演算法從環境類(這裡是economic)裡面分離出來,在策略基類中實現它們。

所以,改成這樣是不是好一點:

定義抽象策略類。

class

typestrategy

將已有業務演算法實現:

class rollerstrategy:public

typestrategy

}

class pocarstrategy:public

typestrategy

}

class pirateshipstrategy:public

typestrategy

}

定義演算法的執行環境類:

class

economic

~economic()

double

calculateout()

}

如果有必要,還得定義乙個context物件來保證演算法和類之間的資料。

現在,我們假設需要增加乙個專案,比如是鬼屋。

我們只需要定義我們的演算法即可,做如下改動:

//

擴充套件class shriedstrategy:public

typestrategy

}

而不需要對別的地方進行改動。保證了"開放封閉原則"。

書上給的策略模式結構圖是這樣的:

可以看到實現context和strategy的分離,然後對strategy進行抽象。

設計模式3策略模式

一種定義一系列演算法的方法,從概念上來看所有這些演算法完成的都是相同的工作,只是實現不同,它們可以以相同的方式呼叫相同的演算法,減少了各種演算法類和使用演算法類之間的耦合 策略模式的 策略類 為 所有context 定義了一系列的可供重用的演算法和行為.繼承有助於析取出這些演算法中的公共行為 策略模...

學習設計模式 策略模式

以下絕大部分內容 大話設計模式 c 定義演算法家族,分別封裝起來,讓它們之間可以互相替換,讓演算法變化,不會影響到使用者 good 適合類中的成員以方法為主,演算法經常變動 簡化了單元測試 因為每個演算法都有自己的類,可以通過自己的介面單獨測試。策略模式和簡單工廠基本相同,但簡單工模式只能解決物件建...

設計模式學習 策略模式

看完了策略模式的講解,然後將之於之前的簡單工廠模式對比了一下,策略模式就是將具體的演算法變化封裝了一下,可以將兩者結合一起使用,這樣的話封裝度會更加高一點,而且在更改演算法和新增演算法的時候更加方便。大話設計模式 書中是用商場收銀做例子,我將之用簡單工廠模式做了之後,現在把之前的計算例子再拿出來給一...