設(shè)計(jì)模式之一——策略模式

策略模式 是指有一定行動(dòng)內(nèi)容的相對(duì)穩(wěn)定的策略名稱剑梳。用比較易懂的話來(lái)說(shuō)就是苗傅,定義算法族捺球,分別封裝起來(lái)缸浦,讓它們之間可以互相替換。

(一)簡(jiǎn)介

1. 主要解決的問(wèn)題

在一個(gè)系統(tǒng)中氮兵,如果某個(gè)問(wèn)題有多種解決方案(即有多種相似算法的情況下)裂逐,如果使用if...else...去控制這些算法的使用,會(huì)使得代碼變得冗長(zhǎng)及復(fù)雜化泣栈,因此卜高,會(huì)使得系統(tǒng)變的更復(fù)雜和難以維護(hù)。

如果將這些算法封裝成一個(gè)個(gè)的類秩霍,并且實(shí)現(xiàn)同一個(gè)接口篙悯,那么這些算法可以任意地被替換。

當(dāng)系統(tǒng)在運(yùn)行時(shí)铃绒,如果想改變某種行為或解決方法的話鸽照,只需要setter相關(guān)的算法類即可,不用再通過(guò)if...else...的判斷邏輯去決定使用哪個(gè)算法颠悬。這樣就可以使得代碼行數(shù)變得更少矮燎,代碼邏輯更清晰,使得代碼更具有可讀性赔癌。

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

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

    1. 算法可以自由切換诞外;
    2. 避免使用多重條件判斷;
    3. 擴(kuò)展性良好灾票。
  • 缺點(diǎn):

    1. 策略類會(huì)增多峡谊;
    2. 所有策略類都需要對(duì)外暴露。

3. 使用場(chǎng)景

使用策略模式時(shí)刊苍,主要考慮以下幾個(gè)場(chǎng)景:

  • 如果系統(tǒng)中有許多類既们,而這些類之間的區(qū)別僅在于它們的算法不同,那么使用策略模式可以動(dòng)態(tài)地讓對(duì)象在多種算法中選擇一種正什;
  • 如果系統(tǒng)需要?jiǎng)討B(tài)地在幾種算法中選擇一種啥纸,那么使用策略模式可以更方便;
  • 如果對(duì)象的某種行為中婴氮,有多重條件選擇語(yǔ)句斯棒,最好是選擇策略模式盾致。

(二)實(shí)現(xiàn)

為了更好的解釋策略模式,我們舉一個(gè)日常生活中常見的例子來(lái)說(shuō)明荣暮。

1. 需求說(shuō)明

某視頻網(wǎng)站正在播出一部熱門電視劇庭惜,但是,神坑的是渠驼,該視頻網(wǎng)站采取饑餓營(yíng)銷的方式蜈块,每周只更新幾集鉴腻。

為了更好的服務(wù)廣大消費(fèi)者(其實(shí)迷扇,是為了掏空看客老爺們口袋中的錢),該網(wǎng)站推出了“充會(huì)員爽哎,比別人更早擁有”的活動(dòng)蜓席。

網(wǎng)站規(guī)定:普通用戶每周只能看四集;VIP用戶每周可以看六集课锌;SVIP用戶每周可以看八集厨内。

那么,請(qǐng)你設(shè)計(jì)一個(gè)權(quán)限控制系統(tǒng)渺贤,以此來(lái)控制不同權(quán)限用戶的觀看集數(shù)雏胃。

2. 系統(tǒng)設(shè)計(jì)

根據(jù)上述的需求說(shuō)明,我們可以得出結(jié)論: 每位用戶都可以看視頻志鞍,唯一不同的是看的集數(shù)不一樣瞭亮。

基于該結(jié)論,我們可以認(rèn)為:每個(gè)對(duì)象(用戶)的活動(dòng)(看視頻)都是一樣的固棚,不同的是行為(看的集數(shù))不同统翩。那么,我們采用策略模式此洲,來(lái)設(shè)計(jì)這套權(quán)限控制系統(tǒng)厂汗。

通過(guò)上述分析,我們構(gòu)建一個(gè)Permission接口呜师;三個(gè)不同的權(quán)限用戶娶桦,分別是NormalPermissionVipPermission汁汗、SvipPermission衷畦,它們都實(shí)現(xiàn)了Permission接口;另外碰酝,我們還需要一個(gè)使用了上述三種策略的類霎匈,暫且叫它WatchVideo

類圖如下:

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

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

(1)構(gòu)建Permission接口

/**
 * 
 * 權(quán)限接口
 * @author Levi
 * @date 2021/7/24
 */
public interface Permission {

    /**
     * 校驗(yàn)權(quán)限送爸,返回可看劇集的集數(shù)
     * @return
     */
    int checkPermission();
}

(2)構(gòu)建三個(gè)不同權(quán)限的用戶

1. 普通用戶權(quán)限铛嘱,只可以看四集

/**
 *
 * 普通用戶權(quán)限
 * @author Levi
 * @date 2021/7/24
 */
public class NormalPermission implements Permission{

    /**
     * 普通用戶可以看四集
     * @return
     */
    @Override
    public int checkPermission() {
        System.out.println("普通用戶暖释,每周只可以看四集。");
        return 4;
    }
}

2. VIP用戶權(quán)限墨吓,可以看六集

/**
 *
 * VIP用戶權(quán)限
 * @author Levi
 * @date 2021/7/24
 */
public class VipPermission implements Permission{

