設(shè)計(jì)原則:
找出應(yīng)用中可能需要變化之處,把它們獨(dú)立出來(lái)偶宫,不要和那些不需要變化的代碼混在一起非迹,把會(huì)變化的部分取出并封裝起來(lái),好讓其他部分不會(huì)受到影響纯趋。
針對(duì)接口編程憎兽,而不是針對(duì)實(shí)現(xiàn)編程。
多用組合吵冒,少用繼承
因此纯命,鴨子的行為將被放在分開(kāi)的類——我們可以將其叫做“行為類”中,此類專門(mén)提供某行為接口的實(shí)現(xiàn)桦锄。針對(duì)接口編程的意思是針對(duì)超類型編程——變量的聲明類型應(yīng)該是超類扎附,通常是一個(gè)抽象類或者一個(gè)接口,如此结耀,只要是具體實(shí)現(xiàn)此超類型的類所產(chǎn)生的對(duì)象留夜,都可以指定給這個(gè)變量,這也意味著图甜,聲明類時(shí)不用理會(huì)以后執(zhí)行時(shí)的真正對(duì)象類型碍粥。
針對(duì)實(shí)現(xiàn)編程?
Dog d=new Dog();?
d.dark();?
針對(duì)接口編程?
Animal animal=new Dog();?
animal.makesound();?
更好的針對(duì)接口編程
a = getAnimal();?
a.makeSound();
不得不針對(duì)具體實(shí)現(xiàn)coding?
利用animal多態(tài)處理?
運(yùn)行時(shí)才指定具體實(shí)現(xiàn)的對(duì)象
然后在超類的設(shè)計(jì)中,行為變量被聲明為“接口”類型的變量黑毅,然后具體動(dòng)作的方法由接口類型的變量相對(duì)應(yīng)的方法所實(shí)現(xiàn)嚼摩。子類中,構(gòu)造函數(shù)中指明這些接口類型的變量具體對(duì)應(yīng)的是哪一個(gè)具體實(shí)現(xiàn)矿瘦。這樣的話枕面,通過(guò)一個(gè)“接口”類型的變量,靈活性就更高了缚去,雖然此時(shí)在構(gòu)造函數(shù)中我們還是引入了具體實(shí)現(xiàn)潮秘。
進(jìn)一步,我們希望可以自己設(shè)定具體的行為而不是在構(gòu)造函數(shù)中寫(xiě)死易结,那么我們可以使用set method枕荞,通過(guò)向外提供接口來(lái)設(shè)置從超類那繼承的接口類型的成員變量。
最后我們來(lái)看看這個(gè)模式的定義:
策略模式定義了算法簇搞动,分別封裝起來(lái)躏精,讓它們之間可以互相替換,此模式讓方法的變化獨(dú)立于使用方法的客戶鹦肿。
核心思想:將is-a 轉(zhuǎn)換為has-a.
基本的思路:將一些原先要繼承的方法矗烛,以接口的方式抽象出來(lái),然后再以實(shí)現(xiàn)該接口的方式定義一些類以完成實(shí)際能力的實(shí)現(xiàn)箩溃;同時(shí)在基類中以組合的方式將該接口的實(shí)例放入基類瞭吃,基類同時(shí)提供設(shè)置這個(gè)實(shí)例的接口以及這個(gè)方法的封裝碌识,子類繼承基類是對(duì)這些接口實(shí)例進(jìn)行設(shè)置即可。