設計模式-策略模式
阿新 • • 發佈:2020-07-15
策略模式中一個類的行為可以在執行的時候進行更改,我們需要定義一個策略的介面,讓所有的具體策略實現這個介面,然後封裝一個可以執行策略的物件,可以通過傳入不同的策略,執行不同的演算法;
- 意圖:定義一系列的演算法,把它們一個個封裝起來, 並且使它們可相互替換。
- 主要解決:在有多種演算法相似的情況下,使用 if...else 所帶來的複雜和難以維護。
- 何時使用:一個系統有許多許多類,而區分它們的只是他們直接的行為。
- 如何解決:將這些演算法封裝成一個一個的類,任意地替換。
- 關鍵程式碼:實現同一個介面。
這裡舉例借鑑了《您的設計模式》中諸葛亮給趙雲的錦囊妙計,讓趙雲去東吳的過程中拆開;
下面看一下類圖:
實現策略模式的有以下幾個步驟:
-
- 定義一個策略介面
- 讓能夠執行的具體策略實現這個介面
- 封裝一個可以執行策略的物件
- 呼叫對應的策略
1、定義一個策略介面
package com.dongl.strategy; /** * 定義一個的策略 */ public interface Strategy { //每個錦囊妙計都是一個可執行的演算法 public void operate(); }
2、具體策略實現策略介面
第一個策略:
package com.dongl.strategy; public class BackDoor implements Strategy{ @Overridepublic void operate() { System.out.println("找喬國老幫忙,讓吳國太給孫權施加壓力"); } }
第二個策略:
package com.dongl.strategy; public class BlockEnemy implements Strategy { @Override public void operate() { System.out.println("孫夫人斷後,擋住追兵"); } }
第三個策略:
package com.dongl.strategy; publicclass GivenGreenLight implements Strategy { @Override public void operate() { System.out.println("求吳國太開個綠燈,放行!"); } }
3、封裝一個可以執行策略的
package com.dongl.strategy; /** * 計謀有了,那還要有錦囊 */ public class Context { //建構函式,你要使用那個妙計 private Strategy straegy; public Context(Strategy strategy){ this.straegy = strategy; } //使用計謀了,看我出招了 public void operate(){ this.straegy.operate(); } }
4、呼叫對應策略
package com.dongl.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("-----------劉備樂不思蜀了,拆第二個了-------------"); context = new Context(new GivenGreenLight()); context.operate(); //執行了第二個錦囊了 System.out.println("-----------孫權的小兵追了,咋辦?拆第三個 -------------"); context = new Context(new BlockEnemy()); context.operate(); //孫夫人退兵 } }