策略模式总结
2016-01-08 10:25
155 查看
策略模式的定义:定义了算法族,分别封装起来,让他们直接可以相互替换,此模式让算法的变化独立于使用算法的客户。
自己的定义:策略模式使实体类和其应有的行为进行分离,使行为独立,达到多态的目的。 伪类图:
与状态模式的区别:
策略模式的接口实现类属于平等关系,处理的业务一致,但是方法不同。
状态模式的接口实现类属于平行关系,处理的业务根据实体类内部状态的变化而变化。
与状态模式的关联(自己总结):
状态模式和策略模式的关联很紧密,使用的时候很容易将状态模式误用为策略模式,我认为,在区分这两个
模式的时候,观察调用他们的主类内部是否有判断状态的条件,如果有,则为状态模式,反之,为策略模式。
举个例子:
首先我们写出一个简单的策略模式:
实体类:
行为接口:
行为实现类A:
行为实现类B:
具体调用:
上面的具体调用中,我们就用策略模式实现了Context类的多态(在实体类的不同子类中使用会有更明显的效果)。那么我们在来看看怎么把上面的例子变成状态模式。
我们只需要修改具体调用的X类:
这样子,一个状态模式就完成了,很简单,就是添加了相应的状态判断。
说了这么多,有没有发现什么特性呢?
不管你们有没有发现,反正我是发现了:
使用场景:
状态模式一般是在同一个类中体现出来,比如,在上面的例子中,i的状态为0时,则使用StrategyImplA,为1时,则使用StrategyImplB。而策略模式则是根据不同的子类,调用不同的行为实现去处理不同的行为。
好了,暂时就说这么多,想拍砖的尽情拍。
自己的定义:策略模式使实体类和其应有的行为进行分离,使行为独立,达到多态的目的。 伪类图:
与状态模式的区别:
策略模式的接口实现类属于平等关系,处理的业务一致,但是方法不同。
状态模式的接口实现类属于平行关系,处理的业务根据实体类内部状态的变化而变化。
与状态模式的关联(自己总结):
状态模式和策略模式的关联很紧密,使用的时候很容易将状态模式误用为策略模式,我认为,在区分这两个
模式的时候,观察调用他们的主类内部是否有判断状态的条件,如果有,则为状态模式,反之,为策略模式。
举个例子:
首先我们写出一个简单的策略模式:
实体类:
public class Context { Method method; Context(Method method) { this.method = method; } public void doMethod() { method.method(); } }
行为接口:
public interface Method { public void method(); }
行为实现类A:
public class StrategyImplA implements Method { @Override public void method() { // TODO Auto-generated method stub System.out.println("这是第一个实现"); } }
行为实现类B:
public class StrategyImplB implements Method { @Override public void method() { // TODO Auto-generated method stub System.out.println("这是第二个实现"); } }
具体调用:
public class X { public static void main(String[] args) { Context ctx = new Context(new StrategyImplA()); ctx.doMethod(); ctx = new Context(new StrategyImplB()); ctx.doMethod(); } }
上面的具体调用中,我们就用策略模式实现了Context类的多态(在实体类的不同子类中使用会有更明显的效果)。那么我们在来看看怎么把上面的例子变成状态模式。
我们只需要修改具体调用的X类:
public class X { public static void main(String[] args) { int i=0; Context ctx3 ; if(i==0){ ctx3 = new Context (new StrategyImplA()); ctx3.doMethod(); i=i+1; } if(i==1){ ctx3 = new Context (new StrategyImplB()); ctx3.doMethod(); } } }
这样子,一个状态模式就完成了,很简单,就是添加了相应的状态判断。
说了这么多,有没有发现什么特性呢?
不管你们有没有发现,反正我是发现了:
使用场景:
状态模式一般是在同一个类中体现出来,比如,在上面的例子中,i的状态为0时,则使用StrategyImplA,为1时,则使用StrategyImplB。而策略模式则是根据不同的子类,调用不同的行为实现去处理不同的行为。
好了,暂时就说这么多,想拍砖的尽情拍。
相关文章推荐
- Android或者手机版本号和sdk还有手机型号
- 一篇文章讲清楚android ImageView.ScaleType
- OC-1-8
- unity, imageEffect的最后一步blit所用的shader,应该关闭zwrite和ztest
- 【LeetCode】217. Contains Duplicate(sort,hash,map)
- ARC 完全指南
- Git全解析之用起来先
- 纯代码创建UIDatePicker
- ADB 在 Android SDK 的中的路径
- 统计学习笔记(4)——朴素贝叶斯法
- JSP标签JSTL(4)--URL
- Android Studio中文字体显示乱码
- Runtime之Method Swizzling
- JSP标签JSTL(4)--URL
- (java)Valid Palindrome
- 手把手带你自制Linux系统之六 编译内核及busybox完成系统定制
- vim配置
- Linux vi命令用法详解
- Java中使用Jedis操作Redis
- 统计学习笔记(3)——k近邻法与kd树