Java设计模式—策略模式

1、介绍

  策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

2、 类图

3、角色划分

环境(Context)角色:持有一个Strategy的引用。

抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

4、代码示例

抽象策略类 Strategy.java

1
2
3
4
5
6
7
8
9
public interface Strategy {

/**
* 策略方法
*
* @param os
*/
void strategy(String os);
}

具体策略类(实现策略接口,提供具体算法)

ConcreteStrategyA.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class ConcreteStrategyA implements Strategy {

/**
* 策略方法实现 A
*
* @param os
*/
@Override
public void strategy(String os) {

// 具体的业务方法

}

}

ConcreteStrategyB.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ConcreteStrategyB implements Strategy {

/**
* 策略方法实现 B
*
* @param os
*/
@Override
public void strategy(String os) {

// 具体的业务方法

}
}

Context.java 持有具体策略类的实例,负责调用具体算法

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

// 策略的引用
private Strategy strategy;

public Context(Strategy strategy) {
this.strategy = strategy;
}


/**
* 策略方法
*/
public void action(String os) {
strategy.strategy(os);
}

}

测试类

1
2
3
4
5
6
7
8
9
10
11
12
public class TestStrategyPattern {

public static void main(String[] args) {
Context context = new Context(new ConcreteStrategyA());
context.action("A");

context = new Context(new ConcreteStrategyB());
context.action("B");

}

}

5、策略模式优缺点

①、 优点

  • 算法可以自由切换
  • 避免使用多重条件判断
  • 扩展性良好

②、缺点

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类