设计模式入门(策略模式)
生活随笔
收集整理的這篇文章主要介紹了
设计模式入门(策略模式)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【0】README
0.1)本文部分文字描述轉(zhuǎn)自 “head first 設(shè)計(jì)模式”,旨在學(xué)習(xí)?設(shè)計(jì)模式入門(策略模式) 的基礎(chǔ)知識(shí);
0.2)本文章節(jié)4和5的source code,參見?設(shè)計(jì)模式——策略模式源代碼
【1】看個(gè)荔枝(從模擬鴨子應(yīng)用說起)
1.1)我們讓鴨子飛起來: method1)利用繼承實(shí)現(xiàn):在Duck中加入 fly() 方法,不過并不是所有的鴨子都會(huì)飛,比如橡皮鴨子;(干貨——繼承所出現(xiàn)的問題) Attention)利用繼承來提供Duck的行為,這會(huì)導(dǎo)致下列哪些缺點(diǎn)(defects): d1)代碼在多個(gè)子類中重復(fù); d2)運(yùn)行時(shí)的行為不容易改變; d3)很難知道所有鴨子的全部行為; d4)改變會(huì)牽一發(fā)而動(dòng)全身,造成其他鴨子不想要的改變; method2)利用接口實(shí)現(xiàn):這將導(dǎo)致一個(gè)問題,雖然Flyable 和 Quackable 可以解決問題,但是代碼不能復(fù)用;(干貨——接口實(shí)現(xiàn)所出現(xiàn)的問題)
【2】設(shè)計(jì)原則 2.1)原則1:找出應(yīng)用中可能需要變化之處,把它們獨(dú)立出來,不要和那些不需要變化的代碼混在一起; 2.2)原則2:針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程; 2.3)針對(duì)接口編程的真正意思是:針對(duì)超類編程,可以更明確地說成“變量的聲明類型應(yīng)該是超類型,可以是一個(gè)抽象類或一個(gè)接口,只要是具體實(shí)現(xiàn)此超類的子類,都可以指定給這個(gè)變量”;(干貨——針對(duì)接口編程)
【3】solution——如何實(shí)現(xiàn)鴨子的行為(我們應(yīng)該在鴨子類中包含設(shè)定行為的方法,這樣就可以在運(yùn)行時(shí)動(dòng)態(tài)地改變綠頭鴨的行為。) 3.1)我們有兩個(gè)接口——FlyBehavior 和 QuackBehavior;
3.2)對(duì)以上設(shè)計(jì)的分析(Analysis): A1)這樣一來,可以讓飛行和呱呱叫(quack)的動(dòng)作被其他對(duì)象復(fù)用,因?yàn)檫@些行為與鴨子類無關(guān)了; A2)而我們新增一些行為,不會(huì)影響到既有的行為類,也不會(huì)影響 使用這些行為的 具體類,如鴨子類;
【4】整合鴨子的行為 4.1)關(guān)鍵在于: 鴨子現(xiàn)在會(huì)將飛行和呱呱叫的動(dòng)作委托別人進(jìn)行處理,而不是使用定義在Duck類內(nèi)的 呱呱叫和飛行方法; 4.2)整合后的代碼如下:
【5】動(dòng)態(tài)設(shè)定行為 5.1)我們想通過在鴨子子類中通過“設(shè)定方法”來設(shè)定鴨子的行為,而不是在鴨子的構(gòu)造器內(nèi)實(shí)例化; step1)在Duck類中,加入兩個(gè)新方法: 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)制造一個(gè)新的鴨子類型:模型鴨(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)建立一個(gè)新的 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)改變測(cè)試類,加入模型鴨,并使模型鴨具有火箭動(dòng)力; 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)組合定義:將兩個(gè)類結(jié)合起來使用,這就是組合。這種做法和繼承不同的地方在于,鴨子的行為不是繼承來的,而是和適當(dāng)?shù)男袨閷?duì)象組合來的; 5.3)設(shè)計(jì)原則:?多用組合,少用繼承;
【6】封裝行為的大局觀 6.1)下面是整個(gè)重新設(shè)計(jì)后的類結(jié)構(gòu),你所期望的一切都有: 鴨子繼承Duck,飛行行為實(shí)現(xiàn) FlyBehavior接口,呱呱叫行為實(shí)現(xiàn) QuackBehavior接口;
6.2)我們不再把鴨子的行為說成是 一組行為,而是將其想象成“一族算法”;
6.3)策略模式定義:?策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨(dú)立于使用算法的客戶;(干貨——策略模式定義)
【7】策略模式總結(jié): 7.1)OO原則(rules): r1)封裝變化; r2)多用組合,少用繼承; r3)針對(duì)接口編程,不針對(duì)實(shí)現(xiàn)編程;
7.2)OO模式(pattern): 策略模式——策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨(dú)立于使用算法的客戶;
【1】看個(gè)荔枝(從模擬鴨子應(yīng)用說起)
1.1)我們讓鴨子飛起來: method1)利用繼承實(shí)現(xiàn):在Duck中加入 fly() 方法,不過并不是所有的鴨子都會(huì)飛,比如橡皮鴨子;(干貨——繼承所出現(xiàn)的問題) Attention)利用繼承來提供Duck的行為,這會(huì)導(dǎo)致下列哪些缺點(diǎn)(defects): d1)代碼在多個(gè)子類中重復(fù); d2)運(yùn)行時(shí)的行為不容易改變; d3)很難知道所有鴨子的全部行為; d4)改變會(huì)牽一發(fā)而動(dòng)全身,造成其他鴨子不想要的改變; method2)利用接口實(shí)現(xiàn):這將導(dǎo)致一個(gè)問題,雖然Flyable 和 Quackable 可以解決問題,但是代碼不能復(fù)用;(干貨——接口實(shí)現(xiàn)所出現(xiàn)的問題)
【2】設(shè)計(jì)原則 2.1)原則1:找出應(yīng)用中可能需要變化之處,把它們獨(dú)立出來,不要和那些不需要變化的代碼混在一起; 2.2)原則2:針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)編程; 2.3)針對(duì)接口編程的真正意思是:針對(duì)超類編程,可以更明確地說成“變量的聲明類型應(yīng)該是超類型,可以是一個(gè)抽象類或一個(gè)接口,只要是具體實(shí)現(xiàn)此超類的子類,都可以指定給這個(gè)變量”;(干貨——針對(duì)接口編程)
【3】solution——如何實(shí)現(xiàn)鴨子的行為(我們應(yīng)該在鴨子類中包含設(shè)定行為的方法,這樣就可以在運(yùn)行時(shí)動(dòng)態(tài)地改變綠頭鴨的行為。) 3.1)我們有兩個(gè)接口——FlyBehavior 和 QuackBehavior;
3.2)對(duì)以上設(shè)計(jì)的分析(Analysis): A1)這樣一來,可以讓飛行和呱呱叫(quack)的動(dòng)作被其他對(duì)象復(fù)用,因?yàn)檫@些行為與鴨子類無關(guān)了; A2)而我們新增一些行為,不會(huì)影響到既有的行為類,也不會(huì)影響 使用這些行為的 具體類,如鴨子類;
【4】整合鴨子的行為 4.1)關(guān)鍵在于: 鴨子現(xiàn)在會(huì)將飛行和呱呱叫的動(dòng)作委托別人進(jìn)行處理,而不是使用定義在Duck類內(nèi)的 呱呱叫和飛行方法; 4.2)整合后的代碼如下:
【5】動(dòng)態(tài)設(shè)定行為 5.1)我們想通過在鴨子子類中通過“設(shè)定方法”來設(shè)定鴨子的行為,而不是在鴨子的構(gòu)造器內(nèi)實(shí)例化; step1)在Duck類中,加入兩個(gè)新方法: 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)制造一個(gè)新的鴨子類型:模型鴨(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)建立一個(gè)新的 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)改變測(cè)試類,加入模型鴨,并使模型鴨具有火箭動(dòng)力; 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)組合定義:將兩個(gè)類結(jié)合起來使用,這就是組合。這種做法和繼承不同的地方在于,鴨子的行為不是繼承來的,而是和適當(dāng)?shù)男袨閷?duì)象組合來的; 5.3)設(shè)計(jì)原則:?多用組合,少用繼承;
【6】封裝行為的大局觀 6.1)下面是整個(gè)重新設(shè)計(jì)后的類結(jié)構(gòu),你所期望的一切都有: 鴨子繼承Duck,飛行行為實(shí)現(xiàn) FlyBehavior接口,呱呱叫行為實(shí)現(xiàn) QuackBehavior接口;
6.2)我們不再把鴨子的行為說成是 一組行為,而是將其想象成“一族算法”;
6.3)策略模式定義:?策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨(dú)立于使用算法的客戶;(干貨——策略模式定義)
【7】策略模式總結(jié): 7.1)OO原則(rules): r1)封裝變化; r2)多用組合,少用繼承; r3)針對(duì)接口編程,不針對(duì)實(shí)現(xiàn)編程;
7.2)OO模式(pattern): 策略模式——策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨(dú)立于使用算法的客戶;
總結(jié)
以上是生活随笔為你收集整理的设计模式入门(策略模式)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么把www域名转到m域名()
- 下一篇: asp.net ajax控件工具集 Au