java中常用的设计模式如单例模式、原型模式,在这之前的2篇文章中已经说明,还有代理模式,外观模式、装饰模式、模板模式等。
今天再说一个java中常用的设计模式-策略模式。
说的有出入的,请大家指正,互相学习,共同进步!
策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:”准备一组算法,并将每一个算法封装起来,使得它们可以互换”。下面就以一个示意性的实现讲解策略模式实例的结构。
下面来看代码吧。
1、创建Strategy接口
1 2 3 4 5
| public interface Strategy { void operate(int a , int b) ; }
|
2、创建Strategy接口实现类
1 2 3 4 5 6 7 8
| public class AddStrategy implements Strategy { @Override public void operate(int a, int b) { System.out.println("a+b="+(a+b)); } }
|
1 2 3 4 5 6 7 8
| public class SubStrategy implements Strategy{ @Override public void operate(int a, int b) { System.out.println("a-b="+(a-b)); } }
|
1 2 3 4 5 6 7 8
| public class MulStrategy implements Strategy { @Override public void operate(int a, int b) { System.out.println("a*b="+(a*b)); } }
|
1 2 3 4 5 6 7 8
| public class DivStrategy implements Strategy { @Override public void operate(int a, int b) { System.out.println("a/b="+(a/b)); } }
|
3、创建Context类
使用 Context 来查看当它改变策略 Strategy 时的行为变化。
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public int executeStrategy(int num1, int num2) { return strategy.operate(num1, num2); } }
|
4、验证输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class Test { public static void main(String[] args) { Context context = new Context(new AddStrategy()); System.out.println("10 + 5 = " + context.executeStrategy(10, 5)); context = new Context(new SubStrategy()); System.out.println("10 – 5 = " + context.executeStrategy(10, 5)); context = new Context(new MulStrategy()); System.out.println("10 * 5 = " + context.executeStrategy(10, 5)); context = new Context(new DivStrategy()); System.out.println("10 / 5 = " + context.executeStrategy(10, 5)); } }
|
ok,到此结束,大家可以自行运行测试。
5、策略模式优缺点及使用场景
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。
使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。
Java中Comparator接口,就用的策略模式。如Collections里面有一个sort方法,可自行实现Comparator接口对集合排序。