最近重看java編程思想,感覺收穫頗多。 看到在繼承處提到的策略模式不禁想到之前的一個乒乓球機器人的項目中的一個環節,感覺策略模式能很好的解決,所以在這裡寫一個小demo 情景: 由機器人視覺採集到一些點後,對乒乓求得軌跡進行預測,併在這條軌跡中取一個最佳擊球點。 之前我是直接在一個類中通過對不同方 ...
最近重看java編程思想,感覺收穫頗多。
看到在繼承處提到的策略模式不禁想到之前的一個乒乓球機器人的項目中的一個環節,感覺策略模式能很好的解決,所以在這裡寫一個小demo
情景:
由機器人視覺採集到一些點後,對乒乓求得軌跡進行預測,併在這條軌跡中取一個最佳擊球點。
之前我是直接在一個類中通過對不同方案的比較返回一個值,但是寫到最後有7,8中方案的時候就會很混亂,此時可以考慮策略模式
策略模式本質:
通過什麼策略(strategy)對什麼樣的數據(input)進行處理最終得到什麼結果(返回值)。
函數原型:public Object process(Strategy A, Object input);
類圖:
關鍵:
繼承(介面)
向上轉型upcasting
代碼:
結構:
//FindHitPoint.java
1 package com.paci.base; 2 3 public class FindHitPoint { 4 5 public Object getHitPoint(Object[] points) { 6 // TODO Auto-generated method stub 7 return null; 8 } 9 }
//App.java
1 package com.paci.main; 2 3 import com.paci.base.FindHitPoint; 4 import com.paic.domain.Point3D; 5 import com.paic.process.StrategyOne; 6 import com.paic.process.StrategyTwo; 7 8 public class App { 9 public static void main(String[] args) { 10 Point3D[] trace = new Point3D[2]; 11 trace[0] = new Point3D(0, 0, 0); 12 trace[1] = new Point3D(1, 1, 1); 13 Point3D result = (Point3D) getResult(new StrategyOne(), trace); 14 System.out.println(result.getX() + "@" + result.getY() + "@" + result.getZ()); 15 } 16 17 private static Object getResult(FindHitPoint fhp, Object[] input) { 18 Object obj = null; 19 obj = fhp.getHitPoint(input); 20 return obj; 21 } 22 }
//Point3D.java
1 package com.paic.domain; 2 3 public class Point3D { 4 private float x; 5 private float y; 6 private float z; 7 8 public Point3D(float x, float y, float z){ 9 this.x = x; 10 this.y = y; 11 this.z = z; 12 } 13 14 public float getX() { 15 return x; 16 } 17 public void setX(float x) { 18 this.x = x; 19 } 20 public float getY() { 21 return y; 22 } 23 public void setY(float y) { 24 this.y = y; 25 } 26 public float getZ() { 27 return z; 28 } 29 public void setZ(float z) { 30 this.z = z; 31 } 32 33 }
//StrategyOne.java
1 package com.paic.process; 2 3 import com.paci.base.FindHitPoint; 4 import com.paic.domain.Point3D; 5 6 public class StrategyOne extends FindHitPoint { 7 8 @Override 9 public Object getHitPoint(Object[] points) { 10 11 Point3D hitPoint = null; 12 if(points != null) { 13 hitPoint = (Point3D)points[0]; 14 } 15 return hitPoint; 16 } 17 18 }
//StrategyTwo.java
1 package com.paic.process; 2 3 import com.paci.base.FindHitPoint; 4 import com.paic.domain.Point3D; 5 6 public class StrategyTwo extends FindHitPoint { 7 8 @Override 9 public Object getHitPoint(Object[] points) { 10 11 Point3D hitPoint = null; 12 if(points != null) { 13 hitPoint = (Point3D)points[1]; 14 } 15 return hitPoint; 16 } 17 }