時間:2017年08月31日星期四
說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com
教學源碼:https://github.com/zccodere/s...
學習源碼:https://github.com/zccodere/s...
課程大綱
什么是策略模式 策略模式如何實現 策略模式總結篇 實例案例分享
日常生活中的策略
World文檔中的排版布局 購物支付過程中選擇支付渠道
案例示意圖
策略模式定義
策略模式將可變的部分從程序中抽象分離成算法接口, 在該接口下分別封裝一系列算法實現并使他們可以相互替換, 從而導致客戶端程序獨立于算法的改變。第二章:策略模式應用 2-1 虛擬應用
模擬應用背景
通過代碼來實現策略模式,通過開發與重構虛擬應用 使用策略模式實現,在不變更代碼框架的前提下 不斷的擁抱需求的變化,從而滿足客戶需求
項目背景:鴨子應用
2-2 原有功能代碼編寫
1.編寫Duck類
package com.myimooc.designpattern.c7strategy; /** * @title 策略模式 * @describe 超類,所有的鴨子都要繼承此類,抽象了鴨子的行為:顯示和鳴叫 * @author zc * @version 1.0 2017-08-31 */ public abstract class Duck { /** * 鴨子發出叫聲,通用行為,由超類實現 */ public void quack(){ System.out.println("嘎嘎嘎"); } /** * 顯示鴨子的外觀,鴨子的外觀各不相同,聲明為abstract,由子類實現 */ public abstract void display(); }
2.編寫MallardDuck類
package com.myimooc.designpattern.c7strategy; /** * @title 策略模式 * @describe 綠脖子的鴨子 * @author zc * @version 1.0 2017-08-31 */ public class MallardDuck extends Duck { @Override public void display() { System.out.println("我的脖子是綠色的"); } }
3.編寫RedheadDuck類
package com.myimooc.designpattern.c7strategy; /** * @title 策略模式 * @describe 紅色頭的鴨子 * @author zc * @version 1.0 2017-08-31 */ public class RedheadDuck extends Duck { @Override public void display() { System.out.println("我的頭是紅色的"); } }2-3 增加功能
在原有功能的基礎上新增飛行的功能
使用繼承:父類統一實現 定義抽象方法:由子類自己實現 使用組合:復合優先于繼承:多用組合,少用繼承
繼承優缺點
繼承是重用代碼的利器 但繼承并不總是最好的工具
什么是組合
在類中增加一個私有域,引用另一個已有的類的實例,通過調用引用實例的方法從而獲得新的功能,這種設計被稱作組合(或復合)。
使用組合增加飛行功能
實現:將飛行行為抽象為接口,在父類中持有該接口,并由該接口代理飛行行為 優點:足夠靈活;復用代碼,更易于維護 缺點:策略類會增多;所有策略類都需要對外暴露2-4 實現功能
代碼編寫
1.編寫FlyingStrategy類
package com.myimooc.designpattern.c7strategy; /** * @title 策略模式 * @describe 策略接口,實現鴨子的飛行行為 * @author zc * @version 1.0 2017-08-31 */ public interface FlyingStrategy { /** * 飛行行為的方法 */ void performFly(); }
2.編寫FlyWithWin類
package com.myimooc.designpattern.c7strategy.impl; import com.myimooc.designpattern.c7strategy.FlyingStrategy; /** * @title 策略模式 * @describe 實現鴨子的飛行行為,用翅膀飛行的類 * @author zc * @version 1.0 2017-08-31 */ public class FlyWithWin implements FlyingStrategy{ @Override public void performFly() { System.out.println("振翅高飛"); } }
3.修改Duck類
package com.myimooc.designpattern.c7strategy; /** * @title 策略模式 * @describe 超類,所有的鴨子都要繼承此類,抽象了鴨子的行為:顯示和鳴叫 * @author zc * @version 1.0 2017-08-31 */ public abstract class Duck { /** * 鴨子發出叫聲,通用行為,由超類實現 */ public void quack(){ System.out.println("嘎嘎嘎"); } /** * 顯示鴨子的外觀,鴨子的外觀各不相同,聲明為abstract,由子類實現 */ public abstract void display(); // 組合進飛行的策略接口 private FlyingStrategy flyingStrategy; public void setFlyingStrategy(FlyingStrategy flyingStrategy) { this.flyingStrategy = flyingStrategy; } /** * 鴨子的飛行功能 */ public void fly(){ // 由飛行策略接口執行飛行的動作 flyingStrategy.performFly(); } }
4.修改MallardDuck類
package com.myimooc.designpattern.c7strategy; import com.myimooc.designpattern.c7strategy.impl.FlyWithWin; /** * @title 策略模式 * @describe 綠脖子的鴨子 * @author zc * @version 1.0 2017-08-31 */ public class MallardDuck extends Duck { public MallardDuck() { super(); super.setFlyingStrategy(new FlyWithWin()); } @Override public void display() { System.out.println("我的脖子是綠色的"); } }
5.修改RedheadDuck類
package com.myimooc.designpattern.c7strategy; import com.myimooc.designpattern.c7strategy.impl.FlyWithWin; /** * @title 策略模式 * @describe 紅色頭的鴨子 * @author zc * @version 1.0 2017-08-31 */ public class RedheadDuck extends Duck { public RedheadDuck() { super(); super.setFlyingStrategy(new FlyWithWin()); } @Override public void display() { System.out.println("我的頭是紅色的"); } }
6.編寫DuckTest類
package com.myimooc.designpattern.c7strategy; /** * @title 策略模式 * @describe 測試類 * @author zc * @version 1.0 2017-08-31 */ public class DuckTest { public static void main(String[] args) { System.out.println("測試鴨子程序"); System.out.println("*************************"); Duck duck = null; // duck = new MallardDuck(); // duck = new RedheadDuck(); // duck = new RubberDuck(); // duck = new BigYellowDuck(); duck = new SpaceDuck(); duck.display(); duck.quack(); duck.fly(); System.out.println("*************************"); System.out.println("測試程序完畢"); } }2-5 復用代碼
業務場景
需要增加橡膠鴨、大黃鴨,它們都有一個共同的特點,不會飛行。 不會飛行也是一種飛行行為,所以可以通過良好的抽象復用代碼。
代碼編寫
1.編寫FlyNoWay類
package com.myimooc.designpattern.c7strategy.impl; import com.myimooc.designpattern.c7strategy.FlyingStrategy; /** * @title 策略模式 * @describe 實現鴨子的飛行行為,不會飛行的策略類 * @author zc * @version 1.0 2017-08-31 */ public class FlyNoWay implements FlyingStrategy { @Override public void performFly() { System.out.println("我不會飛行!"); } }
2.編寫RubberDuck類
package com.myimooc.designpattern.c7strategy; import com.myimooc.designpattern.c7strategy.impl.FlyNoWay; /** * @title 策略模式 * @describe 橡膠鴨 * @author zc * @version 1.0 2017-08-31 */ public class RubberDuck extends Duck{ public RubberDuck() { super(); super.setFlyingStrategy(new FlyNoWay()); } @Override public void display() { System.out.println("我全身發黃,嘴巴很紅"); } @Override public void quack() { System.out.println("嘎~嘎~嘎~"); } }
3.編寫BigYellowDuck類
package com.myimooc.designpattern.c7strategy; import com.myimooc.designpattern.c7strategy.impl.FlyNoWay; /** * @title 策略模式 * @describe 大黃鴨 * @author zc * @version 1.0 2017-08-31 */ public class BigYellowDuck extends Duck{ public BigYellowDuck() { super(); super.setFlyingStrategy(new FlyNoWay()); } @Override public void display() { System.out.println("我身體很大,全身黃黃"); } }
4.修改DuckTest類
package com.myimooc.designpattern.c7strategy; /** * @title 策略模式 * @describe 測試類 * @author zc * @version 1.0 2017-08-31 */ public class DuckTest { public static void main(String[] args) { System.out.println("測試鴨子程序"); System.out.println("*************************"); Duck duck = null; // duck = new MallardDuck(); // duck = new RedheadDuck(); // duck = new RubberDuck(); // duck = new BigYellowDuck(); duck = new SpaceDuck(); duck.display(); duck.quack(); duck.fly(); System.out.println("*************************"); System.out.println("測試程序完畢"); } }2-6 新增種類
業務場景
現在又需增加太空鴨,太空鴨不能自己飛行,需要借助先進的科學技術。
1編寫FlyWithRocket類
package com.myimooc.designpattern.c7strategy.impl; import com.myimooc.designpattern.c7strategy.FlyingStrategy; /** * @title 策略模式 * @describe 實現鴨子的飛行行為,使用火箭飛行策略類 * @author zc * @version 1.0 2017-08-31 */ public class FlyWithRocket implements FlyingStrategy { @Override public void performFly() { System.out.println("用火箭在太空遨游"); } }
2.編寫SpaceDuck類
package com.myimooc.designpattern.c7strategy; import com.myimooc.designpattern.c7strategy.impl.FlyWithRocket; /** * @title 策略模式 * @describe 太空鴨 * @author zc * @version 1.0 2017-08-31 */ public class SpaceDuck extends Duck { public SpaceDuck() { super(); super.setFlyingStrategy(new FlyWithRocket()); } @Override public void display() { System.out.println("我頭戴宇航盔"); } @Override public void quack() { System.out.println("我通過無線電與你通信"); } }
3.修改DuckTest類
package com.myimooc.designpattern.c7strategy; /** * @title 策略模式 * @describe 測試類 * @author zc * @version 1.0 2017-08-31 */ public class DuckTest { public static void main(String[] args) { System.out.println("測試鴨子程序"); System.out.println("*************************"); Duck duck = null; // duck = new MallardDuck(); // duck = new RedheadDuck(); // duck = new RubberDuck(); // duck = new BigYellowDuck(); duck = new SpaceDuck(); duck.display(); duck.quack(); duck.fly(); System.out.println("*************************"); System.out.println("測試程序完畢"); } }第三章:策略模式總結 3-1 總結
策略模式中的設計原則
找出應用中需要變化的部分,把他們獨立出來,不要和那些不需要變化的代碼混在一起 面向接口編程,而不是面向實現編程 多用組合,少用繼承
策略模式的實現
通過分離變化得出的策略接口Strategy Strategy接口的實現類 客戶程序中有一個Strategy 在客戶程序中選擇和組裝正確的Strategy實現類
策略模式的優點
使用了組合,使架構更加靈活 富有彈性,可以較好的應對變化(開閉原則) 更好的代碼復用性(相對于繼承) 消除大量的條件語句
策略模式的缺點
客戶代碼需要了解每個策略實現的細節 增加了對象的數目 所有策略類都需要對外暴露
策略模式的適用場景
許多相關的類僅僅是行為差異 運行時選取不同的算法變體 通過條件語句在多個分支中選取其中一個
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70321.html
時間:2017年08月30日星期三說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源碼:https://github.com/zccodere/s... 第一章:責任鏈模式簡介 1-1 課程簡介 課程大綱 什么是責任鏈模式 如何實現責任鏈模式 責任鏈模式如何解耦 責任鏈模式的應用 案例:...
時間:2017年08月27日星期日說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源碼:https://github.com/zccodere/s... 第一章:單例模式簡介 1-1 簡介 單例模式 概念及應用場合 餓漢模式 懶漢模式 餓漢模式與懶漢模式的區別 什么是設計模式 是一套被反...
摘要:時間年月日星期二說明本文部分內容均來自慕課網。慕課網教學源碼學習源碼第一章適配器模式的簡介簡介生活中的適配器翻譯軟件插座適配器適配器模式定義適配器模式講將一個類的接口,轉換成客戶期望的另外一個接口。 時間:2017年08月29日星期二說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s.....
摘要:時間年月日星期六說明本文部分內容均來自慕課網。案例介紹飲料機配置模版把水煮沸泡飲料把飲料倒進杯子加調味料第二章模版模式實現基本框架代碼編寫編寫類模版模式抽象基類,為所有子類提供一個算法框架。 時間:2017年09月02日星期六說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源...
摘要:時間年月日星期日說明本文部分內容均來自慕課網。這對所有形態的工廠模式都是重要的這個系統的產品有至少一個的產品族同屬于一個產品族的產品是設計成在一起使用的。 時間:2017年08月27日星期日說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源碼:https://github.c...
閱讀 3398·2023-04-25 22:04
閱讀 2197·2021-11-22 15:29
閱讀 2161·2021-10-11 10:57
閱讀 1402·2021-09-24 09:48
閱讀 3147·2021-09-09 09:34
閱讀 2543·2021-09-02 15:21
閱讀 2393·2019-08-30 15:53
閱讀 1120·2019-08-30 14:07