前言
策略模式定義了一系列的算法,并將每一個(gè)算法封裝起來(lái),而且使它們之間可以相互替換。這些策略算法是相同行為的不同實(shí)現(xiàn)。

策略模式.png
需求
三國(guó)故事中,劉備要到江東娶孫權(quán)的妹妹孫尚香,由于這行程之中危險(xiǎn)重重,故而諸葛亮在劉備走之前給了三個(gè)錦囊妙計(jì),說(shuō)是到了關(guān)鍵時(shí)刻打開(kāi)。
策略模式
三個(gè)妙計(jì)同屬于一個(gè)類型,我們用一個(gè)接口IStrategy來(lái)表示:
public interface IStrategy {
//每個(gè)錦囊妙計(jì)都是一個(gè)可執(zhí)行的算法
void operate();
}
三個(gè)實(shí)現(xiàn)類,也就是三個(gè)妙計(jì):
public class BookdoorStrategy implements IStrategy {
@Override
public void operate() {
System.out.println("找喬國(guó)老幫忙,讓吳國(guó)太給孫權(quán)施加壓力...");
}
}
public class GivenGreenLightStrategy implements IStrategy {
@Override
public void operate() {
System.out.println("求吳國(guó)太開(kāi)個(gè)綠燈,放行...");
}
}
public class BlockEnemyStrategy implements IStrategy {
@Override
public void operate() {
System.out.println("孫夫人斷后,擋住追兵...");
}
}
有了妙計(jì),那還得將這些妙計(jì)放在錦囊里:
public class Context {
private final IStrategy strategy;
public Context(IStrategy strategy) {
this.strategy = strategy;
}
public void operate() {
this.strategy.operate();
}
}
客戶端Client調(diào)用:
public class Client {
public static void main(String[] args) {
Context context;
System.out.println("-----剛剛到吳國(guó)的時(shí)候,拆第一個(gè)-----");
context = new Context(new BookdoorStrategy());
context.operate();
System.out.println("-----劉備樂(lè)不思蜀了,拆第二個(gè)-----");
context = new Context(new GivenGreenLightStrategy());
context.operate();
System.out.println("-----孫權(quán)的追兵來(lái)了,拆第三個(gè)-----");
context = new Context(new BlockEnemyStrategy());
context.operate();
}
}
運(yùn)行,輸出結(jié)果為:
-----剛剛到吳國(guó)的時(shí)候,拆第一個(gè)-----
找喬國(guó)老幫忙,讓吳國(guó)太給孫權(quán)施加壓力...
-----劉備樂(lè)不思蜀了,拆第二個(gè)-----
求吳國(guó)太開(kāi)個(gè)綠燈,放行...
-----孫權(quán)的追兵來(lái)了,拆第三個(gè)-----
孫夫人斷后,擋住追兵...
策略模式在Android中的應(yīng)用
動(dòng)畫(huà)中的插值器就是采用的策略模式。
總結(jié)
使用策略模式可以避免多重條件語(yǔ)句,多重條件語(yǔ)句不易維護(hù),它把采取哪一種算法讓子類實(shí)現(xiàn)。但是使用策略模式必須知道所有的策略類,并自行決定使用哪一個(gè)策略類。換言之,策略模式只適用于客戶端知道算法或行為的情況;另外由于策略模式把每個(gè)具體的策略實(shí)現(xiàn)都單獨(dú)封裝成類,如果策略過(guò)多的話,可能會(huì)導(dǎo)致策略類過(guò)于繁多。
喜歡本篇博客的簡(jiǎn)友們,就請(qǐng)來(lái)一波點(diǎn)贊,您的每一次關(guān)注,將成為我前進(jìn)的動(dòng)力,謝謝!作者:zhang_pan