0%

设计模式-策略模式

前言

设计模式将会用 Java 来演示。
这里仅仅是个比较浅层的理解,用于快速回顾,相当于笔记。
之所以记录下策略模式,主要是因为此模式与我所探究的 java 委托 做比较

简介

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

理解

策略模式简单的来说,就是对解决一个问题,提出多种解法,而我们可以动态选择解法。

再见到那来说,就是一个管理策略接口的 context 上下文,策略接口是 context 的成员变量,而行为是调用了接口的公共方法,这样切换策略,只需要修改 centext 中的策略接口的实例化(子类)就可以了。

应用场景

context 在 Android 开发中就经常被使用(web 中,spring 中也很常见),在 Android 开发中,常常会通过 contxt 来获取其他上下文,同时可用来启动 Activity,Service,Broadcast等。作为一个承上启下的作用。

如果一个系统中有许多类,它们主要区别仅在于它们的行为,策略模式可以动态的让一个对象选择其中一个行为。

一个系统需要动态在几个算法中选择一个。

实现

一个简单的算术案例
来自于菜鸟教程——策略模式 的案例

UML

1

  • Strategy 策略接口,动态更改策略的关键
  • OperationAddOperationSubtractOperationMutiply 均继承自 Startegy,重写了其中 public int doOperation(int num1, int num2); 方法
  • Context 作为上下文,来控制管策略。 public int executeStrategy(int num1, int num2) 方法调用接口 Strategy 的方法
  • 主函数中,只需在构造 Context 时,传入需要的策略子类,即可做到动态切换策略。

代码

来自 菜鸟教程——策略模式 的代码

  1. 接口
1
2
3
public interface Strategy {
public int doOperation(int num1, int num2);
}
  1. 实现类
1
2
3
4
5
6
public class OperationAdd implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
1
2
3
4
5
6
public class OperationSubtract implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
1
2
3
4
5
6
public class OperationMultiply implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
  1. Context 上下文
1
2
3
4
5
6
7
8
9
10
11
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
public class StrategyPatternDemo {
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
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50

优点/缺点

优点

  1. 算法自由切换
  2. 避免了多重条件(if-else)判断
  3. 扩展性良好

缺点

  1. 策略类会增多
  2. 所有策略类都要对外暴漏

注意

如果一个系统的策略多于四个,就要考虑使用混合模式,解决策略来膨胀的问题。

参考

菜鸟教程——策略模式