设计模式之策略模式!

定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。

UML类图:

img

使用举例

以去公园为例,可以有很多路线方式去公园。

1
2
3
4
5
//抽象策略(Strategy)类
public interface Strategy {

void goToPark(); //去公园
}
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
//具体策略(Concrete Strategy)类
public class BySubwayStrategy implements Strategy{

@Override
public void goToPark() {
System.out.println("乘地铁去公园");
}

}

//具体策略(Concrete Strategy)类
public class ByBusStrategy implements Strategy{

@Override
public void goToPark() {
System.out.println("乘公交去公园");
}

}

//具体策略(Concrete Strategy)类
public class ByTaxiStrategy implements Strategy{

@Override
public void goToPark() {
System.out.println("打车去公园");
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//负责和具体的策略类交互,使得算法和客户端分离
public class Context {
private Strategy strategy; //当前采用的具体对象,即具体的算法对象

//支持使用构造注入
public Context(Strategy strategy){
this.strategy = strategy;
}

//也可以通过set注入
public void setStrategy(Strategy strategy){
this.strategy = strategy;
}

public void goToPark(){
this.strategy.goToPark();
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Client {

public static void main(String[] args) {
Strategy bySubway = new BySubwayStrategy();
//乘地铁
Context ctx = new Context(bySubway);
ctx.goToPark();
//乘公交
Strategy byBus = new ByBusStrategy();
ctx.setStrategy(byBus);
ctx.goToPark();
//打车
Strategy byTaxi = new ByTaxiStrategy();
ctx.setStrategy(byTaxi);
ctx.goToPark();
}
}