转贴自 http://www.blogjava.net/flustar/archive/2007/11/23/strategy.html
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数据库连接");
}
}
//环境角色-包含对抽象策略角色的引用,即DatabaseStrategy
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模式是一种定义一系列算法的方法。概念上看,这些算法完成的都是相同的工作,只是实现不同。