Java设计模式之行为型:策略模式
一、背景:
????????在開發中經常遇到這種情況,實現某個功能有多種算法策略,我們可以根據不同環境或者條件選擇不同的算法策略來完成該功能,比如查找、排序等,一種常用方式是硬編碼在一個類中,如需要提供多種查找算法,可以將這些算法寫到一個類中,在該類中提供多個方法,每一個方法對應一個具體的查找算法;當然也可以將這些查找算法封裝在一個統一的方法中,通過 if-else 或者 case 等條件判斷語句來進行選擇。但是如果需要增加新的算法策略,就需要修改封裝算法類的源代碼;更換查找算法,也需要修改客戶端的調用代碼。并且在這個類中封裝了大量算法,也會使得該類代碼較復雜,維護較為困難。如果我們將這些策略包含在客戶端,這種做法更不可取,將導致客戶端程序龐大而且難以維護,如果存在大量可供選擇的算法時問題將變得更加嚴重。
????????如何讓算法和對象分開來,使得算法可以獨立于使用它的客戶而變化?解決方法就是使用策略模式。
二、什么是策略模式:
????????將類中經常改變或者可能改變的部分提取為作為一個抽象策略接口類,然后在類中包含這個對象的實例,這樣類實例在運行時就可以隨意調用實現了這個接口的類的行為。
????????比如定義一系列的算法,把每一個算法封裝起來,并且使它們可相互替換,使得算法可獨立于使用它的客戶而變化,這就是策略模式。
UML結構圖:
(1)環境類(Context):通過?ConcreteStrategy 具體策略類來配置,持有 Strategy 對象并維護對Strategy 對象的引用。可定義一個接口來讓 Strategy 訪問它的數據。
(2)抽象策略類(Strategy):定義所有支持的算法的公共接口。 Context使用這個接口來調用某ConcreteStrategy 定義的算法。
(3)具體策略類(ConcreteStrategy):?Strategy 接口的具體算法。
???????策略模式的優點在于可以動態改變對象的行為;但缺點是會產生很多策略類,同時客戶端必須知道所有的策略類,并自行決定使用哪一個策略類;?
????????策略模式適用用于以下幾種場景:
- (1)應用程序需要實現特定的功能服務,而該程序有多種實現方式使用,所以需要動態地在幾種算法中選擇一種
- (2)一個類定義了多種行為算法,并且這些行為在類的操作中以多個條件語句的形式出現,就可以將相關的條件分支移入它們各自的Strategy類中以代替這些條件語句。
三、代碼實現:
場景如下,劉備要到江東娶老婆了,走之前諸葛亮給趙云三個錦囊妙計,說是按天機拆開能解決棘手問題。場景中出現三個要素:三個妙計(具體策略類)、一個錦囊(環境類)、趙云(調用者)。
抽象策略類(Strategy):
public interface Strategy {public void operate(); }三個實現類(ConcreteStrategy):
//妙計一:初到吳國 public class BackDoor implements IStrategy {@Overridepublic void operate() {System.out.println("找喬國老幫忙,讓吳國太給孫權施加壓力,使孫權不能殺劉備");} }//求吳國太開綠燈放行 public class GivenGreenLight implements IStrategy {@Overridepublic void operate() {System.out.println("求吳國太開個綠燈,放行");} }//孫夫人斷后,擋住追兵 public class BlackEnemy implements IStrategy {@Overridepublic void operate() {System.out.println("孫夫人斷后,擋住追兵");} }環境類(Context):
public class Context {private Strategy strategy;//構造函數,要你使用哪個妙計public Context(Strategy strategy){this.strategy = strategy;}public void setStrategy(Strategy strategy){this.strategy = strategy;}public void operate(){this.strategy.operate();} }下面就是使用的情況了:
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");} }三招下來,搞得的周郎是“賠了夫人又折兵”。
以上就是策略模式,多種不同解決方案動態切換,起到改變對象行為的效果。
設計模式系列文章:
Java設計模式之創建型:工廠模式詳解(簡單工廠+工廠方法+抽象工廠)
Java設計模式之創建型:建造者模式
Java設計模式之創建型:單例模式
Java設計模式之創建型:原型模式
Java設計模式之結構型:適配器模式
Java設計模式之結構型:裝飾器模式
Java設計模式之結構型:代理模式
Java設計模式之結構型:橋接模式
Java設計模式之結構型:外觀模式
Java設計模式之結構型:組合模式
Java設計模式之結構型:享元模式
Java設計模式之行為型:策略模式
Java設計模式之行為型:模板方法模式
Java設計模式之行為型:責任鏈模式
Java設計模式之行為型:觀察者模式
Java設計模式之行為型:訪問者模式
Java設計模式之行為型:中介者模式
Java設計模式之行為型:命令模式
Java設計模式之行為型:狀態模式
Java設計模式之行為型:備忘錄模式
Java設計模式之行為型:迭代器模式
Java設計模式之行為型:解釋器模式
原博客鏈接:Java設計模式之策略模式_一個本科小生的奮斗史-CSDN博客_策略模式
總結
以上是生活随笔為你收集整理的Java设计模式之行为型:策略模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java设计模式之结构型:享元模式
- 下一篇: Java设计模式之行为型:模板方法模式