策略模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了策略模式相关的知识,希望对你有一定的参考价值。

最近重看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 }

 










以上是关于策略模式的主要内容,如果未能解决你的问题,请参考以下文章

Redis实现分布式锁(设计模式应用实战)

用于从 cloudkit 检索单列的代码模式/片段

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式

代码片-策略模式+工厂模式