模式定义
Strategy模式定义了一系列不同的算法封装成不同的类,使客户端通过环境类来调用这些不同的算法类,实现统一对象的不同行为。
使用范围
- 同一个对象在不同的情形下具有不同的行为
举例说明
假设现有两个数字,他们在不同的情况下需要做不同的数学运算,加减乘除,具体由客户端来决定何时实现这些不同行为。我们首先定义一个Strategy接口,提供了execute的方法。同时这个execute具体内部的行为由Strategy的实现类来决定是加还是减,乘还是除。
public interface Strategy { public int execute(int arg1, int arg2); } -------- public class StrategyAdd implements Strategy{ public int execute(int arg1, int arg2) { return arg1 + arg2; } } -------- public class StrategyMultiply implements Strategy{ public int execute(int arg1, int arg2) { return arg1 * arg2; } } -------- public class StrategySubstract implements Strategy{ public int execute(int arg1, int arg2) { return arg1 - arg2; } }
至此,客户端完全可以通过调用这些不同的类来实现具体的数学运算。但是Strategy的模式提供了一个环境类,使客户在调用这些不同的类时能使用一致的接口。客户无需知道这些算法类具体如何运算,它只需在环境类中注入它需要的类对象即可。
public class StrategyContext { private Strategy strategy; public StrategyContext(Strategy s){ strategy = s; } public int executeStrategy(int arg1, int arg2){ return strategy.execute(arg1, arg2); } }
客户类通过创建环境类对象,注入算法类。
public class StrategyClient { public static void main(String args[]){ int r1, r2, r3; StrategyContext sm = new StrategyContext(new StrategyAdd()); r1 = sm.executeStrategy(2, 4); sm = new StrategyContext(new StrategySubstract()); r2 = sm.executeStrategy(2, 4); sm = new StrategyContext(new StrategyMultiply()); r3 = sm.executeStrategy(2, 4); System.out.println("r1=" + r1); System.out.println("r2=" + r2); System.out.println("r3=" + r3); } }
运算结果:
r1=6 r2=-2 r3=8
下载示例