设计模式之策略模式

概念定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
菜鸟教程定义:一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
个人理解:就是为多种可能出现的情况,去制定不同的策略,情况一用策略一解决,情况二用策略二解决......

策略模式适用于以下场景:
1. 多种算法或行为:当存在多个算法或行为可供选择,并且客户端需要在运行时动态选择其中一种算法或行为时,可以使用策略模式。这样可以避免使用大量的条件语句来判断不同的情况。
2. 需要扩展和维护性:当系统需要添加新的算法或行为时,使用策略模式可以简化扩展的过程。每个算法或行为都被封装在独立的策略类中,新增一个策略类即可,符合开闭原则。
3. 避免代码重复:当多个类具有相似的行为,但实现方式不同,使用策略模式可以避免代码重复。可以将相同的行为抽象成策略类,每个类实现自己的具体行为。
4. 条件复杂性:当业务逻辑中存在复杂的条件语句,使用策略模式可以将这些条件逻辑分离出来,使得代码更加清晰和可维护。
一些常见的应用场景包括:
- 订单优惠策略:不同的订单可能有不同的优惠策略,可以使用策略模式将各种优惠策略封装成不同的策略类,并在运行时根据订单类型选择合适的优惠策略。
- 数据排序策略:对于不同类型的数据,可能需要使用不同的排序算法。使用策略模式,可以将各种排序算法封装成策略类,并根据需要动态选择合适的排序策略。
- 日志记录级别:在日志记录系统中,可以根据不同的日志级别选择不同的记录策略,例如将日志记录到文件、数据库或远程服务器。使用策略模式,可以将各种记录策略封装成策略类,并在运行时选择合适的记录策略。
总之,策略模式适用于具有多种算法或行为的场景,通过封装不同的策略类,可以在运行时动态选择合适的算法或行为,提高代码的灵活性、扩展性和可维护性。

代码实现
  1. 策略模式的代码理解
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;

/**
* 根据不同的算法或者行为做出不同的逻辑处理
* 定义了一个解析报文的接口 根据不同的消息id去创建不同的消息解析类 有站台到站消息 列车到站消息 首末班消息 站台门消息 列车门消息
* 然后编写一个实际操作的类,这个类需要去调用接口的方法 也就说参数是接口对象 然后来直接调用 比如这个里面的Context类
* context对象去调用接口的方法 这样就完成了一个策略模式的设计
*
* @author JoyWu
*/
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. 上下文类,其实可以理解为具体调用策略类的一个操作类,相当于旧功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.jw.cloud.modulepattern.strategy;

/**
* 定义一个上下文类,用于维护当前使用的策略对象
* @author JoyWu
*/
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. 策略接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.jw.cloud.modulepattern.strategy;

/**
* 策略接口方法抽象类
*
* 策略模式是让某一个方法提供不同的策略,这样某一种功能可以在多个方法扩展
* @author JoyWu
*/
public interface Strategy {
/**
* 执行操作
* @param num1
* @param num2
* @return
*/
int doOperation(int num1, int num2);
}
  1. 策略接口实现类 共有三个 加 减 乘
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.jw.cloud.modulepattern.strategy;

/**
* 加法策略
* @author JoyWu
*/
public class OperationAdd implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}

  1. 策略接口实现类 共有三个 加 减 乘
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.jw.cloud.modulepattern.strategy;

/**
* 减法策略
* @author JoyWu
*/
public class OperationSubtract implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}

  1. 策略接口实现类 共有三个 加 减 乘
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.jw.cloud.modulepattern.strategy;

/**
* 乘法策略
* @author JoyWu
*/
public class OperationMultiply implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}

运行结果

从下图的运行结果可以看出,我们没有破坏旧系统的代码逻辑,适配了些新功能上去。
img_1.png

总结

适配器模式是一种结构型设计模式,它用于将一个类的接口转换成客户端所期望的另一个接口。适配器模式允许不兼容的类能够协同工作,通过将一个类的接口包装在另一个类中,从而使两个不兼容的接口能够相互配合。