策略模式又稱爲算法簇模式。在該模式下定義了不同的算法,算法間可以互相替換。所以在該模式下使用者可以自由的在算法間進行調換,也就是說可以動態的改變對象的行爲。
設計原則:就是把一個類中經常改變或者將來可能會改變的部分提取出來,作爲一個接口。
策略模式的優點,高內聚低耦合。還有就是擴展性,也就是OCP原則,策略可以持續增加下去而不用修改使用者部分(也就是算法的調用者)。
5,策略模式的經典示例:(有人說這是個狀態模式,我只是個小白,在此不爭執)
劉備要到江東娶老婆了,走之前諸葛亮給趙雲(伴郎)三個錦囊妙計,說是按天機拆開能解決棘手問題,嘿,還別說,真解決了大問題,搞到最後是周瑜陪了夫人又折兵,那咱們先看看這個場景是什麼樣子的。
先說說這個場景中的要素:三個妙計,一個錦囊,一個趙雲,妙計是亮哥給的,妙計放在錦囊裏,俗稱就是錦囊妙計嘛,那趙雲就是一個幹活的人,從錦囊取出妙計,執行,然後獲勝。用java程序怎麼表現這些呢?
那我們先來看看圖?
三個妙計是同一類型的東西,那咱就寫個接口:
package com.yangguangfu.strategy;
/**
*
* @author [email protected]:阿福
* 首先定義一個策略接口,這是諸葛亮老人家給趙雲的三個錦囊妙計的接口。
*/
public interface IStrategy {
//每個錦囊妙計都是一個可執行的算法。
public void operate();
}
然後再寫三個實現類,有三個妙計嘛:
妙計一:初到吳國:
package com.yangguangfu.strategy;
/**
*
* @author [email protected]:阿福
* 找喬國老幫忙,使孫權不能殺劉備。
*/
public class BackDoor implements IStrategy {
@Override
public void operate() {
System.out.println("找喬國老幫忙,讓吳國太給孫權施加壓力,使孫權不能殺劉備...");
}
}
妙計二:求吳國太開個綠燈,放行:
Java代碼
package com.yangguangfu.strategy;
/**
*
* @author [email protected]:阿福
* 求吳國太開個綠燈。
*/
public class GivenGreenLight implements IStrategy {
@Override
public void operate() {
System.out.println("求吳國太開個綠燈,放行!");
}
}
妙計三:孫夫人斷後,擋住追兵:
Java代碼
package com.yangguangfu.strategy;
/**
*
* @author [email protected]:阿福
* 孫夫人斷後,擋住追兵。
*/
public class BlackEnemy implements IStrategy {
@Override
public void operate() {
System.out.println("孫夫人斷後,擋住追兵...");
}
}
好了,大家看看,三個妙計是有了,那需要有個地方放妙計啊,放錦囊裏:
Java代碼
package com.yangguangfu.strategy;
/**
*
* @author [email protected]:阿福
*
*/
public class Context {
private IStrategy strategy;
//構造函數,要你使用哪個妙計
public Context(IStrategy strategy){
this.strategy = strategy;
}
public void operate(){
this.strategy.operate();
}
}
然後就是趙雲雄赳赳的揣着三個錦囊,拉着已步入老年行列,還想着娶純情少女的,色咪咪的劉備老爺子去入贅了,嗨,還別說,亮哥的三個妙計還真不錯,瞧瞧:
Java代碼
package com.yangguangfu.strategy;
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\n\n\n\n\n\n\n\n\n\n\n\n");
//當劉備樂不思蜀時,拆開第二個
System.out.println("----------劉備樂不思蜀,拆第二個了---------------");
context = new Context(new GivenGreenLight());
context.operate();//拆開執行
System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
//孫權的小追兵了,咋辦?拆開第三個錦囊
System.out.println("----------孫權的小追兵了,咋辦?拆開第三個錦囊---------------");
context = new Context(new BlackEnemy());
context.operate();//拆開執行
System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
}
}