設計模式(一) 策略模式

2022-09-15 23:24:24 字數 1713 閱讀 4448

一、模式動機

為什麼要使用策略模式呢?在日常開發中,我們可以發現一種需求可以有不同的方法來實現,比如我們要對乙個陣列進行排序,就可以使用多種不同的排序方法(選擇排序、氣泡排序、快速排序等),每一種排序方法都可以被稱作一種策略,我們可以在不同的情況下來選擇不同的策略進行排序。在實現的時候我們可能會寫乙個演算法類,包含了所有的排序演算法,接著在我們需要排序的類(簡稱客戶端)中建立演算法類的物件,然後寫一大段if...else來選擇物件類中不同的排序演算法。這種實現方式比較容易想到,但如果我們要增加一種新的排序演算法,那麼需要修改兩個類:演算法類和客戶端,擴充套件和維護起來非常麻煩。為了解決這個問題,我們可以將每乙個排序演算法封裝在乙個獨立的類中,這樣乙個獨立的類我們稱之為一種策略,為了保證這些策略的一致性,我們要建立乙個抽象策略類,讓包含排序演算法的具體策略類實現抽象策略類。

二、模式定義

策略模式定義了演算法族,並將這些演算法封裝起來成為類,讓它們之間可以相互替換,此模式讓演算法的變化獨立於使用演算法的客戶。

三、模式結構

策略模式涉及到3個角色:

2、strategy:抽象策略類,通常由介面或抽象類實現;

3、concretestrategy:具體策略類,實現了抽象策略類。

這3種角色的**可以用以下方式實現:

抽象策略類strategy:

public

inte***ce

strategy

具體策略類concretestrategy:

具體策略類實現了抽象策略類:

public

class concretestrategya implements

strategy

}

public

class concretestrategyb implements

strategy

}

環境類context:

public

class

context

//呼叫策略類中的演算法

public

void

contextinte***ce()

}

可以在客戶端client類中進行測試:

public

class

client

}

可以看到,在環境類context中持有乙個抽象的strategy物件,而不是某乙個具體的策略類,這樣利用多型特性,當有新的排序演算法時,我們只需要實現strategy介面,而不用去修改客戶端,也就是針對介面程式設計,而不是針對實現程式設計。通過策略模式,演算法的使用和演算法的實現被分離開來。

四、優缺點

優點:

1、策略類易於擴充套件和維護;

2、使用策略模式可以避免使用多重條件轉移語句

缺點:

1、客戶端必須實現知道所有的策略類,並自行決定使用哪乙個策略類;

2、在策略模式中將每一種演算法都封裝成乙個策略類,這樣會造成策略類過多,維護起來會帶來額外開銷。

五、適用場景

1、系統中的類主要邏輯相同,只是部分邏輯的實現方法不同,這樣使用策略模式就可以動態的選擇不同的行為;

2、需要安全地封裝同一型別的操作。

設計模式(一) 策略模式

設計模式 一 策略模式 本文描述的是策略模式 我們假設有如下場景 我們使用聊天工具聊天時,可以傳送點對點訊息 私聊 和點對多訊息 群聊 而傳送不同的訊息執行的操作是不一樣的,也就是說我們在不同的場景下 私聊或者群聊 傳送訊息時會呼叫不同的傳送方法,但是我們只有乙個訊息傳送器 可以理解為傳送訊息時的傳...

設計模式 一 策略模式 1

策略模式用到就是 多型 的思想,父類有多個子類,為同乙個行為實現不同的表現形式 舉例 1個中國人,1個印度人,他們都吃飯,但是中國人是用筷子,印度人是用手,這個就是多型,同一行為的2種實現方式 吃飯行為 public inte ce eating中國人和印度人 public class chines...

設計模式 策略設計模式

策略設計模式其實就是多型的使用,父類引用指向子類物件。策略模式的最大特點是使得演算法可以在不影響客戶端的情況下發生變化,從而改變不同的功能。策略模式的缺點其實也很明顯,在於策略模式把每一種具體的策略都封裝成乙個實現類,如果策略有很多的話,很顯然是實現類就會導致過多,顯得臃腫。案列 author de...