策略模式
策略模式是指對(duì)一系列的算法定義赎瑰,并將每一個(gè)算法封裝起來(lái),而且使它們還可以相互替換破镰。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化餐曼。
策略模式的優(yōu)點(diǎn)有:策略模式提供了管理相關(guān)的算法族的辦法、策略模式提供了可以替換繼承關(guān)系的辦法啤咽、使用策略模式可以避免使用多重條件轉(zhuǎn)移語(yǔ)句晋辆。
組成
—抽象策略角色: 策略類,通常由一個(gè)接口或者抽象類實(shí)現(xiàn)宇整。
—具體策略角色:包裝了相關(guān)的算法和行為。
—環(huán)境角色:持有一個(gè)策略類的引用芋膘,最終給客戶端調(diào)用鳞青。
概念
1、需要使用ConcreteStrategy提供的算法为朋。
2臂拓、 內(nèi)部維護(hù)一個(gè)Strategy的實(shí)例。
3习寸、 負(fù)責(zé)動(dòng)態(tài)設(shè)置運(yùn)行時(shí)Strategy具體的實(shí)現(xiàn)算法胶惰。
4、負(fù)責(zé)跟Strategy之間的交互和數(shù)據(jù)傳遞霞溪。
Strategy(抽象策略類):
1孵滞、 定義了一個(gè)公共接口,各種不同的算法以不同的方式實(shí)現(xiàn)這個(gè)接口鸯匹,Context使用這個(gè)接口調(diào)用不同的算法坊饶,一般使用接口或抽象類實(shí)現(xiàn)。
ConcreteStrategy(具體策略類):
2殴蓬、 實(shí)現(xiàn)了Strategy定義的接口匿级,提供具體的算法實(shí)現(xiàn)。
應(yīng)用場(chǎng)景
應(yīng)用場(chǎng)景:
1染厅、 多個(gè)類只區(qū)別在表現(xiàn)行為不同痘绎,可以使用Strategy模式,在運(yùn)行時(shí)動(dòng)態(tài)選擇具體要執(zhí)行的行為肖粮。
2孤页、 需要在不同情況下使用不同的策略(算法),或者策略還可能在未來(lái)用其它方式來(lái)實(shí)現(xiàn)尿赚。
3散庶、 對(duì)客戶隱藏具體策略(算法)的實(shí)現(xiàn)細(xì)節(jié)蕉堰,彼此完全獨(dú)立。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1悲龟、 策略模式提供了管理相關(guān)的算法族的辦法屋讶。策略類的等級(jí)結(jié)構(gòu)定義了一個(gè)算法或行為族。恰當(dāng)使用繼承可以把公共的代碼轉(zhuǎn)移到父類里面须教,從而避免重復(fù)的代碼皿渗。
2、 策略模式提供了可以替換繼承關(guān)系的辦法轻腺。繼承可以處理多種算法或行為乐疆。如果不是用策略模式,那么使用算法或行為的環(huán)境類就可能會(huì)有一些子類贬养,每一個(gè)子類提供一個(gè)不同的算法或行為挤土。但是,這樣一來(lái)算法或行為的使用者就和算法或行為本身混在一起误算。決定使用哪一種算法或采取哪一種行為的邏輯就和算法或行為的邏輯混合在一起仰美,從而不可能再獨(dú)立演化。繼承使得動(dòng)態(tài)改變算法或行為變得不可能儿礼。
3咖杂、 使用策略模式可以避免使用多重條件轉(zhuǎn)移語(yǔ)句。多重轉(zhuǎn)移語(yǔ)句不易維護(hù)蚊夫,它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為的邏輯混合在一起诉字,統(tǒng)統(tǒng)列在一個(gè)多重轉(zhuǎn)移語(yǔ)句里面,比使用繼承的辦法還要原始和落后知纷。
缺點(diǎn):
1壤圃、客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類屈扎。這就意味著客戶端必須理解這些算法的區(qū)別埃唯,以便適時(shí)選擇恰當(dāng)?shù)乃惴悺Q言之鹰晨,策略模式只適用于客戶端知道所有的算法或行為的情況墨叛。
2、 策略模式造成很多的策略類模蜡,每個(gè)具體策略類都會(huì)產(chǎn)生一個(gè)新類漠趁。有時(shí)候可以通過(guò)把依賴于環(huán)境的狀態(tài)保存到客戶端里面,而將策略類設(shè)計(jì)成可共享的忍疾,這樣策略類實(shí)例可以被不同客戶端使用闯传。換言之,可以使用享元模式來(lái)減少對(duì)象的數(shù)量卤妒。
UML
代碼:
接口類
public interface Execute {
public int executeStrategy(int a, int b );
}
接口實(shí)現(xiàn)類
public class Add implements Execute{
@Override
public int executeStrategy(int a, int b) {
// TODO Auto-generated method stub
return a+b;
}
}
public class Minus implements Execute{
@Override
public int executeStrategy(int a, int b) {
// TODO Auto-generated method stub
return a-b;
}
}
策略包裝類
public class Context {
private Execute execute;
public Context(Execute execute)
{
this.execute = execute;
}
public int executeStrategy(int a , int b)
{
return execute.executeStrategy(a, b);
}
}
測(cè)試類
public class Test {
public static void main(String[] args) {
Context context = new Context(new Times());
int a = context.executeStrategy(12, 10);
System.out.println(a);
}
}