設計模式(二) 策略模式

2022-09-13 02:03:14 字數 2101 閱讀 5557

策略模式(strategy):他定義了演算法家族,分別封裝起來,讓他們之間可以相互替換,此模式讓演算法的變化,不會影響到演算法的客戶端。

當有一組演算法完成的都是相同的工作,只是實現不同,以相同的方式呼叫所有的演算法。在這種情況下可以使用策略模式,可減少各類演算法類與使用演算法類之間的耦合。

這邊就以簡單的數字加減舉例。

1

static

class

calculate

2 else

if (symbol ==subtract)

1316

17return

result;18}

19 }

這樣寫的化,在後期**擴充套件*或者/的時候,就需要新增新的if 判斷,**臃腫且擴充套件性低。

如果使用策略模式,將各類運算歸結到不同的策略中,會有很強的擴充套件性。那下面看下該模式。

策略模式結構圖:

組成:

1.抽象策略角色(straetegy):這是乙個抽象類,通常情況下使用介面或抽像類去實現。

2.具體策略角色(concretestrategya....):包裝了具體的演算法和行為。也就是實現 抽象策略角色 介面的實現類。

3.環境角色(context):持有乙個抽象角色的引用,給客戶端呼叫。

結構圖的實現:

strategy 類,定義所有支援的演算法和公共介面:

1

abstract

class

strategy

2

concretestrategy,封裝了具體的演算法或行為,繼承於strategy.

1

//具體演算法a

2class

concretestrategya : strategy38

}910//

具體演算法b

11class

concretestrategyb : strategy

1217}18

19//

具體演算法 c

20class

concretestrategyc : strategy

2126 }

context,用乙個concretestrategy來配置,維護乙個對strategy物件的引用。

//

上下文class

context

//上下文

public

void

contextinte***ce()

}

客戶端**

1

static

void main(string

args)

2

了解了策略模式,那改寫一下上面的加減演算法吧。

1

//定義抽象類介面

2public

inte***ce

icalculator36

7//加減的實現

8public

class

add : icalculator914

}1516public

class

sub : icalculator

1722}23

24//

上下文25

public

class

clccontext

2633

34public

double clc(double a, double

b)35

38 }

客戶端這樣呼叫就可以了

1

static

void main(string

args)

2

如果後期在加乘法的擴充套件就會方便很多,新增類繼承即可。

策略模式還可以於 簡單過程模式 結合,使**的耦合度更加降低。

設計模式 二 策略模式

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

設計模式(二) 策略模式

策略模式 strategy 它定義了乙個演算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。現金收費抽象類 abstract class cashsuper 正常收費子類 class cashnormal cashsuper 打折收費子類 class ...

設計模式(二) 策略模式

策略模式定義了演算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。我們來實現乙個簡單的商場收銀軟體功能來闡述策略模式 1.我們先來定義乙個收費方式的基類,如下 using system namespace strategy 2.收費方案,如下 usin...