策略模式设计
背景介紹:
當前有一個鴨子類(duck)它有紅、綠頭鴨(實現(xiàn)類),有可以飛(fly)、叫(quack)以及樣子(display)的方法
需求:增加并設計一個不會飛的塑料鴨以及使用火箭飛行的太空鴨。
最初兩種思路:
1、繼承設計思維:在duck中增加fly 方法,會導致不需要飛行的鴨子也會飛行而產生問題。缺點:沒有擴展性,不靈活
2、接口或者抽象方法實現(xiàn)設計思維:將fly設計成接口或者抽象方法。其他鴨子實現(xiàn)類實現(xiàn)就好 缺點:如果你寫了10種鴨子后,
fly 在復寫過程的有的會重復(比如塑料鴨,玩具鴨就會寫重復的不會飛邏輯)。會累死。
下面推出策略模式:
/**策略設計模式的原理解釋:
duck 類(固定不變有叫與顯示的方法)作為基類是變化很少的封裝出來
而可變的就以組合的方式(注入接口) 然后通過多態(tài)的實現(xiàn)來完成。
這樣以后還需要增加不同類型的鴨子以及不同的飛行就不需要改變原有duck的代碼以及之前寫好的代碼
*/
public abstract class Duck { // 鴨子類//因為每個鴨子的模樣是不一樣的。如:塑料鴨,灰鴨public abstract void display();//面向接口編程,使用組合的方式注入fly 采用開閉原則(原有的系統(tǒng)只做新增不做修改)private Fly fly;public Fly getFly() {return fly;}public void setFly(Fly fly) {this.fly = fly;}public void quack() {System.out.println("呱");} }
public class MallardDuck extends Duck { //綠頭鴨public MallardDuck() {super();super.setFly(new FlyNoWay());//傳入對應對應的飛行實現(xiàn)類 ???直接set 一個實現(xiàn)類?沒看懂這寫法 } public void display() {System.out.println("綠頭鴨");} }public class RedHeadDuck extends Duck { //紅頭鴨public RedHeadDuck() {super();super.setFly(new RocketFly());//注入不同的接口實現(xiàn)類 } public void display() {System.out.println("紅頭鴨");} } public interface Fly { //fly 接口void fly(); } /*** 具體的策略算法實現(xiàn)類* 具體的飛行實現(xiàn)類*/ public class FlyNoWay implements Fly {public void fly() {System.out.println("不會飛");} } /*** 具體的策略算法實現(xiàn)類* 具體的飛行實現(xiàn)類*/ public class RocketFly implements Fly {public void fly() {System.out.println("坐火箭");} } //測試public static void main(String[] args) {/**** 策略模式的理解 根據不同的方式*/Duck duck = new MallardDuck();duck.display();duck.quack();duck.getFly();}
當前有一個鴨子類(duck)它有紅、綠頭鴨(實現(xiàn)類),有可以飛(fly)、叫(quack)以及樣子(display)的方法
需求:增加并設計一個不會飛的塑料鴨以及使用火箭飛行的太空鴨。
最初兩種思路:
1、繼承設計思維:在duck中增加fly 方法,會導致不需要飛行的鴨子也會飛行而產生問題。缺點:沒有擴展性,不靈活
2、接口或者抽象方法實現(xiàn)設計思維:將fly設計成接口或者抽象方法。其他鴨子實現(xiàn)類實現(xiàn)就好 缺點:如果你寫了10種鴨子后,
fly 在復寫過程的有的會重復(比如塑料鴨,玩具鴨就會寫重復的不會飛邏輯)。會累死。
下面推出策略模式:
/**策略設計模式的原理解釋:
duck 類(固定不變有叫與顯示的方法)作為基類是變化很少的封裝出來
而可變的就以組合的方式(注入接口) 然后通過多態(tài)的實現(xiàn)來完成。
這樣以后還需要增加不同類型的鴨子以及不同的飛行就不需要改變原有duck的代碼以及之前寫好的代碼
*/
public abstract class Duck { // 鴨子類//因為每個鴨子的模樣是不一樣的。如:塑料鴨,灰鴨public abstract void display();//面向接口編程,使用組合的方式注入fly 采用開閉原則(原有的系統(tǒng)只做新增不做修改)private Fly fly;public Fly getFly() {return fly;}public void setFly(Fly fly) {this.fly = fly;}public void quack() {System.out.println("呱");} }
public class MallardDuck extends Duck { //綠頭鴨public MallardDuck() {super();super.setFly(new FlyNoWay());//傳入對應對應的飛行實現(xiàn)類 ???直接set 一個實現(xiàn)類?沒看懂這寫法 } public void display() {System.out.println("綠頭鴨");} }public class RedHeadDuck extends Duck { //紅頭鴨public RedHeadDuck() {super();super.setFly(new RocketFly());//注入不同的接口實現(xiàn)類 } public void display() {System.out.println("紅頭鴨");} } public interface Fly { //fly 接口void fly(); } /*** 具體的策略算法實現(xiàn)類* 具體的飛行實現(xiàn)類*/ public class FlyNoWay implements Fly {public void fly() {System.out.println("不會飛");} } /*** 具體的策略算法實現(xiàn)類* 具體的飛行實現(xiàn)類*/ public class RocketFly implements Fly {public void fly() {System.out.println("坐火箭");} } //測試public static void main(String[] args) {/**** 策略模式的理解 根據不同的方式*/Duck duck = new MallardDuck();duck.display();duck.quack();duck.getFly();}
?
轉載于:https://www.cnblogs.com/lanSeGeDiao/p/9362300.html
總結
- 上一篇: Windows和Linux双系统时间不对
- 下一篇: ES6版Promise实现,给你不一样的