国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

策略模式

hidogs / 3204人閱讀

簡(jiǎn)介

1.學(xué)習(xí)本篇博文,我們知道在什么場(chǎng)景下使用策略模式。
2.策略模式的優(yōu)缺點(diǎn)。
3.策略模式的思想。

場(chǎng)景

某公司需要每個(gè)周五每名員工都要提交周報(bào),在該公司可以提交周報(bào)的行為或者“算法”有:郵箱提交、SVN、Git后兩種一般是開(kāi)發(fā)部門使用的(剛開(kāi)始還沒(méi)有Git提交方式)。
那么在該場(chǎng)景中我們是如何設(shè)計(jì)業(yè)務(wù)邏輯呢?

你可能這么想,我用繼承的方式多好,在一個(gè)超類中都定義有郵箱提交,SVN提交,然后具體角色去繼承,然后分別實(shí)現(xiàn)這些方法,在進(jìn)行調(diào)用。
但是你是不是忽略了一個(gè)問(wèn)題,一個(gè)人事部門的前臺(tái)小姐姐并不會(huì)SVN提交方式,你確實(shí)給她也擁有這樣的方式了,這不是明顯的設(shè)計(jì)漏洞嗎?
而且當(dāng)你使用這樣的方式的時(shí)候,如果開(kāi)發(fā)部門經(jīng)理,又提出新的想法添加了Git提交方式,那么你是不是需要修改了很多代碼了呢?牽一發(fā)而動(dòng)全身啊
子類的代碼重復(fù)到你崩潰了,而且很多部門使用的提交方式不同,我們并不需要知道其他部門的提交方式等等。
所以繼承很難解決我們現(xiàn)在的問(wèn)題了。

那么我們應(yīng)該怎么設(shè)計(jì)呢?
答案就是下文

分析 什么是策略模式?

策略模式是:定義了算法族,分別封裝起來(lái),讓其相互替換,相互獨(dú)立,為達(dá)到算法動(dòng)態(tài)修改的角色提供了獨(dú)立。

為什么需要策略模式?

1.從定義可以看出策略模式是定義了行為“算法”族,將其封裝起來(lái),給用戶使用的,如果算法改變,那么只需添加或者修改算法方式便能解決問(wèn)題了,而無(wú)需修改其他原有的行為“算法”,因?yàn)樗麄兪窍嗷オ?dú)立的。
2.對(duì)客戶隱藏具體行為“算法”的實(shí)現(xiàn)細(xì)節(jié),彼此之間相互獨(dú)立。
3.我們的場(chǎng)景需要完全符合策略模式,封裝了不同的提交行為“算法”。

進(jìn)入代碼分析
我們先來(lái)看一下這個(gè)UML類圖進(jìn)行分析

具體實(shí)現(xiàn)步驟

1.定義一個(gè)行為“算法”,該行為“算法”是一個(gè)抽象類或者是接口
2.各種獨(dú)立的行為去實(shí)現(xiàn)該行為“算法”接口
3.定義一個(gè)角色,是一個(gè)抽象超類或者接口
4.超類角色里面有一個(gè)封裝的行為或者是“算法”的屬性
5.定義一個(gè)方法進(jìn)行委托該行為或者“算法”
6.具體的角色繼承超類角色,并實(shí)現(xiàn)抽象方法

具體代碼分析

SubmissionBehavior 接口

/**
 * Author Eirunye
 * Created by on 2018/8/31.
 * Describe 定義了一個(gè)提交的行為稱為一簇"算法"
 * 這可以是一個(gè)抽象類或者是一個(gè)接口
 */
public interface SubmissionBehavior {

     void commit();
}

MailCommitBehavior.class

/**
 * Author Eirunye
 * Created by on 2018/8/31.
 * Describe 郵箱提交行為
 */
public class MailCommitBehavior implements SubmissionBehavior{
    @Override
    public void commit() {
        System.out.println("郵箱提交周報(bào)行為");
    }
}

Character.class 抽象類

/**
 * Author Eirunye
 * Created by on 2018/8/31.
 * Describe 定義一個(gè)抽象超類角色
 * 或者這里也可以是接口
 */
public abstract class Character {

