策略模式,顧名思義,我是沒(méi)看懂。
不知道為什么稱它為策略模式,但通過(guò)學(xué)習(xí),我知道這種模式可以讓我的代碼分工明確,實(shí)現(xiàn)了操作和使用者的解耦。
策略模式共分三個(gè)部分:
1.你的操作方法的接口,定義了一個(gè)實(shí)現(xiàn)的方法
2.你的操作方法的具體實(shí)現(xiàn)
3.環(huán)境類,用來(lái)對(duì)具體的操作方法進(jìn)行設(shè)置,比如執(zhí)行等
舉個(gè)栗子??!
需求:我有三個(gè)算法,分別可以解決三個(gè)問(wèn)題,那么我得看看問(wèn)題是什么來(lái)選用不同的方法。
解決方法1:
int questionID = 1; //假設(shè)問(wèn)題是第一個(gè),id為1
if(questionID == 1)
{
fun1();
} else if(questionID == 2)
{
fun2();
}else if(questionID == 3)
{
fun3();
}
以上就是對(duì)問(wèn)題編號(hào)先進(jìn)行判斷,通過(guò)if語(yǔ)句來(lái)找到對(duì)應(yīng)的實(shí)現(xiàn)方法。完美!
不好的一點(diǎn)就是,如果算法特別多,再修改就會(huì)亂七八糟的,既要修改方法,又要在if語(yǔ)句這里進(jìn)行修改,多到一定程度,我就爆炸了!BOOM!
所以,我愿意犧牲一點(diǎn)時(shí)間,把方法和使用分離開(kāi),這里就可以用到策略模式。
我們先寫(xiě)一個(gè)大接口!
interface Strategy {
void operate();
}
定義了一個(gè)operate()方法,實(shí)現(xiàn)這個(gè)接口的也要實(shí)現(xiàn)這個(gè)方法,這是我們定的規(guī)則。
再寫(xiě)三個(gè)復(fù)雜的算法!
class Algorithm1 implements Strategy {
@Override
public void operate() {
System.out.println("algorithm1");
}
}
class Algorithm2 implementsStrategy {
@Override
public void operate() {
System.out.println("algorithm2");
}
}
class Algorithm3 implementsStrategy {
@Override
public void operate() {
System.out.println("algorithm3");
}
}
這三個(gè)算法都實(shí)現(xiàn)了那個(gè)大接口。
最后寫(xiě)一個(gè)封裝類Context:
class Context {
Strategy strategy;
public Context(Strategy strategy) {
this.strategy= strategy;
}
public void operate(){
strategy.operate();
}
}
封裝類的意義就是可以對(duì)Strategy進(jìn)行操作,有時(shí)候是可以去掉的。
調(diào)用方法:
Context context =newContext(new Algorithm1());
context.operate();
這樣就把方法解耦出來(lái),形成一個(gè)實(shí)現(xiàn)Strategy的單獨(dú)的類了,我們?cè)鎏韯h改算法的時(shí)候,就會(huì)清晰很多,但是if還是要寫(xiě)的!(我去,這不還是很亂么!)策略模式只是做解耦,并不能把判斷語(yǔ)句都取代了呀。如果你想讓判斷語(yǔ)句好看,你可以用switch,用反射辣。