    /**
     * VIP用戶可以看六集
     * @return
     */
    @Override
    public int checkPermission() {
        System.out.println("VIP用戶球匕,每周只可以看六集。");
        return 6;
    }
}

3. SVIP用戶權(quán)限帖烘,可以看八集

/**
 *
 * SVIP用戶權(quán)限
 * @author Levi
 * @date 2021/7/24
 */
public class SvipPermission implements Permission{

    /**
     * VIP用戶可以看八集
     * @return
     */
    @Override
    public int checkPermission() {
        System.out.println("SVIP用戶亮曹,每周只可以看八集。");
        return 8;
    }
}

(3)構(gòu)建使用類

在使用類中秘症,通過(guò)構(gòu)造器動(dòng)態(tài)實(shí)例化permission接口照卦,以此達(dá)到通過(guò)一個(gè)方法調(diào)用多種算法的目的。

/**
 *
 * 看劇的行為
 * @author Levi
 * @date 2021/7/24
 */
public class WatchVideo {

    //permission接口
    private Permission permission;

    /**
     * 在WatchVideo的構(gòu)造器中乡摹,動(dòng)態(tài)實(shí)例化permission
     * @param permission
     */
    public WatchVideo(Permission permission) {
        this.permission = permission;
    }

    /**
     * 校驗(yàn)用戶權(quán)限役耕,返回可以看的集數(shù)
     * @return
     */
    public int excutePermission() {
        return permission.checkPermission();
    }
}

(4)測(cè)試

使用watchVideo來(lái)查看當(dāng)它改變策略permission時(shí)的結(jié)果變化。

/**
 * 
 * 測(cè)試策略模式
 * @author Levi
 * @date 2021/7/24
 */
public class TestStrategy {

    public static void main(String[] args) {
        WatchVideo watchVideo;
        //不同權(quán)限用戶
//        watchVideo=new WatchVideo(new NormalPermission());
        watchVideo=new WatchVideo(new VipPermission());
//        watchVideo=new WatchVideo(new SvipPermission());
        int result=watchVideo.excutePermission();
        System.out.println(result);
    }
}

打印結(jié)果:

打印出的結(jié)果

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末聪廉,一起剝皮案震驚了整個(gè)濱河市瞬痘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌板熊,老刑警劉巖框全,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異干签,居然都是意外死亡津辩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門筒严,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)丹泉,“玉大人,你說(shuō)我怎么就攤上這事鸭蛙∧『蓿” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵娶视,是天一觀的道長(zhǎng)晒哄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)肪获,這世上最難降的妖魔是什么寝凌? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮孝赫,結(jié)果婚禮上较木,老公的妹妹穿的比我還像新娘。我一直安慰自己青柄,他們只是感情好伐债,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布预侯。 她就那樣靜靜地躺著,像睡著了一般峰锁。 火紅的嫁衣襯著肌膚如雪萎馅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天虹蒋,我揣著相機(jī)與錄音糜芳,去河邊找鬼。 笑死魄衅,一個(gè)胖子當(dāng)著我的面吹牛峭竣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播徐绑,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼邪驮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼莫辨!你這毒婦竟也來(lái)了傲茄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤沮榜,失蹤者是張志新(化名)和其女友劉穎盘榨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蟆融,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡草巡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了型酥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片山憨。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖弥喉,靈堂內(nèi)的尸體忽然破棺而出郁竟,到底是詐尸還是另有隱情,我是刑警寧澤由境,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布棚亩,位于F島的核電站,受9級(jí)特大地震影響虏杰,放射性物質(zhì)發(fā)生泄漏讥蟆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一纺阔、第九天 我趴在偏房一處隱蔽的房頂上張望瘸彤。 院中可真熱鬧,春花似錦笛钝、人聲如沸质况。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拯杠。三九已至掏婶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間潭陪,已是汗流浹背雄妥。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留依溯,地道東北人老厌。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像黎炉,于是被迫代替她去往敵國(guó)和親枝秤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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

  • 策略模式 策略模式屬于對(duì)象的一種行為模式慷嗜。它主要表現(xiàn)在對(duì)象通過(guò)一個(gè)抽象的策略角色調(diào)用由多個(gè)具有共同接口的獨(dú)立類或抽...
    095b62ead3cd閱讀 145評(píng)論 0 1
  • 筆記 RESTful架構(gòu)風(fēng)格概述 RESTful架構(gòu)風(fēng)格 RESTful架構(gòu)風(fēng)格最初由Roy T. Fieldin...
    plutoese閱讀 12,586評(píng)論 3 58
  • 每個(gè)系統(tǒng)都有權(quán)限設(shè)計(jì)淀弹,本篇主要將初始的權(quán)限設(shè)計(jì)的原理,不依賴任何框架庆械,以直觀的角度剖析web的權(quán)限設(shè)計(jì)薇溃。 權(quán)限設(shè)計(jì)...
    放開那個(gè)BUG閱讀 4,560評(píng)論 2 40
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來(lái)的情緒缭乘。表情可以傳達(dá)很多信息沐序。高興了當(dāng)然就笑了,難過(guò)就哭了堕绩。兩者是相互影響密不可...
    Persistenc_6aea閱讀 124,547評(píng)論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者策幼,不喜歡去冒險(xiǎn),但是人生放棄了冒險(xiǎn)奴紧,也就放棄了無(wú)數(shù)的可能特姐。 ...
    yichen大刀閱讀 6,041評(píng)論 0 4