|
|
策略模式:
策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
策略模式使得算法可以在不影响到客户端的情况下发生变化。使用策略模式可以把行为和环境分割开来。
环境类负责维持和查询行为类,各种算法则在具体策略中提供。由于算法和环境独立开来,算法的修改都不会影响环境和客户端
策略模式由三部分组成:
a: 抽象策略角色:策略类,通常由一个接口或者抽象类实现
b: 具体策略角色:包装了相关的算法和行为
c: 环境角色:持有一个策略类的引用,最终给客户端调用的。
一个简单运用策略模式的例子:
public interface IStrategy {/** * 抽象策略角色 策略类,通常由一个接口或者抽象类实现 * @param a * @param b * @return */public String calculate(float a,float b);}
public class AddStrategy implements IStrategy {/** * 具体策略角色:包装了相关的算法和行为 */@Overridepublic String calculate(float a, float b) {// TODO Auto-generated method stubfloat result=a+b;return "相加结果为:" + result; }}
public class SubStrategy implements IStrategy {/** * 具体策略角色:包装了相关的算法和行为 */@Overridepublic String calculate(float a, float b) {// TODO Auto-generated method stubfloat result=a-b;return "相减结果为:" + result; }}
public class ContextRole {/** * 环境角色,持有一个策略类的引用,最终给客户端调用的 */private IStrategy iStrategy;public ContextRole(IStrategy iStrategy){this.iStrategy=iStrategy;}public String calculate(float a,float b) { return this.iStrategy.calculate(a, b);}}
public class Test {/** * Client * @param args */public static void main(String[] args) {IStrategy iStrategy=new AddStrategy();ContextRole contextRole=new ContextRole(iStrategy);String result=contextRole.calculate(300, 200);System.out.println(result);iStrategy=new SubStrategy(); contextRole=new ContextRole(iStrategy);result=contextRole.calculate(300, 200);System.out.println(result);}}
相加结果为:500.0相减结果为:100.0 |
|