4. 具体的实例
策略模式与状态模式非常相似,都是将一组对象抽象出来,与状态模式不同的时,策略模式抽象的算法,而状态模式抽象的是对象内部的状态。因此在实现上它们也非常类似。下面我用Java语言写一个简单的例子。
程序清单1:Context类
程序清单2:Strategy类package designpatterns.strategy;
import java.util.*;
import java.io.*;
![]()
/**//**
* 该类是策略模式中的Context类,用来管理算法运行的上下文环境
* @author Feifan Yin
*
*/
public class Context ...{
private Strategy m_strategy;
private byte[] inData;
private byte[] outData;
public Context(Strategy pStrategy, File file)...{
m_strategy = pStrategy;
try...{
FileInputStream fi = new FileInputStream(file);
}catch(Exception e)...{
e.printStackTrace();
}
}
![]()
public void contextInterface()...{
if(inData != null)...{
this.outData = m_strategy.algorithmInterface(inData);
}
}
![]()
void printResult()...{
if(this.outData != null)...{
System.out.println(new String(outData));
}
}
![]()
public static final void main(String arg[])...{
//选择一个算法
Strategy strategy = new ConcreateStrategyA();
//Strategy strategy = new ConcreateStrategyB();
//Strategy strategy = new ConcreateStrategyC();
//给出上下文环境
Context context = new Context(strategy,new File("in.txt"));
//利用上下文环境驱动算法执行
context.contextInterface();
//输出算法执行结果
context.printResult();
}
}
程序清单3:ConcreateStrategyA类package designpatterns.strategy;
![]()
/**//**
* 表示一个抽象的算法,为具体的算法定义皆空
* @author Feifan Yin
*
*/
public abstract class Strategy ...{
/**//**
* 抽象的算法接口
* @param data 输入数据
* @return 输出数据
*/
public abstract byte[] algorithmInterface(byte[] data);
}
程序清单4:ConcreateStrategyB类package designpatterns.strategy;
![]()
/**//**
* 算法封装类,表示一个具体的算法
* @author Feifan Yin
*
*/
public class ConcreateStrategyA extends Strategy...{
/**//**
* 具体算法的实现
*/
public byte[] algorithmInterface(byte[] data) ...{
// TODO Auto-generated method stub
for(int i = 0;i<data.length; ++i)...{
data[i] = (byte) ~data[i];
}
return data;
}
}
package designpatterns.strategy;
![]()
/**//**
* 算法封装类,表示一个具体的算法
* @author Feifan Yin
*
*/
public class ConcreateStrategyB extends Strategy...{
/**//**
* 具体算法的实现
*/
public byte[] algorithmInterface(byte[] data) ...{
// TODO Auto-generated method stub
for(int i = 0;i<data.length; ++i)...{
data[i] = (byte) (6 ^ data[i]);
}
return data;
}
}
程序清单5:ConcreateStrategyC类
package designpatterns.strategy;
![]()
/**//**
* 算法封装类,表示一个具体的算法
* @author Feifan Yin
*
*/
public class ConcreateStrategyC extends Strategy...{
/**//**
* 具体算法的实现
*/
public byte[] algorithmInterface(byte[] data) ...{
// TODO Auto-generated method stub
for(int i = 0;i<data.length; ++i)...{
data[i] = (byte) (123 & data[i]);
}
return data;
}
}
