Zer0e's Blog

设计模式之策略模式

字数统计: 781阅读时长: 3 min
2020/08/27 Share

前言

几天没写文章,今天来讲讲策略模式。

正文

概念

策略模式,属于行为型模式。它是把算法封装到类中,让这些算法可以相互替换,并且不影响到客户端,简单来说,就是把算法进行封装,客户端可以通过条件不同来选择不同的策略。
常见的实例有:

  • 客户端需要选择几种算法中的一种,例如某些工具类的封装
  • 选择不同实现的方式,例如实现出行可以步行可以公交等等。

实现

那策略模式的实现关键在于所有的策略需要实现同一个接口。
我们举个例子,例如出门的选择上,假设有三种选择,步行,公交,驾车。我们用这个例子实现策略模式。
首先定义Strategy接口

1
2
3
public interface Strategy {
public void go();
}

接着实现几种策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class StrategyA implements Strategy{
@Override
public void go() {
System.out.println("选择步行");
}
}
public class StrategyB implements Strategy{
@Override
public void go() {
System.out.println("选择公交");
}
}
public class StrategyC implements Strategy{
@Override
public void go() {
System.out.println("选择驾车");
}
}

接着我们创建context对象,这个类是为了让客户端选择合适策略,即连接客户端与策略的中间者。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Context {
private Strategy strategy;

public Context() {
setStrategy();
}

public void setStrategy(){
Random random = new Random();
int r = random.nextInt(3);
if (r == 0){
strategy = new StrategyA();
}else if (r == 1){
strategy = new StrategyB();
}else{
strategy = new StrategyC();
}
}

public void selectFunction(){
strategy.go();
}
}

这里我们使用随机法选择策略,那实现的方式有很多,比如客户端直接传入策略的对象,又比如客户端传入关键字让context选择策略等等。

最后我们创建客户端调用看看。

1
2
3
4
5
6
public class Client {
public static void main(String[] args) {
Context test_context = new Context();
test_context.selectFunction();
}
}

如此我们便实现了一个简单的策略模式。这里有一点,常见的策略模式是由客户端决定使用什么策略,所以严格来说上文并不是一个严谨的策略模式。

优缺点

策略模式的优点在于策略可以灵活的切换,因为他们实现了同一个接口。其次就是便于拓展,在增加新的策略时,只需要添加一个具体类并加入Context类中就可以,符合”开闭原则”。
那缺点在于客户端必须知道所有的策略,需要自行决定使用策略,即需要暴露所有策略类。其次就是策略类会随着系统扩展而变多,而不利于维护。

总结

本文对策略模式进行了大概介绍。如果系统中需要选择其中一种算法时或者类的区别在于不同的行为时,又或者一个对象有多个行为,当这些情况时,可以使用策略模式对策略进行封装到context中,并使用context进行调用。就是这么简单~

CATALOG
  1. 1. 前言
  2. 2. 正文
    1. 2.1. 概念
  3. 3. 实现
    1. 3.1. 优缺点
  4. 4. 总结