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