策略模式Strategy Pattern

2022-05-04 12:15:07 字數 4016 閱讀 4646

演算法與物件的耦合:

物件可能經常需要使用多種不同的演算法,但是如果變化頻繁,會將型別變得脆弱

...動機:

在軟體構建過程中,某些物件使用的演算法可能多種多樣,經常改變,如果將這些演算法都編碼物件中,將會使物件變得異常複雜

;而且有時候支援不使用的演算法也是乙個效能負擔。

如何在執行時根據需要透明地更改物件的演算法?將演算法與物件本身解耦,從而避免上述問題?

意圖:

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

--------

《設計模式》

gof適用性:

1.許多相關的類僅僅是行為有異。「策略

」提供了一種用多個行為中的乙個行為來配置乙個類的方法。

2.需要使用乙個演算法的不同變體。例如,你可能會定義一些反映不同的空間

/時間權衡的演算法。當這些變體實現為乙個演算法的類層次時

[h087]

,可以使用策略模式。

3.演算法使用客戶不應該知道資料。可使用策略模式以避免暴露複雜的,與演算法相關的資料結構。

4.乙個類定義了多種行為,並且這些行為在這個類的操作中以多個條件語句的形式出現。將相關的條件分支移入它們各自的

strategy

類中以代替這些條件語句。

**實現:

1enum

sorttype21

class

sort29

else

if(s == sorttype.shellsort)

1013

else

if(s == sorttype.mergesort)

1417

console.writeline();18}

1920

protected

void

processa()

2124

protected

void

processb()

2528

protected

void

processc()

2932

}

客戶端呼叫:

1class

test210

}由此可見,由於客戶端新增呼叫方式的選擇,就會修改

sorttype

及sort

裡的判斷語句。在類

sort

中會增加

if語句的判斷,用敏捷軟體開發的語言說,你應該聞到了**的臭味道了,也就是設計模式中說的存在了變化的地方。

strategy

模式的幾個要點:

1.strategy

及其子類為元件提供了一系列可重用的演算法,從而可以使得型別在執行時方便地根據需要在各個演算法之間進行切換。所謂封裝演算法,支援演算法的變化。

2.strategy

模式提供了用條件判斷語句以外的另一種選擇,消除條件判斷語句,就是在解耦合。含有許多條件判斷語句的**通常都需要

strategy

模式。3.

與state

類似,如果

strategy

物件沒有例項變數,那麼各個上下文可以共享同乙個

strategy

物件,從而節省物件開銷

演算法與物件的耦合:

物件可能經常需要使用多種不同的演算法,但是如果變化頻繁,會將型別變得脆弱

...動機:

在軟體構建過程中,某些物件使用的演算法可能多種多樣,經常改變,如果將這些演算法都編碼物件中,將會使物件變得異常複雜

;而且有時候支援不使用的演算法也是乙個效能負擔。

如何在執行時根據需要透明地更改物件的演算法?將演算法與物件本身解耦,從而避免上述問題?

意圖:

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

--------

《設計模式》

gof適用性:

1.許多相關的類僅僅是行為有異。「策略

」提供了一種用多個行為中的乙個行為來配置乙個類的方法。

2.需要使用乙個演算法的不同變體。例如,你可能會定義一些反映不同的空間

/時間權衡的演算法。當這些變體實現為乙個演算法的類層次時

[h087]

,可以使用策略模式。

3.演算法使用客戶不應該知道資料。可使用策略模式以避免暴露複雜的,與演算法相關的資料結構。

4.乙個類定義了多種行為,並且這些行為在這個類的操作中以多個條件語句的形式出現。將相關的條件分支移入它們各自的

strategy

類中以代替這些條件語句。

**實現:

1enum

sorttype21

class

sort29

else

if(s == sorttype.shellsort)

1013

else

if(s == sorttype.mergesort)

1417

console.writeline();18}

1920

protected

void

processa()

2124

protected

void

processb()

2528

protected

void

processc()

2932

}

客戶端呼叫:

1class

test210

}由此可見,由於客戶端新增呼叫方式的選擇,就會修改

sorttype

及sort

裡的判斷語句。在類

sort

中會增加

if語句的判斷,用敏捷軟體開發的語言說,你應該聞到了**的臭味道了,也就是設計模式中說的存在了變化的地方。

重構以上**,增加一層中間層來處理變化。類結構如下:

1//stategy  

表達抽象演算法

2abstract

class

sortstrategy31

//concretestrategy

2class

shellsort :sortstrategy310

}1//concretestrategy

2class

mergesort :sortstrategy39

}1//concretestrategy

2class

quicksort :sortstrategy39

}1//context

2class

sortdlist310

public

void

add(

string

name)

1114

public

void

sort()

1522

console.writeline();23}

24}客戶端**如下:

1class

program225

}由此可見,更好地滿足開放封閉原則。

strategy模式的幾個要點:

1.strategy

及其子類為元件提供了一系列可重用的演算法,從而可以使得型別在執行時方便地根據需要在各個演算法之間進行切換。所謂封裝演算法,支援演算法的變化。

2.strategy

模式提供了用條件判斷語句以外的另一種選擇,消除條件判斷語句,就是在解耦合。含有許多條件判斷語句的**通常都需要

strategy

模式。3.

與state

類似,如果

strategy

物件沒有例項變數,那麼各個上下文可以共享同乙個

strategy

物件,從而節省物件開銷

模式 策略模式

前言 所有的設計模式都是基於程式設計屆前輩們的不斷實踐得出的解決一類問題中比較有效高效的程式設計方法。策略模式 策略模式用於解決業務中不同場景下統一行為的細微差別問題。策略模式遵循 開閉原則 舉個例子來說,在購物車功能中,結算 的時候會根據使用者的不同級別去打折,那麼打折計算 的這一行為就會有不同演...

策略模式(策略列舉)

首先定義乙個介面 package com.yecc.suanfa.strategy created by yecc on 2020 11 16 19 35 public inte ce strategy 定義三個繼承介面的類 package com.yecc.suanfa.strategy crea...

策略模式及Spring整合策略模式

抽象策略類 inte ce sortservice 具體策略類 class insertionsortserviceimpl implements sortservice else arr j 1 tmp return arr 氣泡排序 class bubblesortserviceimpl imp...