GOF《设计模式》一书对Strategy模式是这样描述的:

    定义一系列的算法,把他们一个个封装起来,并且使它们可相互替换。Strategy模式使算法可独立于使用它的客户而变化。

    Strategy模式以下列几条原则为基础:

1) 每个对象都是一个具有职责的个体。

2) 这些职责不同的具体实现是通过多态的使用来完成的。

3) 概念上相同的算法具有多个不同的实现,需要进行管理。

下面我将通过一个实例来说明它的具体使用,这个例子是关于数据库连接的。代码如下:

interface DatabaseStrategy{

    public void process();

}

class MysqlDBStrategy implements DatabaseStrategy{

    public void process() {

       System.out.println("处理Mysql数据库连接");

    }

}

class OracleDBStrategy implements DatabaseStrategy{

    public void process() {

       System.out.println("处理Oracle数据库连接");

    }

}

class DataBaseManager{

    public void process(DatabaseStrategy dbStrategy){

       dbStrategy.process();

    }

}

publicclass StrategyClient {

    public static void main(String[] args) {

       MysqlDBStrategy mysql=new MysqlDBStrategy();

       DataBaseManager manager=new DataBaseManager();

       manager.process(mysql);

       OracleDBStrategy oracle=new OracleDBStrategy();

       manager.process(oracle);

    }

}

    在我们的实际编程中经常会遇到系统要连接的数据库可能不只一种,如果采用传统的方法,即修改连接Url的方法,这种方法确实可行,但是有一个问题要经常修改源代码,不利于以后的维护,那么有没有一种更好的方法呢?答案是有,使用Strategy模式,首先定义一个连接数据库通用的接口(在上面的例子中是DatabaseStrategy),然后再定义实现该接口的具体类(MysqlDBStrategy、OracleDBStrategy),在这些具体类,实现具体的逻辑。最后再定义一个管理数据库连接的类(DataBaseManager),它的内部有一个方法可以接受具体类实例的参数。我们可以看到这个参数是DatabaseStrategy类型的,也就是说它可以接受任何一个实现了DatabaseStrategy接口的类的具体实例(这里运用了对象替换机制,多态的一种),从而完成数据库连接的处理。如果我们还需要处理另外一种数据库如sqlserver,我们只需要建立一个SqlserverDBStrategy类实现DatabaseStrategy接口,把该类的实例传给DatabaseManager的process方法即可。

    小结:Strategy模式是一种定义一系列算法的方法。概念上看,这些算法完成的都是相同的工作,只是实现不同。