设计模式入门(策略模式)
生活随笔
收集整理的這篇文章主要介紹了
设计模式入门(策略模式)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【0】README
0.1)本文部分文字描述轉自 “head first 設計模式”,旨在學習?設計模式入門(策略模式) 的基礎知識;
0.2)本文章節4和5的source code,參見?設計模式——策略模式源代碼
【1】看個荔枝(從模擬鴨子應用說起)
1.1)我們讓鴨子飛起來: method1)利用繼承實現:在Duck中加入 fly() 方法,不過并不是所有的鴨子都會飛,比如橡皮鴨子;(干貨——繼承所出現的問題) Attention)利用繼承來提供Duck的行為,這會導致下列哪些缺點(defects): d1)代碼在多個子類中重復; d2)運行時的行為不容易改變; d3)很難知道所有鴨子的全部行為; d4)改變會牽一發而動全身,造成其他鴨子不想要的改變; method2)利用接口實現:這將導致一個問題,雖然Flyable 和 Quackable 可以解決問題,但是代碼不能復用;(干貨——接口實現所出現的問題)
【2】設計原則 2.1)原則1:找出應用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的代碼混在一起; 2.2)原則2:針對接口編程,而不是針對實現編程; 2.3)針對接口編程的真正意思是:針對超類編程,可以更明確地說成“變量的聲明類型應該是超類型,可以是一個抽象類或一個接口,只要是具體實現此超類的子類,都可以指定給這個變量”;(干貨——針對接口編程)
【3】solution——如何實現鴨子的行為(我們應該在鴨子類中包含設定行為的方法,這樣就可以在運行時動態地改變綠頭鴨的行為。) 3.1)我們有兩個接口——FlyBehavior 和 QuackBehavior;
3.2)對以上設計的分析(Analysis): A1)這樣一來,可以讓飛行和呱呱叫(quack)的動作被其他對象復用,因為這些行為與鴨子類無關了; A2)而我們新增一些行為,不會影響到既有的行為類,也不會影響 使用這些行為的 具體類,如鴨子類;
【4】整合鴨子的行為 4.1)關鍵在于: 鴨子現在會將飛行和呱呱叫的動作委托別人進行處理,而不是使用定義在Duck類內的 呱呱叫和飛行方法; 4.2)整合后的代碼如下:
【5】動態設定行為 5.1)我們想通過在鴨子子類中通過“設定方法”來設定鴨子的行為,而不是在鴨子的構造器內實例化; step1)在Duck類中,加入兩個新方法: setFlyBehavior 和?setQuackBehavior; package com.designpattern.chapter0;public abstract class Duck {FlyBehavior flyBehavior;QuackBehavior quackBehavior;public Duck(){}public void setFlyBehavior(FlyBehavior fb){flyBehavior = fb;}public void setQuackBehavior(QuackBehavior qb){quackBehavior = qb;}public abstract void display();public void performFly(){flyBehavior.fly();}public void performQuack(){quackBehavior.quack();}public void swim(){System.out.println("i am swiming!");}} step2)制造一個新的鴨子類型:模型鴨(ModelDuck.java) package com.designpattern.chapter0;public class ModelDuck extends Duck{public ModelDuck(){quackBehavior = new Quack();flyBehavior = new FlyWithWings();}@Overridepublic void display() {System.out.println("i am a model duck!");} } step3)建立一個新的 FlyBehavior 類型(FlyRocketPowered.java) package com.designpattern.chapter0;public class FlyRocketPowered implements FlyBehavior{@Overridepublic void fly() {System.out.println("i am flying with rocket power!");} } step4)改變測試類,加入模型鴨,并使模型鴨具有火箭動力; package com.designpattern.chapter0;public class ModelDuckSimulator {public static void main(String[] args) {Duck mallard = new MallardDuck();mallard.performQuack();mallard.performFly();Duck modelDuck = new ModelDuck();modelDuck.performFly();modelDuck.setFlyBehavior(new FlyRocketPowered());modelDuck.performFly();} } 5.2)組合定義:將兩個類結合起來使用,這就是組合。這種做法和繼承不同的地方在于,鴨子的行為不是繼承來的,而是和適當的行為對象組合來的; 5.3)設計原則:?多用組合,少用繼承;
【6】封裝行為的大局觀 6.1)下面是整個重新設計后的類結構,你所期望的一切都有: 鴨子繼承Duck,飛行行為實現 FlyBehavior接口,呱呱叫行為實現 QuackBehavior接口;
6.2)我們不再把鴨子的行為說成是 一組行為,而是將其想象成“一族算法”;
6.3)策略模式定義:?策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶;(干貨——策略模式定義)
【7】策略模式總結: 7.1)OO原則(rules): r1)封裝變化; r2)多用組合,少用繼承; r3)針對接口編程,不針對實現編程;
7.2)OO模式(pattern): 策略模式——策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶;
【1】看個荔枝(從模擬鴨子應用說起)
1.1)我們讓鴨子飛起來: method1)利用繼承實現:在Duck中加入 fly() 方法,不過并不是所有的鴨子都會飛,比如橡皮鴨子;(干貨——繼承所出現的問題) Attention)利用繼承來提供Duck的行為,這會導致下列哪些缺點(defects): d1)代碼在多個子類中重復; d2)運行時的行為不容易改變; d3)很難知道所有鴨子的全部行為; d4)改變會牽一發而動全身,造成其他鴨子不想要的改變; method2)利用接口實現:這將導致一個問題,雖然Flyable 和 Quackable 可以解決問題,但是代碼不能復用;(干貨——接口實現所出現的問題)
【2】設計原則 2.1)原則1:找出應用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的代碼混在一起; 2.2)原則2:針對接口編程,而不是針對實現編程; 2.3)針對接口編程的真正意思是:針對超類編程,可以更明確地說成“變量的聲明類型應該是超類型,可以是一個抽象類或一個接口,只要是具體實現此超類的子類,都可以指定給這個變量”;(干貨——針對接口編程)
【3】solution——如何實現鴨子的行為(我們應該在鴨子類中包含設定行為的方法,這樣就可以在運行時動態地改變綠頭鴨的行為。) 3.1)我們有兩個接口——FlyBehavior 和 QuackBehavior;
3.2)對以上設計的分析(Analysis): A1)這樣一來,可以讓飛行和呱呱叫(quack)的動作被其他對象復用,因為這些行為與鴨子類無關了; A2)而我們新增一些行為,不會影響到既有的行為類,也不會影響 使用這些行為的 具體類,如鴨子類;
【4】整合鴨子的行為 4.1)關鍵在于: 鴨子現在會將飛行和呱呱叫的動作委托別人進行處理,而不是使用定義在Duck類內的 呱呱叫和飛行方法; 4.2)整合后的代碼如下:
【5】動態設定行為 5.1)我們想通過在鴨子子類中通過“設定方法”來設定鴨子的行為,而不是在鴨子的構造器內實例化; step1)在Duck類中,加入兩個新方法: setFlyBehavior 和?setQuackBehavior; package com.designpattern.chapter0;public abstract class Duck {FlyBehavior flyBehavior;QuackBehavior quackBehavior;public Duck(){}public void setFlyBehavior(FlyBehavior fb){flyBehavior = fb;}public void setQuackBehavior(QuackBehavior qb){quackBehavior = qb;}public abstract void display();public void performFly(){flyBehavior.fly();}public void performQuack(){quackBehavior.quack();}public void swim(){System.out.println("i am swiming!");}} step2)制造一個新的鴨子類型:模型鴨(ModelDuck.java) package com.designpattern.chapter0;public class ModelDuck extends Duck{public ModelDuck(){quackBehavior = new Quack();flyBehavior = new FlyWithWings();}@Overridepublic void display() {System.out.println("i am a model duck!");} } step3)建立一個新的 FlyBehavior 類型(FlyRocketPowered.java) package com.designpattern.chapter0;public class FlyRocketPowered implements FlyBehavior{@Overridepublic void fly() {System.out.println("i am flying with rocket power!");} } step4)改變測試類,加入模型鴨,并使模型鴨具有火箭動力; package com.designpattern.chapter0;public class ModelDuckSimulator {public static void main(String[] args) {Duck mallard = new MallardDuck();mallard.performQuack();mallard.performFly();Duck modelDuck = new ModelDuck();modelDuck.performFly();modelDuck.setFlyBehavior(new FlyRocketPowered());modelDuck.performFly();} } 5.2)組合定義:將兩個類結合起來使用,這就是組合。這種做法和繼承不同的地方在于,鴨子的行為不是繼承來的,而是和適當的行為對象組合來的; 5.3)設計原則:?多用組合,少用繼承;
【6】封裝行為的大局觀 6.1)下面是整個重新設計后的類結構,你所期望的一切都有: 鴨子繼承Duck,飛行行為實現 FlyBehavior接口,呱呱叫行為實現 QuackBehavior接口;
6.2)我們不再把鴨子的行為說成是 一組行為,而是將其想象成“一族算法”;
6.3)策略模式定義:?策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶;(干貨——策略模式定義)
【7】策略模式總結: 7.1)OO原則(rules): r1)封裝變化; r2)多用組合,少用繼承; r3)針對接口編程,不針對實現編程;
7.2)OO模式(pattern): 策略模式——策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶;
總結
以上是生活随笔為你收集整理的设计模式入门(策略模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么把www域名转到m域名()
- 下一篇: mybatis_user_guide(3