策略模式

策略模式.png

定義

策略模式定義了一系列的算法欢顷,并將每一個算法封裝起來槽棍,而且使他們之間可以相互替換,策略模式讓算法獨(dú)立于使它的客戶獨(dú)立而變化

策略模式.png

角色

  • 1.環(huán)境(Context)角色
    持有一個Strategy的引用

  • 2.抽象策略(Strategy)角色
    這是一個抽象角色抬驴,通常由一個接口或抽象類實(shí)現(xiàn)炼七。此角色給出所有的具體策略類所需的接口。

  • 3.具體策略(ConcreteStrategy)角色
    包裝了相關(guān)的算法或行為布持。

需求

假設(shè)現(xiàn)在要一個上商店個搞活動豌拙。 對所有的高級會員打20%的促銷折扣;對中級會員打10%的促銷折扣题暖;對初級會員沒有折扣按傅。

得知算法
算法一:對初級會員沒有折扣。

算法二:對中級會員提供10%的促銷折扣芙委。

算法三:對高級會員提供20%的促銷折扣逞敷。

實(shí)現(xiàn)代碼

抽象策略接口:Strategy

interface IStrategy {  
    public void doSomething();  
}  

具體策略1

class ConcreteStrategy1 implements IStrategy {  
    public void doSomething() {  
        System.out.println("具體策略1");  
    }  
}  

具體策略2

class ConcreteStrategy2 implements IStrategy {  
    public void doSomething() {  
        System.out.println("具體策略2");  
    }  
}  

策略的上下文,具體的執(zhí)行者:Context

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();  
    }  
} 

重點(diǎn)

策略模式的重心不是如何實(shí)現(xiàn)算法灌侣,而是如何組織推捐、調(diào)用這些算法,從而讓程序結(jié)構(gòu)更靈活侧啼,具有更好的維護(hù)性和擴(kuò)展性牛柒。

特點(diǎn)

運(yùn)行時策略的唯一性
運(yùn)行期間堪簿,策略模式在每一個時刻只能使用一個具體的策略實(shí)現(xiàn)對象,雖然可以動態(tài)地在不同的策略實(shí)現(xiàn)中切換皮壁,但是同時只能使用一個椭更。
平等性
 策略模式一個很大的特點(diǎn)就是各個策略算法的平等性。對于一系列具體的策略算法蛾魄,大家的地位是完全一樣的虑瀑,正因?yàn)檫@個平等性,才能實(shí)現(xiàn)算法之間可以相互替換滴须。所有的策略算法在實(shí)現(xiàn)上也是相互獨(dú)立的舌狗,相互之間是沒有依賴的。

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

1.優(yōu)點(diǎn)
策略模式提供了管理相關(guān)的算法族的辦法扔水。策略類的等級結(jié)構(gòu)定義了一個算法或行為族痛侍。恰當(dāng)使用繼承可以把公共的代碼移到父類里面,從而避免代碼重復(fù)魔市。
使用策略模式可以避免使用多重條件(if-else)語句主届。多重條件語句不易維護(hù),它把采取哪一種算法讓子類實(shí)現(xiàn)
2.缺點(diǎn)
客戶端必須知道所有的策略類待德,并自行決定使用哪一個策略類君丁。這就意味著客戶端必須理解這些算法的區(qū)別,以便適時選擇恰當(dāng)?shù)乃惴惏跬Q言之谈截,策略模式只適用于客戶端知道算法或行為的情況。
由于策略模式把每個具體的策略實(shí)現(xiàn)都單獨(dú)封裝成為類涧偷,如果備選的策略很多的話,那么對象的數(shù)目就會很可觀毙死。

注意:和狀態(tài)模式不同的是燎潮,策略模式是客戶端自己定義不同策略,而狀態(tài)模式是內(nèi)部封裝得狀態(tài)扼倘,不同客戶端去設(shè)置具體的狀態(tài)處理确封。

例子

交通工具的收費(fèi):城市乘坐交通工具,打的收費(fèi)標(biāo)準(zhǔn)再菊、公交收費(fèi)標(biāo)準(zhǔn)爪喘、地鐵收費(fèi)標(biāo)準(zhǔn),按照公里來計(jì)算價格纠拔,普通處理就是各種條件判斷秉剑。對于同樣都是收費(fèi)這個計(jì)算,如果將收費(fèi)方法抽象出來稠诲,然后按照不同對象去計(jì)算侦鹏,就會讓代碼顯得沒那么臃腫诡曙,而且維護(hù)起來也很靈活;

