Pattern-No.03 设计模式之策略模式
2019獨角獸企業重金招聘Python工程師標準>>>
1、策略模式定義:定義了算法族,分別封裝起來,讓它們之間可以相互替換,此模式讓算法的變化獨立于使用算法的客戶之外
2、策略模式的好處:可以動態的改變對象的行為
3、策略模式的實現方式:把一個類中經常改變或者將來可能改變的部分提取出來,作為一個接口,然后在類中包含這個對象的實例,這樣類的實例在運行時就可以隨意調用實現了這個接口的類的行為。策略模式屬于對象行為型模式,主要針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響 到客戶端的情況下發生變化。通常,策略模式適用于當一個應用程序需要實現一種特定的服務或者功能,而且該程序有多種實現方式時使用
4、策略模式中有三個對象
環境對象:該類中實現了對抽象策略中定義的接口或者抽象類的引用。
抽象策略對象:它可由接口或抽象類來實現。
具體策略對象:它封裝了實現同不功能的不同算法。
????利用策略模式構建應用程序,可以根據用戶配置等內容,選擇不同有算法來實現應用程序的功能。具體的選擇有環境對象來完成。采用這種方式可以避免由于使用條件語句而帶來的代碼混亂,提高應用程序的靈活性與條理性。
5、案例分析
package?com.shma.strategy.duck.fly;/***?定義鴨子飛行的行為算法族類,屬于抽象策略對象*?@author?admin**/ public?interface?FlyBehavior?{public?void?fly(String?name); }package?com.shma.strategy.duck.fly;/***?飛行行為具體的實現類:沒有飛行的能力*?@author?admin**/ public?class?FlyNoWay?implements?FlyBehavior?{@Overridepublic?void?fly(String?name)?{System.out.println(name?+?"?:?無法飛行!");}}package?com.shma.strategy.duck.fly;/***?飛行行為具體的實現類:通過火箭動力飛行*?@author?admin**/ public?class?FlyRocketPowered?implements?FlyBehavior?{@Overridepublic?void?fly(String?name)?{System.out.println(name?+?"?:?通過火箭動力飛行!");}}package?com.shma.strategy.duck.fly;/***?飛行行為具體的實現類:通過翅膀飛行*?@author?admin**/ public?class?FlyWithWings?implements?FlyBehavior?{@Overridepublic?void?fly(String?name)?{System.out.println(name?+?"?:?通過翅膀飛行!");}} package?com.shma.strategy.duck.sing;/***?定義鴨子鳴叫的行為算法族類,屬于抽象策略對象*?@author?admin**/ public?interface?SingBehavior?{public?void?sing(String?name); }package?com.shma.strategy.duck.sing;/***?鳴叫行為具體的實現類:不能發出聲音*?@author?admin**/ public?class?SingNoWay?implements?SingBehavior?{@Overridepublic?void?sing(String?name)?{System.out.println(name?+?"?:?不能發出聲音...");}}package?com.shma.strategy.duck.sing;/***?鳴叫行為具體的實現類:呱呱叫*?@author?admin**/ public?class?SingWithQuack?implements?SingBehavior?{@Overridepublic?void?sing(String?name)?{System.out.println(name?+?"?:?呱呱叫...");}}package?com.shma.strategy.duck.sing;/***?鳴叫行為具體的實現類:吱吱叫*?@author?admin**/ public?class?SingWithSqueak?implements?SingBehavior?{@Overridepublic?void?sing(String?name)?{System.out.println(name?+?"?:?吱吱叫...");}} package?com.shma.strategy.duck;import?com.shma.strategy.duck.fly.FlyBehavior; import?com.shma.strategy.duck.sing.SingBehavior;/***?鴨子超類?策略*?@author?admin**/ public?abstract?class?Duck?{private?FlyBehavior?flyBehavior;private?SingBehavior?singBehavior;protected?String?name;public?Duck(String?name)?{this.name?=?name;}public?void?fly()?{flyBehavior.fly(name);}public?void?sing()?{singBehavior.sing(name);}/***?動態修改鴨子的飛行方式*?@param?flyBehavior*/public?void?setFlyBehavior(FlyBehavior?flyBehavior)?{this.flyBehavior?=?flyBehavior;}/***?動態修改鴨子的鳴叫方式*?@param?singBehavior*/public?void?setSingBehavior(SingBehavior?singBehavior)?{this.singBehavior?=?singBehavior;}public?abstract?void?display();public?void?swim()?{System.out.println("所有的鴨子都會游泳!");} }package?com.shma.strategy.duck;import?com.shma.strategy.duck.fly.FlyNoWay; import?com.shma.strategy.duck.sing.SingNoWay;public?class?DecoyDuck?extends?Duck?{public?DecoyDuck(String?name)?{super(name);this.setFlyBehavior(new?FlyNoWay());this.setSingBehavior(new?SingNoWay());}@Overridepublic?void?display()?{System.out.println("我是一只誘餌鴨");}}package?com.shma.strategy.duck;import?com.shma.strategy.duck.fly.FlyWithWings; import?com.shma.strategy.duck.sing.SingWithQuack;public?class?MallardDuck?extends?Duck?{public?MallardDuck(String?name)?{super(name);this.setFlyBehavior(new?FlyWithWings());this.setSingBehavior(new?SingWithQuack());}@Overridepublic?void?display()?{System.out.println("我是一只綠頭鴨");}}package?com.shma.strategy.duck;import?com.shma.strategy.duck.fly.FlyNoWay; import?com.shma.strategy.duck.sing.SingWithSqueak;public?class?ModelDuck?extends?Duck?{public?ModelDuck(String?name)?{super(name);this.setFlyBehavior(new?FlyNoWay());this.setSingBehavior(new?SingWithSqueak());}@Overridepublic?void?display()?{System.out.println("我是一只模型鴨");}} package?com.shma.strategy.duck;import?com.shma.strategy.duck.fly.FlyRocketPowered;public?class?TestMainApp?{public?static?void?main(String[]?args)?{Duck?duck?=?new?DecoyDuck("誘餌鴨");duck.display();duck.swim();duck.fly();duck.sing();duck?=?new?MallardDuck("綠頭鴨");duck.display();duck.swim();duck.fly();duck.sing();duck?=?new?ModelDuck("綠頭鴨");duck.display();duck.swim();duck.fly();duck.sing();duck.setFlyBehavior(new?FlyRocketPowered());duck.fly();} }案列分析2:http://yangguangfu.iteye.com/blog/815107
轉載于:https://my.oschina.net/shma1664/blog/394594
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Pattern-No.03 设计模式之策略模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html 访问 php 变量
- 下一篇: 数据保护知多少