设计模式之策略模式
概念定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 菜鸟教程定义:一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 个人理解:就是为多种可能出现的情况,去制定不同的策略,情况一用策略一解决,情况二用策略二解决......
策略模式适用于以下场景: 1. 多种算法或行为:当存在多个算法或行为可供选择,并且客户端需要在运行时动态选择其中一种算法或行为时,可以使用策略模式。这样可以避免使用大量的条件语句来判断不同的情况。 2. 需要扩展和维护性:当系统需要添加新的算法或行为时,使用策略模式可以简化扩展的过程。每个算法或行为都被封装在独立的策略类中,新增一个策略类即可,符合开闭原则。 3. 避免代码重复:当多个类具有相似的行为,但实现方式不同,使用策略模式可以避免代码重复。可以将相同的行为抽象成策略类,每个类实现自己的具体行为。 4. 条件复杂性:当业务逻辑中存在复杂的条件语句,使用策略模式可以将这些条件逻辑分离出来,使得代码更加清晰和可维护。 一些常见的应用场景包括: - 订单优惠策略:不同的订单可能有不同的优惠策略,可以使用策略模式将各种优惠策略封装成不同的策略类,并在运行时根据订单类型选择合适的优惠策略。 - 数据排序策略:对于不同类型的数据,可能需要使用不同的排序算法。使用策略模式,可以将各种排序算法封装成策略类,并根据需要动态选择合适的排序策略。 - 日志记录级别:在日志记录系统中,可以根据不同的日志级别选择不同的记录策略,例如将日志记录到文件、数据库或远程服务器。使用策略模式,可以将各种记录策略封装成策略类,并在运行时选择合适的记录策略。 总之,策略模式适用于具有多种算法或行为的场景,通过封装不同的策略类,可以在运行时动态选择合适的算法或行为,提高代码的灵活性、扩展性和可维护性。
|
代码实现
- 策略模式的代码理解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| package com.jw.cloud.modulepattern.strategy;
public class Main { 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)); } }
|
- 上下文类,其实可以理解为具体调用策略类的一个操作类,相当于旧功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package com.jw.cloud.modulepattern.strategy;
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); } }
|
- 策略接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| package com.jw.cloud.modulepattern.strategy;
public interface Strategy {
int doOperation(int num1, int num2); }
|
- 策略接口实现类 共有三个 加 减 乘
1 2 3 4 5 6 7 8 9 10 11 12 13
| package com.jw.cloud.modulepattern.strategy;
public class OperationAdd implements Strategy { @Override public int doOperation(int num1, int num2) { return num1 + num2; } }
|
- 策略接口实现类 共有三个 加 减 乘
1 2 3 4 5 6 7 8 9 10 11 12 13
| package com.jw.cloud.modulepattern.strategy;
public class OperationSubtract implements Strategy { @Override public int doOperation(int num1, int num2) { return num1 - num2; } }
|
- 策略接口实现类 共有三个 加 减 乘
1 2 3 4 5 6 7 8 9 10 11 12 13
| package com.jw.cloud.modulepattern.strategy;
public class OperationMultiply implements Strategy { @Override public int doOperation(int num1, int num2) { return num1 * num2; } }
|
运行结果
从下图的运行结果可以看出,我们没有破坏旧系统的代码逻辑,适配了些新功能上去。
总结
适配器模式是一种结构型设计模式,它用于将一个类的接口转换成客户端所期望的另一个接口。适配器模式允许不兼容的类能够协同工作,通过将一个类的接口包装在另一个类中,从而使两个不兼容的接口能够相互配合。