设计模式(10):策略模式 策略模式

策略模式

定义

定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)

简单的说,就是让类根据传入的不同的具体策略(实现了策略接口,策略接口包含一个自己的算法)来调用不同的算法。同时让一个Context类来管理策略。

示例与代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
java复制代码//定义策略接口,声明对应的算法
interface Strategy {
void algorithm();
}

//实现不同的策略
class FirstStrategy {
@override
public void algorithm() {
...
}
}

class SecondStrategy {
@override
public void algorithm() {
...
}
}

//定义Context类来管理Strategy
class Context {
private Strategy strategy;
public void changeStrategy(Strategy strategy) {
this.strategy = strategy;
}

public void algorithm() {
Strategy.algorithm();
}
}

//使用
public class Main {
public static void main(String[] args) {
Context work = new Context();
work.changeStrategy(new FirstStrategy());
work.algorithm();

work.changStrategy(new SecondStrategy());
work.algorithm();
}
}

在Java开发中,ThreadPool用到了这个设计模式。最后一个参数RejectedExecutionHandler是一个接口,相当于就是我们这里的抽象策略,而使用的时候则要传入一个具体的拒绝策略。

1
2
3
4
5
6
7
java复制代码public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)

策略模式vs状态模式

从代码来看,基本和状态模式一模一样,其实这两种设计模式的总体思想都是一样的,都是为了去耦合。但是这两者对应不同的使用场景。具体来说,不同的状态可能不只是导致仅仅一个调用方法的改变,还有可能会改变一系列不同的调用方法,同时Context的其他成员变量值也有可能会变化,而且状态有可能自发的改变(有限状态机);而策略模式则更具体一点,不同的策略仅仅是调用不同的算法(algorithm),同时策略也不能自行变化,一般必须根据不同的场景使用不同的策略。

总结

相比于状态模式,策略模式更具有一般性一些,在实践中,可以用策略模式来封装几乎任何类型的规则,只要在分析过程中听到需要在不同实践应用不同的业务规则,就可以考虑使用策略模式处理,在这点上策略模式是包含状态模式的功能的,策略模式是一个重要的设计模式。

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%