    //一個(gè)角色有一個(gè)這樣的行為
    public SubmissionBehavior submissionBehavior;

    public abstract void display();

    //完成提交行為 委托
    public void completeCommit(){
        submissionBehavior.commit();
    }

    //動(dòng)態(tài)設(shè)置行為
    public void setSubmissionBehavior(SubmissionBehavior submissionBehavior) {
        this.submissionBehavior = submissionBehavior;
    }
}

Coder.class 具體的角色

/**
 * Author Eirunye
 * Created by on 2018/8/31.
 * Describe 開(kāi)發(fā)員
 */
public class Coder extends Character{

    public Coder() {
        submissionBehavior = new SVNCommitBehavior();
    }

    @Override
    public void display() {
        System.out.println("剛開(kāi)始使用的周報(bào)提交方式是SVN");
    }
}
測(cè)試

Test.class

/**
 * Author Eirunye
 * Created by on 2018/8/31.
 * Describe 測(cè)試
 */
public class Test {

    public static void main(String[] args) {
        //創(chuàng)建一個(gè)碼農(nóng)提交方式
        Character character = new Coder();
        character.completeCommit();

        //創(chuàng)建一個(gè)前臺(tái)小姐姐提交方式
        Character character1 = new ReceptionSister();
        character1.completeCommit();

        //某天開(kāi)發(fā)部們經(jīng)理說(shuō)了以后開(kāi)發(fā)部要統(tǒng)一使用Git方式提交周報(bào)了,
        //那么如下看看發(fā)生什么情況
        Character character2 = new Coder();
        character2.setSubmissionBehavior(new GitCommitBehavior());//動(dòng)態(tài)設(shè)置提交方式
        character2.completeCommit();
    }
}
輸出結(jié)果:
C:Javajdk1.8.0_161in...
SVN提交行為
郵箱提交周報(bào)行為
新增的Git提交周報(bào)行為

Process finished with exit code 0
下載

策略模式案例代碼

總結(jié)

我們學(xué)習(xí)了策略模式,在生活中是經(jīng)常運(yùn)用到的,本例只是一個(gè)場(chǎng)景。
我們?cè)谠O(shè)計(jì)開(kāi)發(fā)的時(shí)候一定要“多用組合,少用繼承”。
針對(duì)接口變成,而不針對(duì)實(shí)現(xiàn)編程。

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

1.策略模式提供了管理相關(guān)的算法族的辦法。策略類的等級(jí)結(jié)構(gòu)定義了一個(gè)算法或行為族。通過(guò)使用繼承抽象超類可以把公共的代碼轉(zhuǎn)移到抽象超類父類里面,從而避免重復(fù)的代碼。
2.通過(guò)實(shí)現(xiàn)接口的方式定義具體的行為“算法”,從而減少子類繼承父類相互混淆的行為。
3.使用策略模式可以避免使用多重條件轉(zhuǎn)移語(yǔ)句,動(dòng)態(tài)的改變行為,而各個(gè)具體角色行為“算法”相互獨(dú)立。

缺點(diǎn)

1.客戶端必須知道所有的具體角色,并決定使用哪個(gè)算法族,這樣在設(shè)計(jì)開(kāi)始時(shí)是需要花費(fèi)時(shí)間是封裝“算法”族的,策略模式只適用于客戶端知道所有的算法或行為的情況。
2.策略模式造成很多具體的角色,每個(gè)具體角色就得創(chuàng)建一個(gè)新的類,這樣類無(wú)法相互聯(lián)系,所以無(wú)法共享。

我的GitHub博客 設(shè)計(jì)模式

大家可以進(jìn)入這里學(xué)習(xí)設(shè)計(jì)模式

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/77022.html