將不同收費(fèi)方式放到不同的對象中略水,減少在客戶的判斷計(jì)算
只要告訴用的是什么交通工具价卤,然后點(diǎn)收費(fèi)

方法:
(1)抽象一個收費(fèi)接口
(2)不同交通工具,實(shí)現(xiàn)收費(fèi)計(jì)算
(3)客戶端指明交通工具渊涝,然后調(diào)用收費(fèi)

Android中應(yīng)用

動畫框架

插值器

1.給屬性動畫設(shè)置參數(shù):動畫的作用view慎璧、動畫屬性、動畫起始值和終值跨释、執(zhí)行時間胸私、延遲時間等等,這些數(shù)據(jù)
都封裝到ProtorValusHolder中煤傍。因?yàn)榭赡苁且贿B串動畫盖文,把這些動畫信息放到動畫執(zhí)行隊(duì)列。
而實(shí)際動畫是一楨楨數(shù)據(jù)聯(lián)動起來蚯姆,這里將keyFrame數(shù)據(jù)放到KeyFrameSet(是一個list)五续。

2.動畫執(zhí)行隊(duì)列
線程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市龄恋,隨后出現(xiàn)的幾起案子疙驾,更是在濱河造成了極大的恐慌,老刑警劉巖郭毕,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件它碎,死亡現(xiàn)場離奇詭異,居然都是意外死亡显押,警方通過查閱死者的電腦和手機(jī)扳肛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乘碑,“玉大人挖息,你說我怎么就攤上這事∈薹簦” “怎么了套腹?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長资铡。 經(jīng)常有香客問我电禀,道長,這世上最難降的妖魔是什么笤休? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任尖飞,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘葫松。我一直安慰自己瓦糕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布腋么。 她就那樣靜靜地躺著咕娄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪珊擂。 梳的紋絲不亂的頭發(fā)上圣勒,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機(jī)與錄音摧扇,去河邊找鬼圣贸。 笑死,一個胖子當(dāng)著我的面吹牛扛稽,可吹牛的內(nèi)容都是我干的吁峻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼在张,長吁一口氣:“原來是場噩夢啊……” “哼用含!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起帮匾,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤啄骇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瘟斜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缸夹,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年螺句,在試婚紗的時候發(fā)現(xiàn)自己被綠了虽惭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖趟紊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤蹦浦,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站里初,受9級特大地震影響锅睛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜义辕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一虾标、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧灌砖,春花似錦璧函、人聲如沸傀蚌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽善炫。三九已至,卻和暖如春库继,著一層夾襖步出監(jiān)牢的瞬間箩艺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工宪萄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留艺谆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓拜英,卻偏偏與公主長得像静汤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子居凶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

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

  • 1 場景問題# 1.1 報(bào)價管理## 向客戶報(bào)價虫给,對于銷售部門的人來講,這是一個非常重大排监、非常復(fù)雜的問題狰右,對不同的...
    七寸知架構(gòu)閱讀 5,080評論 9 62
  • 1 場景問題 1.1 報(bào)價管理 向客戶報(bào)價,對于銷售部門的人來講舆床,這是一個非常重大棋蚌、非常復(fù)雜的問題,對不同的客戶要...
    4e70992f13e7閱讀 3,087評論 2 16
  • 1. 簡介 策略(Strategy)模式定義了一系列的算法,并將每一個算法封裝起來盛垦,而且使它們還可以相互替換湿弦。策略...
    LeeLeCoder閱讀 538評論 0 1
  • 從本篇文章開始將開始一些列對Java設(shè)計(jì)模式的學(xué)習(xí)。Java設(shè)計(jì)模式是前任總結(jié)的優(yōu)秀的經(jīng)驗(yàn)腾夯,是編寫高質(zhì)量代碼的學(xué)習(xí)...
    Ruheng閱讀 1,966評論 2 9
  • $arr=array(23,5,26,4,9,85,10,2,55,44,21,39,11,16,55,88,42...
    liuboxx1閱讀 231評論 0 0