一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第28天,点击查看活动详情。
这篇文章我们讲一下“策略模式”。
策略模式的定义
策略模式其实是定义一些处理逻辑,将这些处理逻辑封装起来,在调用它们的位置可以根据使用场景相互替换。内部的处理逻辑的变化,不会影响使用者。
日常开发时,对于某些应用场景,会存在很多中实现方法,比如说针对一些需要if 结构去判断调用行为的场景,就可以考虑使用策略模式。
说的这些可能比较抽象,但是是策略模式的基本定义,下面我们将结合策略模式的UML 类图和实际应用场景来做具体分析,同时给出示例代码。
策略模式组成
首先给出策略模式的类图:
组成部分:
-
抽象策略(Strategy):最主要的策略的定义就是这个了,它定义了一个公共接口
action,不同的应用场景定义具体策略实现这个接口,context使用这个接口来实现应用不同处理逻辑的功能。一般来说,抽象策略使用接口或抽象类实现。 -
具体策略(ConcreteStrategy):继承(或者实现)抽象策略定义的接口,也就是某些具体策略的业务逻辑的具体实现类。
-
环境(Context):组合的关系,持有一个策略类的引用,然后进行接口调用,实现业务。
实例代码
首先声明应用场景:
最近公司业务发展良好,有大量产品需要运往目的市场,公司正在制定物流方案,有如下几种:
-
空运
-
铁路运送
-
汽车运送
-
给第三方物流公司运输
传统的方法应该是这样的:
public static void logistics(String mode) {
if ("air".equals(mode)) {
System.out.println("空运");
} else if ("train".equals (mode)) {
System.out.println("铁路");
} else if ("truck".equals(mode)) {
System.out.println("汽车运输");
} else if ("outsourcing".equals(mode)) {
System.out.println("物流公司");
}
}
如果使用策略模式:
- 抽象策略
public interface Strategy {
void action();
}
- 具体策略
public class AirStrategy implements Strategy {
@Override
public void action() {
System.out.println("空运");
}
}
public class TrainStrategy implements Strategy {
@Override
public void action() {
System.out.println("铁路运输");
}
}
public class OutsourcingStrategy implements Strategy {
@Override
public void action() {
System.out.println("给第三方物流公司");
}
}
- 应用环境上下文
public class Context {
public void execute(Strategy strategy) {
strategy.action();
}
}
总结
参考上面的类图和代码我们可以发现,策略模式的实现也比较清晰明了。
就是顶一个抽象策略,然后由具体的策略来实现,在应用上下文环境中可以随意替换策略。同时策略内部的更改不会影响上下文。