相關(guān)文章

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

    摘要:可以使用其他模式來(lái)修正這個(gè)缺陷,如工廠方法模式代理模式或享元模式。我們的策略模式只是實(shí)現(xiàn)了策略的管理,但是沒(méi)有嚴(yán)格地定義適當(dāng)?shù)膱?chǎng)景使用適當(dāng)?shù)牟呗裕趯?shí)際項(xiàng)目中,一般通過(guò)工廠方法模式來(lái)實(shí)現(xiàn)策略類的聲明。源碼地址參考文獻(xiàn)設(shè)計(jì)模式之禪 定義 Define a family of algorithms,encapsulate each one,and make them interchange...

    dabai 評(píng)論0 收藏0
  • 設(shè)計(jì)模式策略模式

    摘要:一定義定義維基百科策略模式作爲(wèi)一種軟件設(shè)計(jì)模式,指對(duì)象有某個(gè)行爲(wèi),但是在不同的場(chǎng)景中,該行爲(wèi)有不同的實(shí)現(xiàn)算法。二策略模式圖我們看看策略模式是有怎樣設(shè)計(jì)結(jié)構(gòu)的。如中創(chuàng)建線程池,線程池任務(wù)滿時(shí),對(duì)提交的任務(wù)做處理就使用了策略模式。以前完整的看過(guò)《大話設(shè)計(jì)模式》,雖然完整看過(guò),也做過(guò)筆記,但現(xiàn)在依然很多已經(jīng)很模糊。這段時(shí)間趁著離職,有時(shí)間,打算重新過(guò)一遍,該篇將介紹策略模式。一、定義定義(維基百科...

    番茄西紅柿 評(píng)論0 收藏0
  • 設(shè)計(jì)模式策略模式

    摘要:一定義定義維基百科策略模式作爲(wèi)一種軟件設(shè)計(jì)模式,指對(duì)象有某個(gè)行爲(wèi),但是在不同的場(chǎng)景中,該行爲(wèi)有不同的實(shí)現(xiàn)算法。二策略模式圖我們看看策略模式是有怎樣設(shè)計(jì)結(jié)構(gòu)的。如中創(chuàng)建線程池,線程池任務(wù)滿時(shí),對(duì)提交的任務(wù)做處理就使用了策略模式。以前完整的看過(guò)《大話設(shè)計(jì)模式》,雖然完整看過(guò),也做過(guò)筆記,但現(xiàn)在依然很多已經(jīng)很模糊。這段時(shí)間趁著離職,有時(shí)間,打算重新過(guò)一遍,該篇將介紹策略模式。一、定義定義(維基百科...

    番茄西紅柿 評(píng)論0 收藏0
  • 設(shè)計(jì)模式策略模式

    摘要:一定義定義維基百科策略模式作爲(wèi)一種軟件設(shè)計(jì)模式,指對(duì)象有某個(gè)行爲(wèi),但是在不同的場(chǎng)景中,該行爲(wèi)有不同的實(shí)現(xiàn)算法。二策略模式圖我們看看策略模式是有怎樣設(shè)計(jì)結(jié)構(gòu)的。如中創(chuàng)建線程池,線程池任務(wù)滿時(shí),對(duì)提交的任務(wù)做處理就使用了策略模式。以前完整的看過(guò)《大話設(shè)計(jì)模式》,雖然完整看過(guò),也做過(guò)筆記,但現(xiàn)在依然很多已經(jīng)很模糊。這段時(shí)間趁著離職,有時(shí)間,打算重新過(guò)一遍,該篇將介紹策略模式。一、定義定義(維基百科...

    MangoGoing 評(píng)論0 收藏0
  • 我的Java設(shè)計(jì)模式-策略模式

    摘要:孫臏心里一萬(wàn)個(gè)草泥馬在奔騰,差點(diǎn)沒(méi)噎死自己滾一邊去,我們這盤(pán)跟他賽馬開(kāi)始,策略模式上場(chǎng)。在設(shè)計(jì)模式之禪中的提出通過(guò)策略枚舉和反射機(jī)制對(duì)策略模式進(jìn)行改良,膜拜了但是要添加或淘汰策略,還是得去對(duì)枚舉進(jìn)行修改,也不符合開(kāi)閉原則。 今天給大家說(shuō)說(shuō)田忌賽馬的故事。如有雷同,純屬巧合!話說(shuō)在戰(zhàn)國(guó)時(shí)期,群雄割據(jù),硝煙四起,茶余飯后還是少不了娛樂(lè)活動(dòng)的,其中賽馬是最火爆的。一天,孫臏看到田忌像個(gè)死雞似...

    zilu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<