策略模式
作者:互联网
定义:
该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
即:一个接口(负责算法的责任),接口底下多个实现类(负责算法的具体实现),这些实现类之间可以互相替换。
优点:
-
可以避免多重if...else条件语句。
-
提供相同行为不同实现,客户可以根据不同时间或空间要求选择不同的实现。
-
对开闭原则完美支持,不修改原有代码的情况下,灵活增加新算法。
-
把算法的使用放到环境类中,而算法的实现放在具体的策略实现类中,实现两者分离。
缺点:
-
过多的策略类,增加项目维护的难度。
结构:
主要角色如下:
1.抽象策略类(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方法实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
2.具体策略类(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
3.环境(Context)类:持有一个策略类的引用,最终给客户端调用。
代码示例:
策略抽象类:
Strategy.java public interface Strategy { public int doOperation(int num1, int num2); }
策略实现类:
OperationAdd.java public class OperationAdd implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 + num2; } }
OperationSubtract.java public class OperationSubtract implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 - num2; } }
OperationMultiply.java public class OperationMultiply implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 * num2; } }
策略环境类:
Context.java public class Context { private Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public int executeStrategy(int num1, int num2){ return strategy.doOperation(num1, num2); } }
调用测试:
StrategyPatternDemo.java public class StrategyPatternDemo { public static void main(String[] args) { Context context = new Context(new OperationAdd()); System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationSubtract()); System.out.println("10 - 5 = " + context.executeStrategy(10, 5)); context = new Context(new OperationMultiply()); System.out.println("10 * 5 = " + context.executeStrategy(10, 5)); } }
标签:num1,num2,int,模式,Strategy,算法,public,策略 来源: https://www.cnblogs.com/l12138h/p/16306313.html