策略模式
- 定义:定义一系列的算法,把每一个算法封装起来,并且使他们可相互替换。策略模式使得算法可独立于使用它的客户而独立变化
- 策略模式中有如下角色:
- Context:上下文角色,用来操作策略的上下文环境,起到承上启下的作用,屏蔽高层模块对策略、算法的直接访问
- Stragety:抽象策略角色,策略、算法的抽象,通常为接口
- ConcreteStragety:具体的策略实现
- 策略模式的简单实现
- 定义策略接口
public interface IStragety { int doOperation(int num1,int num2); }
- 具体策略实现
public class OperationAdd implements IStragety { @Override public int doOperation(int num1, int num2) { return num1+num2; } } public class OperationMinus implements IStragety { @Override public int doOperation(int num1, int num2) { return num1-num2; } } public class OpTimes implements IStragety { @Override public int doOperation(int num1, int num2) { return num1*num2; } }
- 上下文角色
public class Context { private IStragety stragety; public Context(IStragety stragety) { this.stragety = stragety; } public int operation(int num1, int num2){ return stragety.doOperation(num1, num2); } }
- 客户端调用
public class ClientDemo { public static void main(String[] args){ Context context = new Context(new OperationAdd()); int sum = context.operation(3,4); int times = new Context(new OpTimes()).operation(4,5); System.out.println(String.format("Sum=%d,times=%d",sum,times)); } }
- 定义策略接口
- 使用场景
- 对客户隐藏策略算法的具体实现细节,彼此完全独立
- 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时
- 在一个类中定义了很多行为,而且这些行为在这个类里的操作以多个条件语句的形式出现。策略模式将相关的条件分支移入他们各自的Strategy类中,以代替这些条件语句
- 优点
- 使用策略模式可以避免使用多重条件语句。多重条件语句不易维护,而且易出错
- 易于拓展。当需要添加一个策略算法时,只要实现接口就可以了
- 缺点
- 每一个策略都是一个类,复用性小。如果策略过多,类的数量会增多
- 上层模块必须知道有哪些策略,才能使用这些策略,这与迪米特原则相违背
Dana.Lee
To:Dana_Lee1016@126.com