行为型模式
- 在策略模式中,一个类的行为或者其相应的算法可以在运行时更改;大大简化
if-else
的写法。 - 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
-
介绍
- 使用场景
- 在面向对象程序设计中,如果一个对象存在多种行为选择。
- 在一个系统程序中根据用户选择不同,有多种算法可供选择。
- 在一个系统中有多个
if-else
多重选择,并且后期还有可能进行扩展时。
- 目的
- 将对象的多个行为(算法)一一封装起来,并且可以根据需求,动态替换。
- 关键要点
- 定义好策略接口
- 实现同一个接口
- 创建使用策略的类
- 使用场景
-
实现
-
定义好策略接口
package org.hdq.strategy; /** * @className: Strategy * @description: 策略接口 * @author: huangdq * @date: 2023/01/29 10:11 **/ public interface Strategy { public int doOperation(int num1, int num2); }
-
多种行为实现策略接口
package org.hdq.strategy; /** * @className: AddOperation * @description: 相加 操作类 * @author: huangdq * @date: 2023/01/29 10:14 **/ public class AddOperation implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 + num2; } }
package org.hdq.strategy; /** * @className: MultiplyOperation * @description: 相乘 操作 * @author: huangdq * @date: 2023/01/29 10:18 **/ public class MultiplyOperation implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 * num2; } }
package org.hdq.strategy; /** * @className: SubtractOperation * @description: 相减 操作类 * @author: huangdq * @date: 2023/01/29 10:16 **/ public class SubtractOperation implements Strategy{ @Override public int doOperation(int num1, int num2) { return num1 - num2; } }
-
创建使用策略类
package org.hdq.strategy; /** * @className: Context * @description: 执行行为变化 * @author: huangdq * @date: 2023/01/29 10:20 **/ 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); } }
-
实现
package org.hdq.strategy; /** * @className: StrategyPatternDemo * @description: 测试类 * @author: huangdq * @date: 2023/01/29 10:23 **/ public class StrategyPatternDemo { public static void main(String[] args) { Context context = new Context(new AddOperation()); System.out.println(context.executeStrategy(10 , 22)); context = new Context(new SubtractOperation()); System.out.println(context.executeStrategy(23, 11)); } }
-
-
总结
- 优点
- 多种行为(算法)可以自由切换
- 避免使用多重条件判断
- 扩展性良好
- 缺点
- 随着业务,策略类会逐渐变多,增加维护开销。
- 所有策略类都需要对外暴露
- 优点