【HeadFirst 设计模式总结】1.策略模式
1.書中舉了一個(gè)鴨子類的設(shè)計(jì),有些會(huì)飛或者會(huì)叫,有些不會(huì)飛可能也不會(huì)叫,用繼承則導(dǎo)致不該有的功能通過繼承而繼承了下來,使用接口則代碼無法做到最大程度的重用。進(jìn)而引出設(shè)計(jì)原則1:找出應(yīng)用中可能需要變化之處,把它們獨(dú)立出來,不要和那些不需要變化的代碼混在一起,把會(huì)變化的部分取出并封裝起來,好讓其他部分不會(huì)受到影響。——每個(gè)設(shè)計(jì)模式背后的精神所在。
2.我們希望運(yùn)行時(shí)動(dòng)態(tài)的改變一些行為,這就引出了第二個(gè)原則:針對(duì)接口編程,而不是針對(duì)實(shí)現(xià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ì)的樣子是兩個(gè)接口,一個(gè)飛,一個(gè)叫,每個(gè)接口中有相應(yīng)的方法,然后設(shè)計(jì)不同的類對(duì)這個(gè)接口進(jìn)行不同的實(shí)現(xiàn)。
然后在超類的設(shè)計(jì)中,行為變量被聲明為“接口”類型的變量,然后具體動(dòng)作的方法由接口類型的變量相對(duì)應(yīng)的方法所實(shí)現(xiàn)。子類中,構(gòu)造函數(shù)中指明這些接口類型的變量具體對(duì)應(yīng)的是哪一個(gè)具體實(shí)現(xiàn)。這樣的話,通過一個(gè)“接口”類型的變量,靈活性就更高了,雖然此時(shí)在構(gòu)造函數(shù)中我們還是引入了具體實(shí)現(xiàn)。
3.進(jìn)一步,我們希望可以自己設(shè)定具體的行為而不是在構(gòu)造函數(shù)中寫死,那么我們可以使用setter method,通過向外提供接口來設(shè)置從超類那繼承的接口類型的成員變量。
4.最后我們看到的設(shè)計(jì)局面是:各種鴨子繼承了Duck,飛行行為實(shí)現(xiàn)了FlyBehavior接口,呱呱叫行為實(shí)現(xiàn)了QuackBehavior接口。設(shè)計(jì)的基本理念在于行為不是繼承而來的,而是通過適當(dāng)?shù)男袨閷?duì)象“組合”而來。這個(gè)總結(jié)就可以歸納出第三個(gè)設(shè)計(jì)原則:多用組合,少用繼承。這樣可使系統(tǒng)更具有彈性。
最后我們來看看這個(gè)模式的定義:
策略模式定義了算法簇,分別封裝起來,讓它們之間可以互相替換,此模式讓方法的變化獨(dú)立于使用方法的Client,適用于繼承后的動(dòng)作發(fā)生變化,要?jiǎng)討B(tài)的改變對(duì)象的行為時(shí)。
核心思想:將is-a 轉(zhuǎn)換為has-a.
?
?
基本的思路:將一些原先要繼承的方法,以接口的方式抽象出來,然后再以實(shí)現(xiàn)該接口的方式定義一些類以完成實(shí)際能力的實(shí)現(xiàn);同時(shí)在基類中以組合的方式將該接口的實(shí)例放入基類,基類同時(shí)提供設(shè)置這個(gè)實(shí)例的接口以及這個(gè)方法的封裝,子類繼承基類時(shí)對(duì)這些接口實(shí)例進(jìn)行設(shè)置即可。
?
5.TIPs:
1)在開發(fā)中使用模式詞匯,但是不要寫一個(gè)helloworld都要扯上模式。
2)沒有所謂設(shè)計(jì)模式庫,只有設(shè)計(jì)模式條目。
3)模式并不只是利用了OO的設(shè)計(jì)原則。應(yīng)用場(chǎng)景中若是沒有合適的模式則使用最基本的OO原則。
附:鴨子的設(shè)計(jì)
建立不同的鴨子類 fly行為 // 飛行接口 public interface FlyBehavior { public void fly(); } // 飛 public class FlyWithWings implements FlyBehavior{ public void fly() { System.out.println("正在用翅膀飛行"); } } // 不飛 public class FlyNoWay implements FlyBehavior{ public void fly() { System.out.println("不會(huì)飛"); } } //坐火箭飛 public class FlyRocketPowered implements FlyBehavior{ public void fly() { System.out.println("坐火箭飛"); } } quack行為 // 叫接口 public interface QuackBehavior { public void quack(); } // 嘎嘎叫 public class Quack implements QuackBehavior. { public void quack() { System.out.println("嘎嘎叫"); } } // 吱吱叫 public class Squeak implements QuackBehavior{ public void quack() { System.out.println("吱吱叫"); } } // 不叫 public class MuteQuack implements QuackBehavior{ public void quack() { System.out.println("不會(huì)叫"); } } 實(shí)現(xiàn)Duck類 // 鴨子超類 public abstract class Duck { // 默認(rèn)的行為 FlyBehavior flyBehavior; QuackBehavior quackBehavior; public Duck() { } public void setFlyBehavior(FlyBehavior. fb) { flyBehavior = fb; } public void setQuackBehavior(QuackBehavior. qb) { quackBehavior = qb; } abstract void display(); public void performFly() { flyBehavior.fly(); } public void performQuack() { quackBehavior.quack(); } public void swim() { System.out.println("正在游泳~~"); } } // 野鴨 public class MallardDuck extends Duck { public MallardDuck() { quackBehavior = new Quack(); flyBehavior = new FlyWithWings(); //這里也可以使用setFlyBehavior方法,下同!} public void display() { System.out.println("綠頭鴨"); } } // 紅頭鴨 public class RedHeadDuck extends Duck { public RedHeadDuck() { flyBehavior = new FlyWithWings(); quackBehavior = new Quack(); } public void display() { System.out.println("紅頭鴨"); } } // 橡皮鴨 public class RubberDuck extends Duck { public RubberDuck() { flyBehavior = new FlyNoWay(); quackBehavior = new Squeak(); } public void display() { System.out.println("橡皮鴨"); } } //模型鴨 public class ModelDuck extends Duck { public ModelDuck() { flyBehavior = new FlyNoWay(); quackBehavior = new Quack(); } public void display() { System.out.println("模型鴨"); } } 測(cè)試代碼:public class MiniDuckSimulator { public static void main(String[] args) { MallardDuck mallard = new MallardDuck(); RubberDuck rubberDuckie = new RubberDuck(); RedHeadDuck redHeadDuck = new RedHeadDuck(); ModelDuck model = new ModelDuck(); mallard.performQuack(); rubberDuckie.performQuack(); redHeadDuck.performQuack(); model.performFly(); model.setFlyBehavior(new FlyRocketPowered()); model.performFly(); } }轉(zhuǎn)載于:https://www.cnblogs.com/shakin/p/4218503.html
總結(jié)
以上是生活随笔為你收集整理的【HeadFirst 设计模式总结】1.策略模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何实现CSS居中?–CSS居中常用方法
- 下一篇: 两次include一个文件的问题