在策略模式(Strategy Pattern)中,一個類的行為或其算法可以在運(yùn)行時(shí)更改鉴腻。這種類型的設(shè)計(jì)模式屬于行為型模式。
在策略模式中,我們創(chuàng)建表示各種策略的對象和一個行為隨著策略對象改變而改變的 context 對象量淌。策略對象改變 context 對象的執(zhí)行算法。
意圖
:定義一系列的算法,把它們一個個封裝起來, 并且使它們可相互替換嫌褪。
主要解決
:在有多種算法相似的情況下类少,使用 if...else 所帶來的復(fù)雜和難以維護(hù)。
何時(shí)使用
:一個系統(tǒng)有許多許多類渔扎,而區(qū)分它們的只是他們直接的行為硫狞。
如何解決
:將這些算法封裝成一個一個的類,任意地替換。
關(guān)鍵代碼
:實(shí)現(xiàn)同一個接口
示例:
//步驟 1
//創(chuàng)建一個接口残吩。
interface Strategy {
fun doOperation(num1: Int, num2: Int): Int
}
//步驟 2
//創(chuàng)建實(shí)現(xiàn)接口的實(shí)體類财忽。
class OperationAdd : Strategy {
override fun doOperation(num1: Int, num2: Int): Int {
return num1 + num2
}
}
class OperationSubtract : Strategy {
override fun doOperation(num1: Int, num2: Int): Int {
return num1 - num2
}
}
//步驟 3
//創(chuàng)建 Context 類。
class Context(val strategy: Strategy) {
fun executeStrategy(num1: Int, num2: Int): Int {
return strategy.doOperation(num1, num2)
}
}
//步驟 4
//使用 Context 來查看當(dāng)它改變策略 Strategy 時(shí)的行為變化泣侮。
fun main(args: Array<String>) {
var context = Context(OperationAdd())
println("10 + 5 = " + context.executeStrategy(10, 5))
context = Context(OperationSubtract())
println("10 - 5 = " + context.executeStrategy(10, 5))
}
//打印結(jié)果:
//10 + 5 = 15
//10 - 5 = 5