設(shè)計(jì)套路-策略套路

定義

策略模式定義了一系列的算法供鸠,并將每一個(gè)算法封裝起來(lái),而且使它們還可以相互替換陨闹,策略模式讓算法獨(dú)立于使用它的客戶(hù)而獨(dú)立變化楞捂。

使用場(chǎng)景

  • 針對(duì)同一類(lèi)型問(wèn)題的多種處理方式,僅僅是具體行為有差別時(shí)趋厉。
  • 需要安全的封裝多種同一類(lèi)型的操作時(shí)寨闹。
  • 出現(xiàn)同一抽象類(lèi)有多個(gè)子類(lèi),而又需要使用if - else或者switch - case 來(lái)選擇具體子類(lèi)時(shí)君账。

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

  • 結(jié)構(gòu)清晰明了繁堡、使用簡(jiǎn)單直觀。
  • 耦合度相對(duì)而言較低,擴(kuò)展方便
  • 操作封裝也更為徹底椭蹄,數(shù)據(jù)更為安全闻牡。
  • 隨著策略的增加,子類(lèi)也會(huì)變得繁多绳矩。

關(guān)鍵類(lèi)

  • 策略的頂級(jí)接口罩润,策略的具體實(shí)現(xiàn)類(lèi),策略的上下文環(huán)境類(lèi)

在Android 源碼的應(yīng)用

  • Android 動(dòng)畫(huà)插值器翼馆。

好了割以,又是一對(duì)概念,優(yōu)缺點(diǎn)应媚,場(chǎng)景等官方的話拳球,但是往往定義也是很重要的,下面繼續(xù)生活場(chǎng)景珍特。

生活實(shí)例

我們繼續(xù)說(shuō)王二麻子的故事祝峻,上次土地登記錯(cuò)誤,提交了報(bào)告扎筒,本身想的會(huì)解決掉莱找,但是由于各種原因,還辦成這件事嗜桌,所以王二麻子焦急了奥溺,打算去另一個(gè)城市找一下自己的朋友尋求幫助,由于距離比較遠(yuǎn)骨宠,王二麻子向的怎么去浮定,有三種辦法目前,坐飛機(jī)层亿,坐火車(chē)桦卒,坐汽車(chē),好匿又,我們現(xiàn)在就設(shè)計(jì)一下代碼方灾,送王二麻子去見(jiàn)朋友。

封裝出行方式類(lèi):

public class Traffic {
    public static void air(){  //飛機(jī)
        System.out.print("800");
    }
    public static void train(){  //火車(chē)
        System.out.print("300");
    }
    public static void bus(){    //長(zhǎng)途汽車(chē)
        System.out.print("400");
    }
}

測(cè)試類(lèi)

public class MyClass {
    public static void main(String[] args) {
        Traffic.air();
        Traffic.train();
        Traffic.bus();
    }
}

這里我們很簡(jiǎn)單的直接調(diào)用Traffic類(lèi)的靜態(tài)方法就可以讓王二麻子選擇出行方式碌更,這樣看起來(lái)很好很正常裕偿,但是也明顯有弊端,假如王二麻子想要坐私家車(chē)出行痛单,這個(gè)就得再向traffic類(lèi)里面加一個(gè)靜態(tài)方法嘿棘,這樣隨著出行的方式的增加我們這個(gè)類(lèi)一只在修改,這樣違反了開(kāi)閉原則旭绒,而且類(lèi)變的越來(lái)越大鸟妙,變得難以維護(hù)后期焦人。所以我們就得考慮用一個(gè)套路-策略套路。
接下來(lái)我們用策略套路來(lái)給王二麻子設(shè)計(jì)出行路線:

所有方式的頂級(jí)接口

public interface CommonTraffic {
    void getPrice();
}
飛機(jī)類(lèi)
public class Air implements CommonTraffic {
    @Override
    public void getPrice() {
        System.out.print(800);
    }
}
火車(chē)類(lèi)
public class Train implements CommonTraffic {
    @Override
    public void getPrice() {
        System.out.print(300);
    }
}
汽車(chē)類(lèi)
public class Bus implements CommonTraffic {
    @Override
    public void getPrice() {
        System.out.print(400);
    }
}
王二麻子直接調(diào)用的交通類(lèi)
public class Traffic {

    private CommonTraffic traffic;

    public void getPrice() {
        traffic.getPrice();
    }

    public void setTraffic(CommonTraffic traffic) {
        this.traffic = traffic;
    }
}

這個(gè)中間類(lèi)很重要圆仔,它是策略模式的關(guān)鍵。

測(cè)試類(lèi)
public class MyClass {
    public static void main(String[] args) {
        Traffic traffic = new Traffic();   //創(chuàng)建交通類(lèi)
        Air air = new Air();       //選擇要出行的方式
        traffic.setTraffic(air);    //設(shè)置給交通類(lèi)
        traffic.getPrice();      //獲取出行價(jià)格
    }
}

