策略模式:将算法封装到类中,针对不同的场景,提供不同的算法。主要成员:Context(算法接收者) Strategy(算法接口) StrategyImpl(算法是实现者)
优点:灵活切换不同算法,减少If语句的使用
缺点:策略过多导致策略类膨胀
举个例子:
根据条件运算输入参数的加法或者减法
算法接口
package strategy; /** * @author ZHONGZHENG664 * @date 2018/7/15. */ public interface Strategy { /** * 针对a和b的运算 * @param a * @param b * @return */ int doSomething(int a,int b); }
算法使用环境
package strategy; /** * @author ZHONGZHENG664 * @date 2018/7/15. */ public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public int execute(int a,int b){ return this.strategy.doSomething(a, b); } }
加法算法的实现:
package strategy; /** * @author ZHONGZHENG664 * @date 2018/7/15. */ public class AddStrategy implements Strategy { public int doSomething(int a, int b) { return a+b; } }
减法算法的实现:
package strategy; /** * @author ZHONGZHENG664 * @date 2018/7/15. */ public class SubStrategy implements Strategy { public int doSomething(int a, int b) { return a-b; } }
测试实现:
package strategy; /** * @author ZHONGZHENG664 * @date 2018/7/15. */ public class Test { public static void main(String[] ags){ System.out.println("hrll"); Context context=new Context(new SubStrategy()); System.out.println("10-5="+context.execute(10,5)); context=new Context(new AddStrategy()); System.out.println("10+5="+context.execute(10,5)); } }
总结:
策略模式是一个比较简单的设计模式,在日常使用时我们也会把比较大的代码块放到一个方法中,然后根据if进行判断调用,已经很类似策略模式了。策略模式需要调用者知道那种“场景”调用何种“策略”,还是有提升空间的,可以考虑结合工厂模式进行。
基础模式是设计复杂场景的基础!从基础做起,在路上就好!