策略模式的定义:定义了算法族,分别封装起来,让他们直接可以相互替换,此模式让算法的变化独立于使用算法的客户。
自己的定义:策略模式使实体类和其应有的行为进行分离,使行为独立,达到多态的目的。
伪类图:
与状态模式的区别:
策略模式的接口实现类属于平等关系,处理的业务一致,但是方法不同。
状态模式的接口实现类属于平行关系,处理的业务根据实体类内部状态的变化而变化。
与状态模式的关联(自己总结):
状态模式和策略模式的关联很紧密,使用的时候很容易将状态模式误用为策略模式,我认为,在区分这两个
模式的时候,观察调用他们的主类内部是否有判断状态的条件,如果有,则为状态模式,反之,为策略模式。
举个例子:
首先我们写出一个简单的策略模式:
实体类:
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。而策略模式则是根据不同的子类,调用不同的行为实现去处理不同的行为。
好了,暂时就说这么多,想拍砖的尽情拍。