接下來(lái)我們?cè)倏赐醵樽哟蛩闼郊臆?chē)出行蔫劣,那么坪郭,只需要?jiǎng)?chuàng)建一個(gè)私家車(chē)類(lèi),然后設(shè)置給traffic就可以脉幢。這樣很好的滿足了開(kāi)閉原則歪沃,架構(gòu)上很清晰,不會(huì)因?yàn)樾薷哪骋环N出行方式而可能影響其他類(lèi),高度解耦嫌松,這就是策略模式的好處沪曙。
下面我們?cè)倥e一個(gè)Android開(kāi)發(fā)中遇到的使用策略模式的情況:
比如我們自定義了一個(gè)View:

public class CustomView extends View {
    private ICustomView customBean;

    public CustomView(Context context) {
        super(context);
    }

    public CustomView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        customBean.getViewName();
        customBean.getViewAge();
        customBean.getViewAddress();
        customBean.getViewMotto();
    }

    public void setData(ICustomView bean){
        this.customBean = bean;
    }
}

實(shí)體類(lèi):

interface ICustomView {
    public String getViewName();

    public int getViewAge();

    public String getViewAddress();

    public String getViewMotto();
    //...
}

上面我們自定義了一個(gè)view,數(shù)據(jù)就是通過(guò)public void setData(ICustomView bean)這個(gè)方法設(shè)置萎羔,而ICustomView這個(gè)接口里面有很多字段獲取方法液走,那么我們可能會(huì)在很多地方都用到這個(gè)自定義view,但是服務(wù)器給的字段名字不可能一樣,那么怎么辦?我們用策略套路贾陷,讓所有的使用自定義view的數(shù)據(jù)類(lèi)都繼承一個(gè)公共的接口缘眶,這個(gè)接口提供返回統(tǒng)一數(shù)據(jù)的方法,這樣就實(shí)現(xiàn)了復(fù)用髓废,這其實(shí)也是策略模式的一種巷懈。

總結(jié)

第二篇就這樣結(jié)束了,都是根據(jù)自己的理解和碰到的問(wèn)題寫(xiě)的慌洪,定義優(yōu)缺點(diǎn)已經(jīng)總結(jié)到上面顶燕,看完例子大家再去看一下定義這些東西,可能會(huì)理解很多冈爹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末涌攻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子频伤,更是在濱河造成了極大的恐慌癣漆,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剂买,死亡現(xiàn)場(chǎng)離奇詭異惠爽,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)瞬哼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)婚肆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人坐慰,你說(shuō)我怎么就攤上這事较性∮蒙” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵赞咙,是天一觀的道長(zhǎng)责循。 經(jīng)常有香客問(wèn)我,道長(zhǎng)攀操,這世上最難降的妖魔是什么院仿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮速和,結(jié)果婚禮上歹垫,老公的妹妹穿的比我還像新娘。我一直安慰自己颠放,他們只是感情好排惨,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著碰凶,像睡著了一般暮芭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上欲低,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天谴麦,我揣著相機(jī)與錄音,去河邊找鬼伸头。 笑死匾效,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的恤磷。 我是一名探鬼主播面哼,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扫步!你這毒婦竟也來(lái)了魔策?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤河胎,失蹤者是張志新(化名)和其女友劉穎闯袒,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體游岳,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡政敢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胚迫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喷户。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖访锻,靈堂內(nèi)的尸體忽然破棺而出褪尝,到底是詐尸還是另有隱情闹获,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布河哑,位于F島的核電站避诽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏璃谨。R本人自食惡果不足惜沙庐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望睬罗。 院中可真熱鬧轨功,春花似錦旭斥、人聲如沸容达。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)花盐。三九已至,卻和暖如春菇爪,著一層夾襖步出監(jiān)牢的瞬間算芯,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工凳宙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熙揍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓氏涩,卻偏偏與公主長(zhǎng)得像届囚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子是尖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,304評(píng)論 25 707
  • 我的微信群內(nèi)有同學(xué)準(zhǔn)備挑戰(zhàn)自己饺汹,對(duì)抗懶惰蛔添,摩拳擦掌,下定決心日更兜辞。他們這種努力學(xué)習(xí)迎瞧,奮發(fā)向上的精神,確實(shí)讓人肅然起...
    別山舉水閱讀 4,789評(píng)論 208 244
  • 新的一年逸吵,開(kāi)始嘗試寫(xiě)腦袋里的各種想法夹攒,我定義為未來(lái)消息,是的胁塞,未來(lái)的消息咏尝。
    未來(lái)消息閱讀 74評(píng)論 0 0
  • 我老家后面有一片“風(fēng)水寶地”——小樹(shù)林压语。它四季分明,更是我生活中的一大樂(lè)趣编检。每次我回家胎食,總要獨(dú)自游覽番,每每...
    悟空錄閱讀 226評(píng)論 0 1
  • 文:行之 許嵩的專(zhuān)輯《不如吃茶去》,其中一首《等到煙火清涼》蕾总,整首歌只有一句歌曲粥航,一段旋律。一共重復(fù)了九遍生百。 歌詞...
    在下行之閱讀 5,682評(píng)論 59 129