设计模式笔记 - 策略模式(Strategy Pattern)

模式定义

策略模式(Strategy Pattern)定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法独立于使用算法的客户而变化。


模式结构

  • Context:环境类
  • Strategy:抽象策略类
  • ConcreteStrategy:具体策略类

img


模式案例

不同的鸭子或许会有不同的飞行模式,又或许两种不同的鸭子有相似的飞行模式。对此我们可以使用策略模式来设计不同的飞行模式,即可提高代码的复用,也易于飞行模式的扩展。

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
44
45
46
47
48
49
50
// Context-环境类 -> 鸭子
public class Duck {
FlyBehavior flyBehavior;

public void performFly() {
this.flyBehavior.fly();
}

public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
}

// Strategy-抽象策略类 -> 飞行行为
public interface FlyBehavior {
public void fly();
}

// ConcreteStrategy-具体策略类
// 算法1
public class FlyWithWings implements FlyBehavior {

@Override
public void fly() {
System.out.println("I'm flying with wings");
}
}

// 算法2
public class FlyNoWay implements FlyBehavior {

@Override
public void fly() {
System.out.println("I can't fly");
}
}

// test-测试类
public class DuckTest {

public static void main(String[] args) {
Duck duck = new Duck();
duck.setFlyBehavior(new FlyWithWings());
// "I'm flying with wings"
duck.performFly();
duck.setFlyBehavior(new FlyNoWay());
// "I can't fly"
duck.performFly();
}
}

模式分析

优点:

  • 策略模式提供了“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。
  • 策略模式提供了管理相关的算法则的办法。
  • 策略模式提供了可以利用组合替换继承的办法。
  • 策略模式可以避免使用多重条件(if..else..)语句。

缺点:

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。即在设计接口时,必须适当的暴露出全部的接口。
  • 策略模式将造成产生很多策略类,但相对于未使用设计模式管理算法族来说,比较容易管理。


参考资料:

[1] http://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/strategy.html

[2] http://blog.csdn.net/hguisu/article/details/7558249/