策略模式

smile

大家好:我叫石頭!

為什么出現(xiàn)策略模式:

完成一項(xiàng)任務(wù),往往可以有多種不同的方式,每一種方式稱為一個(gè)策略,我們可以根據(jù)環(huán)境或者條件的不同選擇不同的策略來完成該項(xiàng)任務(wù)。
---對(duì)象行為型模式昆禽。

優(yōu)點(diǎn):

  • 策略模式提供了對(duì)“開閉原則”的完美支持,用戶可以在不修改原有系統(tǒng)的基礎(chǔ)上選擇算法或行為蝇庭,也可以靈活地增加新的算法或行為醉鳖。
  • 策略模式提供了管理相關(guān)的算法族的辦法。策略模式提供了可以替換繼承關(guān)系的辦法哮内。
  • 使用策略模式可以避免使用多重條件轉(zhuǎn)移語句盗棵。

結(jié)構(gòu)圖:

策略模式包含如下角色:

Context: 環(huán)境類
Strategy: 抽象策略類
ConcreteStrategy: 具體策略類

UML
策略模式代碼實(shí)現(xiàn)
# Strategy: 抽象策略類
interface IStrategy {
        public void doSomething();
    }
    class ConcreteStrategy1 implements IStrategy {
        public void doSomething() {
            System.out.println("具體策略1");
        }
    }
    class ConcreteStrategy2 implements IStrategy {
        public void doSomething() {
            System.out.println("具體策略2");
        }
    }
    class Context {
        private IStrategy strategy;

        public Context(IStrategy strategy){
            this.strategy = strategy;
        }

        public void execute(){
            strategy.doSomething();
        }
    }

    public class Client {
        public static void main(String[] args){
            Context context;
            System.out.println("-----執(zhí)行策略1-----");
            context = new Context(new ConcreteStrategy1());
            context.execute();

            System.out.println("-----執(zhí)行策略2-----");
            context = new Context(new ConcreteStrategy2());
            context.execute();
        }
    }

背后的本質(zhì)原理:
在面向?qū)ο笤O(shè)計(jì)(Object-Oriented DesignOOD),其實(shí)體現(xiàn)的是繼承跟多態(tài),

  • 幾個(gè)類的主要邏輯相同牍蜂,只在部分邏輯的算法和行為上稍有區(qū)別的情況漾根。
  • 有幾種相似的行為,或者說算法鲫竞,客戶端需要?jiǎng)討B(tài)地決定使用哪一種辐怕,那么可以使用策略模式,將這些算法封裝起來供客戶端調(diào)用从绘。

一般來說寄疏,策略模式不會(huì)單獨(dú)使用,跟模版方法模式僵井、工廠模式等混合使用的情況比較多陕截。

在android中的應(yīng)用:

1.adapter anim.setInterpolator(new AccelerateInterpolator(2f));
2.屬性動(dòng)畫
3.volley

在屬性動(dòng)畫中,有一個(gè)東西叫做插值器,它的作用就是根據(jù)時(shí)間流逝的百分比來來計(jì)算出當(dāng)前屬性值改變的百分比.

Context: 環(huán)境類

private static final TimeInterpolator sDefaultInterpolator =
        new AccelerateDecelerateInterpolator();  
private TimeInterpolator mInterpolator = sDefaultInterpolator; 
@Override
public void setInterpolator(TimeInterpolator value) {
    if (value != null) {
        mInterpolator = value;
    } else {
        mInterpolator = new LinearInterpolator();
    }
}

@Override
public TimeInterpolator getInterpolator() {
    return mInterpolator;
}
Strategy: 抽象策略類
public interface Interpolator extends TimeInterpolator {
    // A new interface, TimeInterpolator, was introduced for the new android.animation
    // package. This older Interpolator interface extends TimeInterpolator so that users of
    // the new Animator-based animations can use either the old Interpolator implementations or
    // new classes that implement TimeInterpolator directly.
}
BaseInterpolator插值器實(shí)現(xiàn)了Interpolator接口,并且是一個(gè)抽象類
abstract public class BaseInterpolator implements Interpolator {
    private int mChangingConfiguration;
    /**
     * @hide
     */
    public int getChangingConfiguration() {
        return mChangingConfiguration;
    }

    /**
     * @hide
     */
    void setChangingConfiguration(int changingConfiguration) {
        mChangingConfiguration = changingConfiguration;
    }
}  

為什么還要封裝成一層抽象類呢?
方便抽取一些公共的實(shí)現(xiàn)跟必須的一些實(shí)現(xiàn).
ConcreteStrategy: 具體策略類
線性插值器
public class LinearInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {

    public LinearInterpolator() {
    }

    public LinearInterpolator(Context context, AttributeSet attrs) {
    }

    public float getInterpolation(float input) {
        return input;
    }

    /** @hide */
    @Override
    public long createNativeInterpolator() {
        return NativeInterpolatorFactoryHelper.createLinearInterpolator();
    }
}
加減速插值器
public class AccelerateDecelerateInterpolator extends BaseInterpolator
        implements NativeInterpolatorFactory {
    public AccelerateDecelerateInterpolator() {
    }

    @SuppressWarnings({"UnusedDeclaration"})
    public AccelerateDecelerateInterpolator(Context context, AttributeSet attrs) {
    }

    public float getInterpolation(float input) {
        return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
    }

    /** @hide */
    @Override
    public long createNativeInterpolator() {
        return NativeInterpolatorFactoryHelper.createAccelerateDecelerateInterpolator();
    }
}

