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

首先上定義:策略模式定義了算法族缔逛,分別封裝起來,讓他們相互之間可以互相替換冰悠,此模式讓算法的變化獨(dú)立于使用算法的客戶堡妒。
從定義上看,策略模式中的策略指的就是算法溉卓,或者說方法皮迟,本質(zhì)上是一種對行為的封裝。既然是對行為的封裝桑寨,肯定是用接口而不是抽象類伏尼。
讓客戶代碼對具體實(shí)現(xiàn)透明,即常說的針對接口編程尉尾,也就是設(shè)計(jì)模式中的依賴倒轉(zhuǎn)原則爆阶。
舉個(gè)栗子:
有個(gè)戰(zhàn)士要出征打仗,需要使用武器沙咏,使用槍和使用劍辨图,或者弓箭,這些都可以作為備選策略肢藐。理論上故河,戰(zhàn)士肯定是希望在各種策略之間隨意切換,至于各種策略是如何實(shí)現(xiàn)的戰(zhàn)士其實(shí)不需要關(guān)心吆豹。

上代碼:
首先鱼的,使用武器作為策略理盆,這個(gè)是我們需要抽象的部分,戰(zhàn)士作為策略的使用者(方法調(diào)用者)凑阶,可能會有不同的戰(zhàn)士猿规,如國王,騎士:
UML看起來像下面這個(gè)樣子:


image.png

如圖所示:定義了武器使用的接口WeaponBehavior,其中有兩種實(shí)現(xiàn) ArrowBehavior晌砾、SwordBehavior坎拐。
接口的調(diào)用者戰(zhàn)士:Fighter烦磁,戰(zhàn)士也分不同類型养匈,國王( King)和騎士(Knight)。
其中都伪,武器是可以在使用者手中隨意切換的呕乎,國王可以用劍也可以用弓箭,我們用方法setWeapon來切換武器陨晶。
代碼如下:

/**
 * 武器接口
 * @author saisaimayi
 *
 */
public interface WeaponBehavior {
    public void useWeapon();
}

/**
 * 劍實(shí)現(xiàn)武器的具體功能
 * @author saisaimayi
 *
 */
public class SwordBehavior implements WeaponBehavior {
    public void useWeapon() {
        System.out.println("fight with Sword...");
    }
}

/**
 * 實(shí)現(xiàn)弓箭
 * @author saisaimayi
 *
 */
public class ArrorBehavior implements WeaponBehavior {
    public void useWeapon() {
        System.out.println("fight with Arrow...");
    }
}


/**
 * 戰(zhàn)士抽象類
 * @author saisaimayi
 *
 */
public abstract class Fighter { 
    protected WeaponBehavior weapon;     
    public void setWeapon(WeaponBehavior weapon){
        this.weapon = weapon;
    }   
    public abstract void fight();
}

/**
 * 國王類
 * @author saisaimayi
 *
 */
public class King extends Fighter { 
    private void assembleArmy() {
        System.out.println("Assembling the army...");
    }
    @Override
    public void fight() {
        assembleArmy();
        weapon.useWeapon();
    }
}

/**
 * 騎士類
 * @author saisaimayi
 *
 */
public class Knight extends Fighter {
    private void prepareHourse(){
        System.out.println("prepare the hourse for battle...");
    }
    @Override
    public void fight() {
        prepareHourse();
        weapon.useWeapon();
    }
}

import junit.framework.TestCase;

/**
 * 測試
 * @author saisaimayi
 *
 */
public class KingTest extends TestCase {
    public void test(){
        King king = new King();
        king.setWeapon(new SwordBehavior());
        king.fight();
        king.setWeapon(new ArrorBehavior());
        king.fight();
        Knight knight = new Knight();
        knight.setWeapon(new SwordBehavior());
        knight.fight();
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末猬仁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子先誉,更是在濱河造成了極大的恐慌湿刽,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褐耳,死亡現(xiàn)場離奇詭異诈闺,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)铃芦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進(jìn)店門雅镊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人刃滓,你說我怎么就攤上這事仁烹。” “怎么了咧虎?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵卓缰,是天一觀的道長。 經(jīng)常有香客問我砰诵,道長僚饭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任胧砰,我火速辦了婚禮鳍鸵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尉间。我一直安慰自己偿乖,他們只是感情好击罪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贪薪,像睡著了一般媳禁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上画切,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天竣稽,我揣著相機(jī)與錄音,去河邊找鬼霍弹。 笑死毫别,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的典格。 我是一名探鬼主播岛宦,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼耍缴!你這毒婦竟也來了砾肺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤防嗡,失蹤者是張志新(化名)和其女友劉穎变汪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚁趁,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡裙盾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了荣德。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闷煤。...
    茶點(diǎn)故事閱讀 38,673評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖涮瞻,靈堂內(nèi)的尸體忽然破棺而出鲤拿,到底是詐尸還是另有隱情,我是刑警寧澤署咽,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布近顷,位于F島的核電站,受9級特大地震影響宁否,放射性物質(zhì)發(fā)生泄漏窒升。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一慕匠、第九天 我趴在偏房一處隱蔽的房頂上張望饱须。 院中可真熱鬧,春花似錦台谊、人聲如沸蓉媳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酪呻。三九已至减宣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玩荠,已是汗流浹背漆腌。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阶冈,地道東北人闷尿。 一個(gè)月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像眼溶,于是被迫代替她去往敵國和親悠砚。 傳聞我的和親對象是個(gè)殘疾皇子晓勇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評論 2 349

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

  • 一堂飞、什么是策略模式 策略模式屬于對象的行為模式。其用意是針對一組算法绑咱,將每一個(gè)算法封裝到具有共同接口的獨(dú)立的類中绰筛,...
    雅俗共賞M閱讀 461評論 0 0
  • 1. 概述 (1)策略模式的功能 策略模式的功能是把具體的算法實(shí)現(xiàn),從具體的業(yè)務(wù)處理里面獨(dú)立出來描融,把它們實(shí)現(xiàn)成為單...
    CrixalisAs閱讀 183評論 0 0
  • 雨天的下午铝噩,我坐在咖啡館里看書,看久了有些疲憊窿克,眼睛離開掌中的書骏庸,抬起頭,望向窗外年叮,通過寬大的落地玻璃具被,看見了栽在...
    俗然閱讀 296評論 0 2
  • 朋友出門,讓我?guī)兔﹀迬滋旃贰?第一天只损,我沿著自己喜歡的路線向前走一姿,盡管小狗拉著我往別處去,我也不去跃惫。 第二天時(shí)間充...
    淘氣三人組閱讀 227評論 1 2
  • “彤彤吃飯了飯都涼涼了”我端起碗一邊吃叮叹,一邊說,可她還像沒事似的在看書爆存,我想機(jī)會來了蛉顽,平時(shí)她很少看書的,這兩天我把...
    找個(gè)理由去飛閱讀 216評論 0 2