策略模式(Strategy Pattern)體現了兩個非常基本的面向對象設計的原則
1、封裝變化的概念;
2、編程中使用接口,而不是對接口的實現。
策略模式定義了一個共同的抽象算法接口,其子類實現這個接口定義的方法,並且都有各自不同的實現,這些算法實現可以在客戶端調用它們的時候互不影響的變化。 子算法之間是弱連接的關係,提高了軟件的可擴展性與可重用性。
策略模式組成
1、抽象策略角色:策略類,通常由一個接口或者抽象類實現
2、具體策略角色:包括了相關的算法和行爲,可能不止一個具體策略角色
3、環境角色:持有一個策略類的引用,最終給客戶端調用的。
策略模式編寫步驟
1、對一組算法抽象出一個共同接口,定義這個共同接口
2、編寫策略類,實現這個藉口,每個策略類都有其獨特的實現
3、編寫環境角色類,類中持有一個對共同接口的引用,對策略對象注入如set方法和get方法或者用構造方法完成賦值
下面是一個策略模式事例
劉備要到江東娶老婆了,走之前諸葛亮給趙雲(伴郎)三個錦囊妙計,說是按天機拆開解決棘手問題,嘿,還別說,真是解決了大問題,搞到最後是周瑜陪了夫人又折兵呀,那咱們先看看這個場景是什麼樣子的。
先說這個場景中的要素:三個妙計,一個錦囊,一個趙雲,妙計是小亮同志給的,妙計是放置在錦囊裏,俗稱就是錦囊妙計嘛,那趙雲就是一個幹活的人,從錦囊中取出妙計,執行,然後獲勝,用 JAVA 程序怎麼表現這個呢?我們先看類圖:
三個妙計是同一類型的東東,那咱就寫個接口:
package com.sanguo.strategy; /** * 定義策略接口 * 諸葛亮妙計接口 * */ public interface IStrategy { //每個錦囊妙計都是一個可執行的算法 public void operate(); }
然後再寫三個實現類,有三個妙計嘛:package com.sanguo.strategy; /** * 走後門算法 * */ public class BackDoor implements IStrategy { @Override public void operate() { System.out.println("找喬國老幫忙,讓吳國太給孫權施加壓力"); } }
package com.sanguo.strategy; /** * 求吳國太開綠燈算法 * */ public class GivenGreenLight implements IStrategy { @Override public void operate() { System.out.println("求吳國太開綠燈,放行!"); } }
package com.sanguo.strategy; /** * 孫夫人斷後擋追兵 * */ public class BlockEnemy implements IStrategy { @Override public void operate() { System.out.println("孫夫人斷後,擋住追兵"); } }
好了,大家看看,三個妙計是有了,那需要有個地方放這些妙計呀,放錦囊呀:package com.sanguo.strategy; /** * 環境角色,主要完成對特定策略的調用 這裏代表諸葛亮裝計策的錦囊 * */ public class Context { private IStrategy strategy; public Context(IStrategy strategy) { this.strategy = strategy;// 構造函數,你要使用的計策算法 } //使用計謀,看我出招 public void operate() { this.strategy.operate(); } }
然後就是趙雲雄赳赳的揣着三個錦囊,拉着已步入老年行列的、還想着娶純情少女的、色迷迷的劉老爺子去入贅了,嗨,還別說,小亮的三個妙計還真是不錯,瞅瞅:package com.sanguo.strategy; public class ZhaoYun { public static void main(String[] args) { Context context; // 剛剛到吳國的時候拆第一個 context = new Context(new BackDoor()); // 拿到妙計 context.operate(); // 拆開執行 // 劉備樂不思蜀了,拆第二個了 context = new Context(new GivenGreenLight()); context.operate(); // 執行了第二個錦囊了 // 孫權的小兵追了,咋辦?拆第三個 context = new Context(new BlockEnemy()); context.operate(); // 孫夫人退兵 } }
執行結果,