您的位置:首页 > 其它

策略模式总结

2016-01-08 10:25 155 查看
策略模式的定义:定义了算法族,分别封装起来,让他们直接可以相互替换,此模式让算法的变化独立于使用算法的客户。
自己的定义:策略模式使实体类和其应有的行为进行分离,使行为独立,达到多态的目的。 伪类图:



与状态模式的区别:
策略模式的接口实现类属于平等关系,处理的业务一致,但是方法不同。
状态模式的接口实现类属于平行关系,处理的业务根据实体类内部状态的变化而变化。
与状态模式的关联(自己总结):

状态模式和策略模式的关联很紧密,使用的时候很容易将状态模式误用为策略模式,我认为,在区分这两个
模式的时候,观察调用他们的主类内部是否有判断状态的条件,如果有,则为状态模式,反之,为策略模式。
举个例子:
首先我们写出一个简单的策略模式:
实体类:

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。而策略模式则是根据不同的子类,调用不同的行为实现去处理不同的行为。
好了,暂时就说这么多,想拍砖的尽情拍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: