设计模式——策略模式
来源:互联网 发布:php 配置 mongodb 编辑:程序博客网 时间:2024/05/16 10:42
一、什么是策略模式?
策略模式就是定义一系列的算法,并将它们封装,使他们可以相互替换。策略模式使得算法以独立于客户而变化。
策略模式涉及到以下几个角色:
1. 抽象策略角色:定义了具体策略需要实现的抽象方法或接口
2. 具体策略角色:封装具体的算法
3. 环境角色:内部持有策略类对象的引用
举一个简单易懂的例子——计算器,计算器有操作(operation)方法,可以对应加减乘除等不同的具体运算。
二、策略模式框图
三、策略模式的具体实现代码
3.1 Calculate——抽象策略接口
package designpatterns.strategy;/** * Created by Olive on 2017/12/25. */public interface Calculate { void operation(double a, double b);}
3.2 Addition、Subtraction、Multiplication、Division——具体的策略类,分别代表加减乘除四个运算,实现了Calculate接口
package designpatterns.strategy;/** * Created by Olive on 2017/12/25. */public class Addition implements Calculate{ public void operation(double a, double b) { System.out.println((a + b)); }}public class Subtraction implements Calculate{ public void operation(double a, double b) { System.out.println((a - b)); }}public class Multiplication implements Calculate{ public void operation(double a, double b) { System.out.println((a * b)); }}public class Division implements Calculate { public void operation(double a, double b) { if (b != 0) { System.out.println((a / b)); } else { System.out.println("input error!"); } }}
3.3 Calculator——环境类,定义了四个运算算法的静态类,可以通过Calculator对象直接调用
package designpatterns.strategy;/** * Created by Olive on 2017/12/25. */public class Calculator { public static Addition addition = new Addition(); public static Subtraction subtraction = new Subtraction(); public static Multiplication multiplication = new Multiplication(); public static Division division = new Division();}
3.4 Client——客户端
package designpatterns.strategy;/** * Created by Olive on 2017/12/25. */public class Client { public static void main(String[] args) { Calculator calculator = new Calculator(); calculator.addition.operation(1, 1); calculator.subtraction.operation(10, 3); calculator.multiplication.operation(13, 7); calculator.division.operation(16, 5); }}
3.5 结果
2.07.091.03.2Process finished with exit code 0
四、策略模式和状态模式、模板方法模式的区别
看到策略模式,是不是和状态模式与模板方法模式有点相像呢?那么具体有什么不同呢?
状态模式强调的是状态,可以根据不同的外部情况作出不同的响应,这种不同的行为不是通过重写同一个方法实现的。而策略模式我们从框图中可以看到,其具体的策略是从同一个接口中得到的,策略模式是多态的一种表现。
具体策略类都实现了同一个接口方法,这看起来和模板方法模式很像。但是他们在设计的思想上差别。模板方法模式中的模板方法的执行顺序大致上由基类所控制,子类只是重写了模板方法中的一小部分,子类不会改变整体算法的执行逻辑。而策略模式所有的算法都会在子类的完成,强调具体行为的不同。