我是一個java初學者,我下面寫的東西都是我個人的猜想,樓主可以作為參考,但不要相信。--------感覺由context包裝以后的耦合性更低一些,傳入不同的new AddStrategy(),context.calculate(10, 5)會實現(xiàn)不同的功能,通過這樣的方式,如果通過配置文件的方式來實現(xiàn)對算法的配置,直接利用接口就把代碼寫死了,而策略模式由于具有低耦合性就可以通過配置對象來配置不同的算法。。
創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領(lǐng)域包括:成都做網(wǎng)站、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的墨竹工卡網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
我認為策略模式是java眾多模式中最常用,最常見的一種模式。
一句話說,針對同一命令(或行為),不同的策略做不同的動作。 (個人總結(jié) 難免疏漏 海涵)
舉例來說,一個接口有兩個實現(xiàn):
interface RunBehavior {
public void performRun();
}
class Run implements RunBehavior {
public void performRun() { System.out.println(" I can run!"); }
}
class JumpAsRun implements RunBehavior {
public void performRun() { System.out.println("I cannot run, but I can jump!"); }
}
解釋一下這段簡單的程序
跑是一種行為(接口)
正常的動物都可以跑(class Run)
麻雀是不能跑的,它只能跳(class JumpAsRun)
這樣的話,其實我們有了一個行為的請求,那就是跑,然后我們有兩個策略供選擇。
那么如何調(diào)用呢?
class Anmial {
RunBehavior runBehavior;
public void run() {
this.runBehavior.performRun();
}
public void setRunBehavior(RunBehavior runBehavior) {
this.runBehavior = runBehavior;
}
}
下面真正開始調(diào)用:
public class TestStrategy{
public static void main(String args[]) {
RunBehavior rb1 = new Run();
Animal tiger = new Animal();
tiger.setRunBehavior(rb1);
tiger.run();
RunBehavior rb2 = new JumpAsRun();
Animal bird = new Animal();
bird.setRunBehavior(rb2);
bird.run();
// 上面的老虎和鳥分別用了一個策略,下面讓老虎用鳥的策略
// 看看會發(fā)生什么
tiger.setRunBehavior(rb2);
tiger.run();
// 其實策略模式的重點就在這兒,給對象傳入什么樣的策略,執(zhí)行什么樣的動作。
}
}
具體的還要你自己多思考了,推薦《Head First Desigh Pattern》
全手工敲入代碼,估計你需要微調(diào)如果想運行的話
工廠模式是創(chuàng)建型模式
策略模式是行為性模式
一個關(guān)注對象創(chuàng)建
一個關(guān)注行為的封裝
策略模式就是定義一系列的算法,這些算法可以在需要的時候替換和擴展.工廠模式是生成型的模式,在你需要的時候構(gòu)建具體的實例.
在下面的情況下應當考慮使用策略模式:
1. 如果在一個系統(tǒng)里面有許多類,它們之間的區(qū)別僅在于它們的行為,那么使用策略模式可以動態(tài)地讓一個對象在許多行為中選擇一種行為。
2.
一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種。那么這些算法可以包裝到一個個的具體算法類里面,而這些具體算法類都是一個抽象算法類的子類。換言之,這些具體
算法類均有統(tǒng)一的接口,由于多態(tài)性原則,客戶端可以選擇使用任何一個具體算法類,并只持有一個數(shù)據(jù)類型是抽象算法類的對象。
3. 一個系統(tǒng)的算法使用的數(shù)據(jù)不可以讓客戶端知道。策略模式可以避免讓客戶端涉及到不必要接觸到的復雜的和只與算法有關(guān)的數(shù)據(jù)。
4. 如果一個對象有很多的行為,如果不用恰當?shù)哪J?,這些行為就只好使用多重的條件選擇語句來實現(xiàn)。此時,使用策略模式,把這些行為轉(zhuǎn)移到相應的具體策略類里面,就可以避免使用難以維護的多重條件選擇語句,并體現(xiàn)面向?qū)ο笤O(shè)計的概念。
策略模式的優(yōu)點和缺點
策略模式有很多優(yōu)點和缺點。它的優(yōu)點有:
1. 策略模式提供了管理相關(guān)的算法族的辦法。策略類的等級結(jié)構(gòu)定義了一個算法或行為族。恰當使用繼承可以把公共的代碼移到父類里面,從而避免重復的代碼。
2.
策略模式提供了可以替換繼承關(guān)系的辦法。繼承可以處理多種算法或行為。如果不是用策略模式,那么使用算法或行為的環(huán)境類就可能會有一些子類,每一個子類提
供一個不同的算法或行為。但是,這樣一來算法或行為的使用者就和算法或行為本身混在一起。決定使用哪一種算法或采取哪一種行為的邏輯就和算法或行為的邏輯
混合在一起,從而不可能再獨立演化。繼承使得動態(tài)改變算法或行為變得不可能。
3. 使用策略模式可以避免使用多重條件轉(zhuǎn)移語句。多重轉(zhuǎn)移語句不易維護,它把采取哪一種算法或采取哪一種行為的邏輯與算法或行為的邏輯混合在一起,統(tǒng)統(tǒng)列在一個多重轉(zhuǎn)移語句里面,比使用繼承的辦法還要原始和落后。
策略模式的缺點有:
1. 客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。這就意味著客戶端必須理解這些算法的區(qū)別,以便適時選擇恰當?shù)乃惴?。換言之,策略模式只適用于客戶端知道所有的算法或行為的情況。
2. 策略模式造成很多的策略類。有時候可以通過把依賴于環(huán)境的狀態(tài)保存到客戶端里面,而將策略類設(shè)計成可共享的,這樣策略類實例可以被不同客戶端使用。換言之,可以使用享元模式來減少對象的數(shù)量。
策略模式與很多其它的模式都有著廣泛的聯(lián)系。Strategy很容易和Bridge模式相混淆。雖然它們結(jié)構(gòu)很相似,但它們卻是為解決不同的問題
而設(shè)計的。Strategy模式注重于算法的封裝,而Bridge模式注重于分離抽象和實現(xiàn),為一個抽象體系提供不同的實現(xiàn)。Bridge模式與
Strategy模式都很好的體現(xiàn)了"Favor composite over inheritance"的觀點。