摘要:根據(jù)教案寫出的代碼事例接口接口行為的一個(gè)實(shí)現(xiàn)行為的又另一個(gè)實(shí)現(xiàn)父類的一個(gè)子類綠頭鴨的另一個(gè)子類模型鴨方法總結(jié)。策略模式定義了算法族,分別封裝起來(lái),讓它們之間可以互相替換,此模式讓算法的變化獨(dú)立于使用算法的客戶,這是書里給出的策略模式的定義。
1、事例的背景基礎(chǔ):
做一套模擬鴨子的游戲,游戲中會(huì)出現(xiàn)各種鴨子,一邊游泳戲水,一邊呱呱叫,還有一些會(huì)飛。主要是根據(jù)鴨子這一對(duì)象的飛行行為和叫聲行為為基礎(chǔ),當(dāng)客戶提出不同的要求時(shí),如何能夠在滿足不同的要求的同時(shí),使得之前的功能正常運(yùn)行,未來(lái)的功能能夠靈活適用。
2、講解的過(guò)程:分別提供了多種方案,即就是我們通常能夠想到的,繼承、接口的方案。雖然通過(guò)這些方案都可以解決當(dāng)前的問(wèn)題,但是對(duì)于系統(tǒng)的彈性和代碼的未來(lái)適用性都不能夠滿足需求。
2.1 繼承方案:
設(shè)計(jì)一個(gè)超類Duck,包含方法quack()、swim()、fly()分別模擬鴨子的叫、游泳、飛行等行為,再包含一個(gè)抽象類display(),用于展示各個(gè)鴨子不同的外觀,讓每個(gè)鴨子子類繼承父類時(shí)實(shí)現(xiàn)display()。 優(yōu)點(diǎn):每個(gè)鴨子子類繼承父類時(shí)就同時(shí)擁有了父類的方法,可以達(dá)到代碼復(fù)用的目的。 缺點(diǎn):這樣會(huì)使某些并不適合該行為的子類也具有該行為。如果某些子類鴨子,如“橡皮鴨”,它不具備某些功能(如飛行),它就不應(yīng)該擁有這個(gè)飛行的功能。當(dāng)然,你可以在子類中通過(guò)@Override覆蓋這個(gè)方法。但是當(dāng)各個(gè)不同的子類都需要通過(guò)覆蓋修改不同的方法時(shí),就會(huì)非常繁瑣,而且容易出現(xiàn)紕漏,且這些新覆蓋的方法不能被復(fù)用。如“橡皮鴨”只會(huì)叫不會(huì)飛,“木頭鴨”不會(huì)叫也不會(huì)飛。以后每當(dāng)有新的鴨子子類出現(xiàn),我們都要去檢查并可能需要覆蓋這些方法,然后根據(jù)不同的需求做出不同的改進(jìn)。這是不符合靈活適用的目的的。
2.2 接口方案
在超類Duck中將quack()、fly()等可變的方法用接口Quackable(),F(xiàn)lyable()來(lái)代替,然后在每個(gè)鴨子子類中,如果具有“飛行”或“叫”這個(gè)功能就實(shí)現(xiàn)“飛行“或”叫“這個(gè)接口。 優(yōu)點(diǎn):可以暫時(shí)解決眼前的困難。 缺點(diǎn):代碼無(wú)法復(fù)用,如果有N個(gè)子類,都具有飛行的行為,就需要重復(fù)N次代碼。這對(duì)于開發(fā)人員和產(chǎn)品本身都是不符合要求的。
2.3 引入設(shè)計(jì)模式
2.3.1設(shè)計(jì)模式的原則
1、找出程序中可能需要變化的地方和不需要變化的地方,將它們獨(dú)立開來(lái)。讓系統(tǒng)中的某部分改變不會(huì)影響其他部分。 2、針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)。利用多態(tài),針對(duì)超類型編程,執(zhí)行時(shí)根據(jù)實(shí)際狀況執(zhí)行到真正的行為,不會(huì)被綁死在超類型的行為上。以前的做法是:行為來(lái)自超類的具體實(shí)現(xiàn)或是繼承某個(gè)接口并由子類自行實(shí)現(xiàn)。這兩種方法都捆綁于”實(shí)現(xiàn)“,無(wú)法方便地更改行為。現(xiàn)在我們利用接口代表每個(gè)行為,比如FlyBehavior,QuackBehavior,然后讓各個(gè)行為類實(shí)現(xiàn)這些接口,然后在Duck類中只要定義這個(gè)接口的實(shí)例變量即可,這樣在各個(gè)鴨子子類中如果想擁有某種特定的行為,只要用這個(gè)接口實(shí)例變量去引用具體的行為類即可。 3、多用組合,少用繼承。飛行和叫這兩種不同的行為,我們分別為其建立兩組不同的行為類,然后在Duck類中通過(guò)接口實(shí)例變量結(jié)合起來(lái),這就是”組合“。使得系統(tǒng)具有很大的彈性。
2.3.2根據(jù)教案寫出的代碼事例:
1、接口FlyBehavior public interface FlyBehavior { public void fly(); } 2、接口QuackBehavior public interface QuackBehavior { public void quack(); } 3、Fly行為的一個(gè)實(shí)現(xiàn)——FlyNoWay public class FlyNoWay implements FlyBehavior{ @Override public void fly() { System.out.println("I can not fly."); } } 4、public class FlyWithWings implements FlyBehavior { @Override public void fly() { System.out.println("I can fly!"); } } 5、Fly行為的又另一個(gè)實(shí)現(xiàn)——FlyRocketPowered public class FlyRocketPowered implements FlyBehavior{ @Override public void fly() { System.out.println("I am flying with a rocket."); } } 6、父類Duck public abstract class Duck { FlyBehavior flyBehavior; QuackBehavior quackBehavior; public abstract void display(); public void performFly(){ flyBehavior.fly(); } public void performQuack(){ quackBehavior.quack(); } public void setFlyBehavior(FlyBehavior fb){ this.flyBehavior = fb; } public void setQuackBehavior(QuackBehavior qb){ this.quackBehavior=qb; } } Duck的一個(gè)子類——綠頭鴨MallardDuck public class MallardDuck extends Duck{ public MallardDuck() { flyBehavior = new FlyWithWings(); quackBehavior = new QuackWithGuaGua(); } @Override public void display() { System.out.println("I am a MallardDuck."); } } Duck的另一個(gè)子類——模型鴨ModelDuck public class ModelDuck extends Duck { public ModelDuck() { flyBehavior = new FlyNoWay(); quackBehavior = new QuackNoWay(); } @Override public void display() { System.out.println("I am a ModelDuck."); } } main方法:MiniDuckSimulator public class MiniDuckSimulator { public static void main(String[] args) { Duck mallardDuck = new MallardDuck(); mallardDuck.display(); mallardDuck.performFly(); mallardDuck.performQuack(); Duck modelDuck = new ModelDuck(); modelDuck.display(); modelDuck.performFly(); modelDuck.performQuack(); modelDuck.setFlyBehavior(new FlyRocketPowered()); modelDuck.performFly(); } }
3、總結(jié)。
策略模式定義了算法族,分別封裝起來(lái),讓它們之間可以互相替換,此模式讓算法的變化獨(dú)立于使用算法的客戶,這是書里給出的策略模式的定義。個(gè)人的理解:就是我們要把一些對(duì)象的可變的行為抽象出來(lái),多帶帶進(jìn)行封裝,用一組行為類(算法族)來(lái)實(shí)現(xiàn)該特定的接口,這樣任何類(如Duck)如果想擁有這些算法族中的某個(gè)算法,都可以通過(guò)定義接口實(shí)例變量而擁有該整個(gè)算法族,在子類中再對(duì)該變量進(jìn)行賦值。像這個(gè)例子里,通過(guò)定義了FlyBehavior,這樣以后任何想有飛行行為的類如飛機(jī),都可以調(diào)用這個(gè)接口及實(shí)現(xiàn)它的各個(gè)飛行類。且飛行行為的變化可以通過(guò)增加新的飛行類來(lái)實(shí)現(xiàn),不會(huì)對(duì)其他部分(如quack()、display()等行為,亦或是已擁有某些特定飛行行為的對(duì)象)造成任何影響,即”算法的變化獨(dú)立于使用算法的客戶“。而且各個(gè)飛行行為之間也可以互相替換。即 setFlyBehavior(Flybehavior fb)。通過(guò)這種方式,能夠使代碼的復(fù)用性很強(qiáng),又可以解決各種多變的需求。 通過(guò)這樣的學(xué)習(xí)一遍策略模式,雖然對(duì)于策略模式有了一定的理解,但是想要靈活的運(yùn)用在開發(fā)的過(guò)程中,還是需要多多的練習(xí)和體會(huì)。
注:本文的事例和解析思路來(lái)源于內(nèi)容來(lái)源于《Heard First 設(shè)計(jì)模式》一書
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/77313.html
時(shí)間:2017年08月31日星期四說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:策略模式簡(jiǎn)介 1-1 簡(jiǎn)介 課程大綱 什么是策略模式 策略模式如何實(shí)現(xiàn) 策略模式總結(jié)篇 實(shí)例案例分享 日常生活中的策略 Wor...
摘要:做前端開發(fā)已經(jīng)好幾年了,對(duì)設(shè)計(jì)模式一直沒(méi)有深入學(xué)習(xí)總結(jié)過(guò)。今天第一天,首先來(lái)講策略模式。什么是策略模式四兄弟的經(jīng)典設(shè)計(jì)模式中,對(duì)策略模式的定義如下定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái),并且使它們可互相替換。 做前端開發(fā)已經(jīng)好幾年了,對(duì)設(shè)計(jì)模式一直沒(méi)有深入學(xué)習(xí)總結(jié)過(guò)。隨著架構(gòu)相關(guān)的工作越來(lái)越多,越來(lái)越能感覺到設(shè)計(jì)模式成為了我前進(jìn)道路上的一個(gè)阻礙。所以從今天開始深入學(xué)習(xí)和總結(jié)經(jīng)典的設(shè)計(jì)模...
摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:我們今天也來(lái)做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:本系列為設(shè)計(jì)模式與開發(fā)實(shí)踐作者曾探學(xué)習(xí)總結(jié),如想深入了解,請(qǐng)支持作者原版策略模式策略模式的定義定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái),并且使它們可以互相替換。 本系列為《JavaScript設(shè)計(jì)模式與開發(fā)實(shí)踐》(作者:曾探)學(xué)習(xí)總結(jié),如想深入了解,請(qǐng)支持作者原版 策略模式 策略模式的定義:定義一系列的算法,把它們一個(gè)個(gè)封裝起來(lái),并且使它們可以互相替換。 舉個(gè)形象的例子,使用策略模式計(jì)算...
閱讀 1870·2021-11-25 09:43
閱讀 3161·2021-11-15 11:38
閱讀 2708·2019-08-30 13:04
閱讀 483·2019-08-29 11:07
閱讀 1492·2019-08-26 18:37
閱讀 2697·2019-08-26 14:07
閱讀 582·2019-08-26 13:52
閱讀 2278·2019-08-26 12:09