策略模式
Posted 21karat
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了策略模式相关的知识,希望对你有一定的参考价值。
策略模式(Strategy Pattern),将各种算法封装到具体的类中,作为一个抽象策略类的子类,使得它们可以互换。客户端可以自行决定使用哪种算法。(许多相关的类行为不同(算法不同)可以使用策略)
常规代码:
/*常规调用*/ public static int getTotal(String type, int num) { int total = 0; switch (type) { case "a": if (num < 6) total = 2; else total = 1; break; case "b": if(num<4) total = 1; else total=1+(num-1)*4; break; case "c": total = total-1; break; default: break; } return total; }
策略改版代码:
public interface CalculateStrategy { /*策略模式的运算法则*/ int calculate(int num); }
public class NumberOne implements CalculateStrategy{ /*具体策略1*/ @Override public int calculate(int num) { return num<6?2:1; } }
public class NumberTwo implements CalculateStrategy{ /*具体策略2*/ @Override public int calculate(int num) { return num<4?1:(1+(num-1)*4); } }
public class NumberThree implements CalculateStrategy{ /*具体策略3*/ @Override public int calculate(int num) { return num-1; } }
public class Context { /*抽象策略*/ private CalculateStrategy strategy; private int num; /** * 构造函数设置具体策略 * @param strategy * @param num */ public Context(CalculateStrategy strategy,int num) { this.strategy = strategy; this.num = num; } /** * 封装后的策略方法 * @return */ public int calculate() { return this.strategy.calculate(num); } }
public static void main(String[] args) { //策略者模式改版调用 Context context; context=new Context(new NumberOne(),4); System.out.println(context.calculate());//2 context=new Context(new NumberTwo(),5); System.out.println(context.calculate());//17 context=new Context(new NumberThree(),5); System.out.println(context.calculate());//4 }
策略模式角色划分: Strategy 策略接口或者(抽象策略类),定义策略执行接口具体策略类 Context 上下文类,持有具体策略类的实例,并负责调用相关的算法。
策略模式优点
-
策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法(策略),并且可以灵活地增加新的算法(策略)。
-
策略模式通过Context类提供了管理具体策略类(算法族)的办法。
-
结合简单工厂模式和Annotation,策略模式可以方便的在不修改客户端代码的前提下切换算法(策略)。
策略模式缺点
-
传统的策略模式实现方式中,客户端必须知道所有的具体策略类,并须自行显示决定使用哪一个策略类。
-
策略模式可能创建很多具体策略类的实例。
以上是关于策略模式的主要内容,如果未能解决你的问题,请参考以下文章