隨便說一句:
各種設(shè)計(jì)模式的出現(xiàn)都是為了提高代碼的健壯性等.

Volley實(shí)現(xiàn)
public interface RetryPolicy {


    public int getCurrentTimeout();//獲取當(dāng)前請(qǐng)求用時(shí)(用于 Log)


    public int getCurrentRetryCount();//獲取已經(jīng)重試的次數(shù)(用于 Log)


    public void retry(VolleyError error) throws VolleyError;//確定是否重試批什,參數(shù)為這次異常的具體信息农曲。在請(qǐng)求異常時(shí)此接口會(huì)被調(diào)用,可在此函數(shù)實(shí)現(xiàn)中拋出傳入的異常表示停止重試驻债。
}
默認(rèn)實(shí)現(xiàn)
public class DefaultRetryPolicy implements RetryPolicy {
    ...
}
public abstract class Request<T> implements Comparable<Request<T>> {
    private RetryPolicy mRetryPolicy;
    public Request<?> setRetryPolicy(RetryPolicy retryPolicy) {
        mRetryPolicy = retryPolicy;
        return this;
    }
    public RetryPolicy getRetryPolicy() {
        return mRetryPolicy;
    }
}

各大網(wǎng)絡(luò)請(qǐng)求框架乳规,或多或少都會(huì)使用到緩存,緩存一般會(huì)定義一個(gè)Cache接口合呐,然后實(shí)現(xiàn)不同的緩存策略暮的,如內(nèi)存緩存,磁盤緩存等等淌实,這個(gè)緩存的實(shí)現(xiàn)冻辩,其實(shí)也可以使用策略模式猖腕。直接看Volley,里面也有緩存恨闪。

策略模式在MVP中的實(shí)現(xiàn):

  • 提示:Context類不一定只有一個(gè)algorithm(),只要是持有interface接口的類都能當(dāng)做Context

我們常使用的MVP模式中的Presenter層就是對(duì)策略模式的實(shí)現(xiàn)倘感,一個(gè)View在不同的條件下,可以對(duì)應(yīng)不同的Presenter層咙咽。

MVP中的策略模式

iOS設(shè)計(jì)模式-策略模式

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末侠仇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子犁珠,更是在濱河造成了極大的恐慌,老刑警劉巖互亮,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犁享,死亡現(xiàn)場離奇詭異,居然都是意外死亡豹休,警方通過查閱死者的電腦和手機(jī)炊昆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來威根,“玉大人凤巨,你說我怎么就攤上這事÷宀螅” “怎么了敢茁?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長留美。 經(jīng)常有香客問我彰檬,道長,這世上最難降的妖魔是什么谎砾? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任逢倍,我火速辦了婚禮,結(jié)果婚禮上景图,老公的妹妹穿的比我還像新娘较雕。我一直安慰自己,他們只是感情好挚币,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布亮蒋。 她就那樣靜靜地躺著,像睡著了一般忘晤。 火紅的嫁衣襯著肌膚如雪宛蚓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天设塔,我揣著相機(jī)與錄音凄吏,去河邊找鬼远舅。 笑死,一個(gè)胖子當(dāng)著我的面吹牛痕钢,可吹牛的內(nèi)容都是我干的图柏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼任连,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼蚤吹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起随抠,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤裁着,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后拱她,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體二驰,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年秉沼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桶雀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唬复,死狀恐怖矗积,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敞咧,我是刑警寧澤棘捣,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站休建,受9級(jí)特大地震影響柱锹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丰包,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一禁熏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧邑彪,春花似錦瞧毙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至有巧,卻和暖如春释漆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背篮迎。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國打工男图, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留示姿,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓逊笆,卻偏偏與公主長得像栈戳,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子难裆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1 場景問題# 1.1 報(bào)價(jià)管理## 向客戶報(bào)價(jià)子檀,對(duì)于銷售部門的人來講,這是一個(gè)非常重大乃戈、非常復(fù)雜的問題褂痰,對(duì)不同的...
    七寸知架構(gòu)閱讀 5,078評(píng)論 9 62
  • 1 場景問題 1.1 報(bào)價(jià)管理 向客戶報(bào)價(jià),對(duì)于銷售部門的人來講症虑,這是一個(gè)非常重大脐恩、非常復(fù)雜的問題,對(duì)不同的客戶要...
    4e70992f13e7閱讀 3,084評(píng)論 2 16
  • 1.問題例1:一個(gè)菜單功能能夠根據(jù)用戶的“皮膚”首選項(xiàng)來決定是否采用水平的還是垂直的排列形式侦讨。同事可以靈活增加菜單...
    小飛豬閱讀 367評(píng)論 0 0
  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是策略模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 策略模式和模板方法模式的區(qū)別 優(yōu)點(diǎn)和...
    w1992wishes閱讀 853評(píng)論 1 7
  • 這幾天,我經(jīng)歷了人生中最昏暗的日子苟翻,公公急性心梗發(fā)作韵卤,做了支架手術(shù),還沒有度過安全期又突發(fā)腦出血崇猫,進(jìn)行了開顱手術(shù)沈条。...
    笑笑媽521閱讀 177評(píng)論 0 0