23種設計模式之二(策略模式)
阿新 • • 發佈:2017-10-14
而不是 部分 nts 設定 算法 策略 bstr 算法族 none
策略模式:(分別封裝行為接口,實現算法族,超類裏放行為接口對象,在子類裏具體設定行為對象)
原則:
分離變化部分,封裝接口,基於接口編程各種功能。此模式讓行為算法的變化獨立於算法的使用者。
舉例說明:
分別封裝行為接口:FlyBehavior、QuackBehavior;
實現算法族:BadFlyBehavior、GoodFlyBehavior、NoFlyBehavior;GaGaQuackBehavior、GeGeQuackBehavior、NoQuackBehavior;
超類裏放行為接口對象:
在子類裏具體設定行為對象:
在使用的時候:
例子結構:
1 package com.java.hexter.stimulateduck.flybehavior; 2 3 public interface FlyBehavior { 4 void fly(); 5 }FlyBehavior
1 package com.java.hexter.stimulateduck.quackbehavior; 2 3 public interface QuackBehavior { 4 void quack(); 5 };QuackBehavior
1 package com.java.hexter.stimulateduck.duck;Duck2 3 import com.java.hexter.stimulateduck.flybehavior.FlyBehavior; 4 import com.java.hexter.stimulateduck.quackbehavior.QuackBehavior; 5 6 public abstract class Duck { 7 8 FlyBehavior mFlyBehavior; 9 QuackBehavior mQuackBehavior; 10 11 public Duck() { 12 13 } 14 15 publicvoid Fly() { 16 mFlyBehavior.fly(); 17 } 18 19 public void Quack() { 20 mQuackBehavior.quack(); 21 } 22 23 public abstract void display(); 24 25 //為了增加代碼的靈活性,可以自己設定鴨子叫的方式 26 public void SetQuackBehavoir(QuackBehavior qb) { 27 mQuackBehavior = qb; 28 } 29 public void SetFlyBehavoir(FlyBehavior fb) { 30 mFlyBehavior = fb; 31 } 32 33 public void swim() { 34 System.out.println("~~im swim~~"); 35 } 36 }
1 package com.java.hexter.stimulateduck.flybehavior; 2 3 4 5 public class BadFlyBehavior implements FlyBehavior 6 { 7 @Override 8 public void fly() { 9 // TODO Auto-generated method stub 10 System.out.println("--BadFly--"); 11 } 12 }BadFlyBehavior
1 package com.java.hexter.stimulateduck.flybehavior; 2 3 4 public class GoodFlyBehavior implements FlyBehavior 5 { 6 7 @Override 8 public void fly() { 9 // TODO Auto-generated method stub 10 System.out.println("--GoodFly--"); 11 } 12 13 }GoodFlyBehavior
1 package com.java.hexter.stimulateduck.flybehavior; 2 3 4 public class NoFlyBehavior implements FlyBehavior 5 { 6 @Override 7 public void fly() { 8 // TODO Auto-generated method stub 9 System.out.println("--NoFly--"); 10 } 11 }NoFlyBehavior
1 package com.java.hexter.stimulateduck.quackbehavior; 2 3 4 public class GaGaQuackBehavior implements QuackBehavior 5 { 6 7 @Override 8 public void quack() { 9 // TODO Auto-generated method stub 10 System.out.println("__GaGa__"); 11 } 12 13 }GaGaQuackBehavior
1 package com.java.hexter.stimulateduck.quackbehavior; 2 3 4 public class GeGeQuackBehavior implements QuackBehavior 5 { 6 7 @Override 8 public void quack() { 9 // TODO Auto-generated method stub 10 System.out.println("__GeGe__"); 11 } 12 13 }GeGeQuackBehavior
1 package com.java.hexter.stimulateduck.quackbehavior; 2 3 4 public class NoQuackBehavior implements QuackBehavior 5 { 6 7 @Override 8 public void quack() { 9 // TODO Auto-generated method stub 10 System.out.println("__NoQuack__"); 11 } 12 13 }NoQuackBehavior
1 package com.java.hexter.stimulateduck.duck; 2 3 import com.java.hexter.stimulateduck.flybehavior.GoodFlyBehavior; 4 import com.java.hexter.stimulateduck.quackbehavior.GaGaQuackBehavior; 5 6 public class GreenHeadDuck extends Duck { 7 8 public GreenHeadDuck() { 9 mFlyBehavior = new GoodFlyBehavior(); 10 mQuackBehavior = new GaGaQuackBehavior(); 11 } 12 13 @Override 14 public void display() { 15 // TODO Auto-generated method stub 16 System.out.println("**GreenHead**"); 17 } 18 19 }GreenHeadDuck
1 package com.java.hexter.stimulateduck.duck; 2 3 import com.java.hexter.stimulateduck.flybehavior.BadFlyBehavior; 4 5 import com.java.hexter.stimulateduck.quackbehavior.GeGeQuackBehavior; 6 7 public class RedHeadDuck extends Duck { 8 9 public RedHeadDuck() { 10 mFlyBehavior = new BadFlyBehavior(); 11 mQuackBehavior = new GeGeQuackBehavior(); 12 } 13 14 @Override 15 public void display() { 16 // TODO Auto-generated method stub 17 System.out.println("**RedHead**"); 18 } 19 20 }RedHeadDuck
1 package com.java.hexter.stimulateduck; 2 3 import com.java.hexter.stimulateduck.duck.Duck; 4 import com.java.hexter.stimulateduck.duck.GreenHeadDuck; 5 import com.java.hexter.stimulateduck.duck.RedHeadDuck; 6 import com.java.hexter.stimulateduck.flybehavior.NoFlyBehavior; 7 import com.java.hexter.stimulateduck.quackbehavior.NoQuackBehavior; 8 9 10 public class StimulateDuck { 11 12 public static void main(String[] args) { 13 14 Duck mGreenHeadDuck = new GreenHeadDuck(); 15 Duck mRedHeadDuck = new RedHeadDuck(); 16 17 mGreenHeadDuck.display(); 18 mGreenHeadDuck.Fly(); 19 mGreenHeadDuck.Quack(); 20 mGreenHeadDuck.swim(); 21 22 mRedHeadDuck.display(); 23 mRedHeadDuck.Fly(); 24 mRedHeadDuck.Quack(); 25 mRedHeadDuck.swim(); 26 mRedHeadDuck.display(); 27 mRedHeadDuck.SetFlyBehavoir(new NoFlyBehavior()); 28 mRedHeadDuck.Fly(); 29 mRedHeadDuck.SetQuackBehavoir(new NoQuackBehavior()); 30 mRedHeadDuck.Quack(); 31 } 32 33 }StimulateDuck
輸出結果:
**GreenHead** --GoodFly-- __GaGa__ ~~im swim~~ **RedHead** --BadFly-- __GeGe__ ~~im swim~~ **RedHead** --NoFly-- __NoQuack__
例子該種方式實現的好處:新增行為簡單,行為類更好的復用,組合更方便。既有繼承帶來的復用好處,沒有挖坑
註意:
1.認真分析策略中變化部分與不變部分;
2.多用組合,少用繼承;用行為類組合,而不是行為的繼承;這樣做更有彈性。
23種設計模式之二(策略模式)