**定義**:定義一組算法,將每個算法都封裝其阿里,并且使它們之間可以互換。
## 策略模式的一般模式:

Context封裝角色
---|它也叫作上下文對象,起承上啟下封裝作用,屏蔽高層模塊對策略、算法的直接訪問,
封裝可能存在的變化。
Strategy抽象策略角色
---|策略、算法家族的抽象,通常為接口,定義每個策略或算法必須具有的方法和屬性。
ConcreteStrategy具體策略角色
---|實現抽象策略中的操作,該類含有具體的算法。
~~~
public class StrategyT {
public static void main(String[] args) {
//實現某個算法。
Context context = new Context(new ConcreteStrategy());
context.action();
}
}
interface Strategy{
//實現具體的算法操作
public void doSomething();
}
class ConcreteStrategy implements Strategy{
@Override
public void doSomething() {
System.out.println("come on operate some Arithmetics...");
}
}
class Context{
//私有方法指向具體的策略實現者
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void action(){
this.strategy.doSomething();
}
}
~~~
## 一個例子:
諸葛亮錦囊妙計的故事大家都聽說過,那么在這個故事中也涉及到一個設計模式的道理。
首先,諸葛亮給趙云三個錦囊,錦囊中分別是三個妙計,趙云在固定的地點打開錦囊,執行其任務,
便能夠化險為夷。那么我們用代碼去實現這個策略模式吧。

~~~
public class StrategyTest {
public static void main(String[] args) {
//趙云來到吳國,打開第一個錦囊
System.out.println("-------趙云來到吳國,打開第一個錦囊-----------");
MyContext context1 = new MyContext(new BackDoor());
//執行第一個錦囊妙招
context1.operate();
System.out.println("-------遇到麻煩打開第二個錦囊-------------");
//遇到麻煩打開第二個錦囊
MyContext context2 = new MyContext(new BackDoor());
//執行第一個錦囊妙招
context2.operate();
System.out.println("-------想要溜走,又遇到麻煩---------");
//想要溜走,又遇到麻煩
MyContext context3 = new MyContext(new BackDoor());
//執行第一個錦囊妙招
context3.operate();
}
}
interface IStrategy{
//錦囊中的妙計,實現方法.具體的實現算法
void operate();
}
/**
* 錦囊妙計一
* @author admin
*
*/
class BackDoor implements IStrategy{
@Override
public void operate() {
System.out.println("找喬國老開后門");
}
}
/**
* 錦囊妙計二
* @author admin
*
*/
class GivenGreenLight implements IStrategy{
@Override
public void operate() {
System.out.println("找吳國太開綠燈");
}
}
/**
* 錦囊妙計三
* @author admin
*
*/
class BlockEnemy implements IStrategy{
@Override
public void operate() {
System.out.println("孫夫人斷后");
}
}
/**
* 具體的承載妙計的錦囊。
* @author admin
*
*/
class MyContext {
//一個私有對象指向具體的實現算法類。
private IStrategy strategy;
public MyContext(IStrategy strategy) {
this.strategy = strategy;
}
public void operate(){
this.strategy.operate();
}
}
~~~
**策略模式的優點**:
---|算法可以自由切換
---|避免使用多重條件的判斷
---|擴展性良好
**策略模式的缺點**
---|策略類數量增多
---|所有的策略類需要對外暴露
**策略模式的使用場景**
---|多個類只有在算法或行為上稍有不同的場景
---|算法需要自由切換的場景
---|需要屏蔽算法規則的場景
- 前言
- 6大設計原則(一)---單一職責原則
- 6大設計原則(二)---里氏替換原則
- 6大設計原則(三)---依賴倒置原則
- 6大設計模式(四)----接口隔離原則
- 6大設計原則(五)---迪米特法則
- 6大設計原則(六)---開閉原則。
- 設計模式(一)---單例模式
- 設計模式(二)---工廠方法模式
- 設計模式(三)---抽象工廠模式
- 設計模式(四)---模板方法模式
- 設計模式(五)---建造者模式
- 設計模式(六)---代理模式
- 設計模式(七)---原型模式
- 設計模式(八)---中介者模式
- 設計模式(九)---命令模式
- 設計模式(十)---責任鏈模式
- 設計模式(十一)---裝飾模式
- 設計模式(十二)---策略模式
- 設計模式(十三)---適配器模式
- 設計模式(十四)---迭代器模式
- 設計模式(十五)---組合模式
- 設計模式(十六)---觀察者模式
- 設計模式(十七)---門面模式
- 設計模式(十八)---備忘錄模式
- 設計模式(十八)---訪問者模式
- 設計模式(二十)---狀態模式
- 設計模式(二十二)---享元模式
- 設計模式(二十三)---橋梁模式