簡(jiǎn)述:
在軟件開(kāi)發(fā)中常常遇到這種情況,實(shí)現(xiàn)某一個(gè)功能有多種算法或者策略,我們可以根據(jù)環(huán)境或者條件的不同選擇不同的算法或者策略來(lái)完成該功能镜雨。如查找崔兴、排序等暴凑,一種常用的方法是硬編碼(Hard Coding)在一個(gè)類中,如需要提供多種查找算法,可以將這些算法寫(xiě)到一個(gè)類中,在該類中提供多個(gè)方法捞魁,每一個(gè)方法對(duì)應(yīng)一個(gè)具體的查找算法;當(dāng)然也可以將這些查找算法封裝在一個(gè)統(tǒng)一的方法中离咐,通過(guò)if…else…或者case等條件判斷語(yǔ)句來(lái)進(jìn)行選擇谱俭。
這兩種實(shí)現(xiàn)方法我們都可以稱之為硬編碼,如果需要增加一種新的查找算法宵蛀,需要修改封裝算法類的源代碼旺上;更換查找算法,也需要修改客戶端調(diào)用代碼糖埋。在這個(gè)算法類中封裝了大量查找算法,該類代碼將較復(fù)雜窃这,維護(hù)較為困難瞳别。如果我們將這些策略包含在客戶端,這種做法更不可取杭攻,將導(dǎo)致客戶端程序龐大而且難以維護(hù)祟敛,如果存在大量可供選擇的算法時(shí)問(wèn)題將變得更加嚴(yán)重。
把一個(gè)類中經(jīng)常改變或者將來(lái)可能改變的部分提取出來(lái)兆解,作為一個(gè)接口馆铁,然后在類中包含這個(gè)對(duì)象的實(shí)例,這樣類的實(shí)例在運(yùn)行時(shí)就可以隨意調(diào)用實(shí)現(xiàn)了這個(gè)接口的類的行為锅睛。
比如定義一系列的算法,把每一個(gè)算法封裝起來(lái), 并且使它們可相互替換埠巨,使得算法可獨(dú)立于使用它的客戶而變化历谍。這就是策略模式。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1辣垒、可以動(dòng)態(tài)的改變對(duì)象的行為
缺點(diǎn):
1望侈、客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類
2勋桶、策略模式將造成產(chǎn)生很多策略類
實(shí)現(xiàn)思路
1.策略的抽象(規(guī)定子類的操作而不做具體操作)
2.實(shí)現(xiàn)或者繼承抽象類做具體的操作
3.操作策略的類
實(shí)現(xiàn)代碼
小明某一天到了怡紅院開(kāi)始選擇他的女神 這個(gè)選擇的過(guò)程就可以稱之為一個(gè)策略
1.策略的抽象:
interface IStrategy {
fun operate()
}
2.具體的實(shí)現(xiàn)策略類
//策略一
class StrategyOne :IStrategy{
override fun operate() {
println("小*瑪利亞")
}
}
//策略二
class StrategyTwo :IStrategy{
override fun operate() {
println("蒼井*")
}
}
//策略三
class StrategyThree :IStrategy{
override fun operate() {
println("波多野結(jié)*")
}
}
3.操作策略的類
//怡紅院
class YihongGarden(iStrategy: IStrategy) {
val iStrategy = iStrategy
fun operate() {
iStrategy.operate()
}
}
4.執(zhí)行看結(jié)果
fun main(args: Array<String>) {
val one = YihongGarden(StrategyOne())
one.operate()
val two = YihongGarden(StrategyTwo())
two.operate()
val three = YihongGarden(StrategyThree())
three.operate()
}
當(dāng)然你可以用這種方法實(shí)現(xiàn)
fun main(args: Array<String>) {
operate(1)
operate(2)
operate(3)
}
fun operate(strategy:Int) {
when(strategy){
1-> println("小*瑪利亞")
2-> println("蒼井*")
3-> println("波多野結(jié)*")
}
}
可是你要知道這只是一個(gè)Demo每個(gè)邏輯里面代碼只有一行可是你項(xiàng)目里面肯定不只一行吧
這種方法用到你項(xiàng)目里可能會(huì)造成可讀性很差脱衙、代碼特別臃腫、難以維護(hù)