簡(jiǎn)介
1.學(xué)習(xí)本篇博文,我們知道在什么場(chǎng)景下使用策略模式。
2.策略模式的優(yōu)缺點(diǎn)。
3.策略模式的思想。
某公司需要每個(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)景需要完全符合策略模式,封裝了不同的提交行為“算法”。
我們先來(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ú)法共享。
大家可以進(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
摘要:可以使用其他模式來(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...
摘要:一定義定義維基百科策略模式作爲(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ò)一遍,該篇將介紹策略模式。一、定義定義(維基百科...
摘要:一定義定義維基百科策略模式作爲(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ò)一遍,該篇將介紹策略模式。一、定義定義(維基百科...
摘要:一定義定義維基百科策略模式作爲(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ò)一遍,該篇將介紹策略模式。一、定義定義(維基百科...
摘要:孫臏心里一萬(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è)死雞似...
閱讀 3020·2021-11-24 10:32
閱讀 677·2021-11-24 10:19
閱讀 5068·2021-08-11 11:17
閱讀 1455·2019-08-26 13:31
閱讀 1258·2019-08-23 15:15
閱讀 2286·2019-08-23 14:46
閱讀 2264·2019-08-23 14:07
閱讀 1073·2019-08-23 14:03