1、簡介
策略模式就是把各個平等的具體實現進行抽象、封裝成為獨立的算法類,然后通過上下文和具體的算法類來進行交互。各個策略算法都是平等的,地位是一樣的,正是由于各個算法的平等性,所以它們才是可以相互替換的。雖然我們可以動態的切換各個策略,但是同一時刻只能使用一個策略。
2、范例
比如去服裝店買衣服,普通會員不打折,黃金會員打9折,鉑金會員打8折,鉆石會員打7折,這樣不同的客戶價格計算方式不同,這個時候就可以使用策略模式。
3、代碼實現
3.1、定義接口
public interface IStrategy {public void operate();
}
復制代碼
3.2、 根據會員等級,設置對應折扣
public class BackDoor implements IStrategy {@Overridepublic void operate() {System.out.println("打9折");}
}
復制代碼
public class GivenGreenLight implements IStrategy {@Overridepublic void operate() {System.out.println("打8折");}
}
復制代碼
public class BlackEnemy implements IStrategy {@Overridepublic void operate() {System.out.println("打7折");}
}
復制代碼
3.3、定義上下文,構造函數,使用哪個方法
public class Context {private IStrategy strategy;//構造函數,要你使用哪個方法public Context(IStrategy strategy){this.strategy = strategy;}public void setStrategy(IStrategy strategy){this.strategy = strategy;}public void operate(){this.strategy.operate();}
}
復制代碼
3.4、測試,達到預期效果
public class Zhaoyun {public static void main(String[] args) {Context context;System.out.println("----------黃金會員---------------");context = new Context(new BackDoor());context.operate();System.out.println("\n");System.out.println("----------鉑金會員---------------");context.setStrategy(new GivenGreenLight());context.operate();System.out.println("\n");System.out.println("----------鉆石會員---------------");context.setStrategy(new BlackEnemy());context.operate();System.out.println("\n");}
}
復制代碼
4、優點
我們之前在選擇方式的時候,往往會使用if-else語句,也就是用戶不選擇A那么就選擇B這樣的一種情況。這種情況耦合性太高了,而且代碼臃腫,有了策略模式我們就可以避免這種現象,策略模式遵循開閉原則,實現代碼的解耦合。擴展新的方法時也比較方便,只需要繼承策略接口就好了。