简介:

之前讲过模板方法,它的好处就是可以保持模板整体固定,只是特定步骤通过子类的复写,从而实现对整个模板的影响。
这里要介绍的策略方法和模板方法有类似地方,但是也存在较大的区别,这是废话,不然就不用多个策略模式了,
那么什么是策略模式呢?策略模式就是把一系列的算法从具体的业务处理中独立封装起来,把它们实现成为独立的算法类,使得他们可以相互替换,通过这种方式来实现客户和算法之间的解耦。
它的具体思路是通过一个持有算法的上下文对象,来封装一系列算法,这个对象并不负责决定具体选用哪个算法,而把算法选择的工作交给了客户,客户选择好具体的算法后设置到上下文对象中让上下文对象持有客户选择的算法,当客户通知上下文对象执行功能的时候,上下文对象则转调具体的算法,这样具体的算法和直接使用算法的客户就能够实现分离了。
在策略模式中上下文对象就是各个策略算法的公共类,可以在这里面存放各个算法所公用的数据以及所需要的公共方法。

其实说到公共方法这里有三种组织方式:
在上下文当中实现公共功能,让所有具体的策略算法回调这些方法。
将策略的接口改成抽象类,然后在其中实现具体算法的公共功能
为所有的策略算法定义一个抽象父类,让这个父类去实现策略的接口,然后在这个父类中实现公共的功能。

策略模式的使用场合:

在出现很多仅仅是行为有差别的相关类的情况下,可以使用策略模式来在这些行为之间动态切换。
出现同一个算法,有很多不同实现的情况下,可以使用策略模式来吧这些不同的实现,实现成为一个算法的类层次。
需要封装算法中存在和算法相关数据的情况下,可以使用策略模式来避免暴露这些跟算法相关的数据结构。

public interface StragryInterface {
public void stragryMethod();
}
public abstract class AbstractStragry implements StragryInterface {
protected void commonMethodOne() {
System.out.println("This is common Method One");
}

protected void commonMethodTwo() {
System.out.println("This is common Method Two");
}

public abstract void stepOne();
public abstract void stepTwo();
public void stragryMethod() {
stepOne();
stepTwo();
}
}
public class ConcreStragryOne extends AbstractStragry {
public void stepOne() {
System.out.println("This is from ConcreStragryOne");
super.commonMethodOne();
}
@Override
public void stepTwo() {
System.out.println("This is from ConcreStragryOne");
super.commonMethodTwo();
}
}
public class ConcreStragryTwo extends AbstractStragry {
public void stepOne() {
System.out.println("This is from ConcreStragryTwo");
super.commonMethodOne();
}
@Override
public void stepTwo() {
System.out.println("This is from ConcreStragryTwo");
super.commonMethodTwo();
}
}
public class Context {

private AbstractStragry mStragry = null;
public Context(AbstractStragry stragrey) {
mStragry = stragrey;
}
public void callStragrey() {
mStragry.stragryMethod();
}

public void setStragrey(AbstractStragry stragrey) {
mStragry = stragrey;
}
}
public class Client {

public static void main(String[] args) {
AbstractStragry stragryOne = new ConcreStragryOne();
AbstractStragry stragryTwo = new ConcreStragryTwo();
Context contextOne = new Context(stragryOne);
contextOne.callStragrey();

contextOne.setStragrey(stragryTwo);
contextOne.callStragrey();
}
}
Contents
  1. 1. 简介:
  2. 2. 策略模式的使用场合: