演算法與物件的耦合:
物件可能經常需要使用多種不同的演算法,但是如果變化頻繁,會將型別變得脆弱
...動機:
在軟體構建過程中,某些物件使用的演算法可能多種多樣,經常改變,如果將這些演算法都編碼物件中,將會使物件變得異常複雜
;而且有時候支援不使用的演算法也是乙個效能負擔。
如何在執行時根據需要透明地更改物件的演算法?將演算法與物件本身解耦,從而避免上述問題?
意圖:
定義一系統的演算法,把它們乙個個封裝起來,並且使它們可相互替換。本模式使得演算法可獨立於使用它的客戶而變化。
--------
《設計模式》
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...