技术开发 频道

策略(Strategy)模式简介



    4. 具体的实例
    策略模式与状态模式非常相似,都是将一组对象抽象出来,与状态模式不同的时,策略模式抽象的算法,而状态模式抽象的是对象内部的状态。因此在实现上它们也非常类似。下面我用Java语言写一个简单的例子。
    程序清单1:Context类
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(); } }
    程序清单2:Strategy类
package designpatterns.strategy; /** * 表示一个抽象的算法,为具体的算法定义皆空 * @author Feifan Yin * */ public abstract class Strategy { /** * 抽象的算法接口 * @param data 输入数据 * @return 输出数据 */ public abstract byte[] algorithmInterface(byte[] data); }
    程序清单3:ConcreateStrategyA类
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; } }
    程序清单4:ConcreateStrategyB类
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; } }
0
相关文章