策略模式
策略模式是准备一组算法,并将这组算法封装到一系列的策略类里面,作为一个抽象策略类的子类。策略模式的重心不是如何实现算法,而是如何组织这些算法,从而让程序结构更加灵活,具有更好的维护性和扩展性,现在我们来分析其基本结构和实现方法。
1. 模式的结构
策略模式的主要角色如下。
- 抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
- 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
- 环境(Context)类:持有一个策略类的引用,最终给客户端调用。
 
其结构图如图 1 所示。

图1 策略模式的结构图
2. 模式的实现
策略模式的实现代码如下:
// 抽象策略类
public interface Strategy {
public void strategyMethod(); //策略方法
}
package com.example.strategy;
// 具体策略类
public class ConcreteStrategyA implements Strategy{
@Override
public void strategyMethod() {
System.out.println("具体策略A的策略方法被访问!");
}
}
package com.example.strategy;
// 具体策略类
public class ConcreteStrategyB implements Strategy{
@Override
public void strategyMethod() {
System.out.println("具体策略B 的策略方法被访问!");
}
}
package com.example.strategy;
// 环境类
public class Context {
private Strategy strategy;
public Strategy getStrategy()
{
return strategy;
}
public void setStrategy(Strategy strategy)
{
this.strategy=strategy;
}
public void strategyMethod()
{
strategy.strategyMethod();
}
}
package com.example.strategy;
// 策略模式客户端调用
public class StrategyPattern {
public static void main(String[] args) {
Context context = new Context();
Strategy s = new ConcreteStrategyA();
context.setStrategy(s);
context.strategyMethod();
System.out.println("===================");
ConcreteStrategyB concreteStrategyB = new ConcreteStrategyB();
context.setStrategy(concreteStrategyB);
concreteStrategyB.strategyMethod();
}
}
程序运行结果如下:
具体策略A的策略方法被访问! ----------------- 具体策略B的策略方法被访问!
策略模式的扩展
在一个使用策略模式的系统中,当存在的策略很多时,客户端管理所有策略算法将变得很复杂,如果在环境类中使用策略工厂模式来管理这些策略类将大大减少客户端的工作复杂度,其结构图如图 5 所示。

图5 策略工厂模式的结构图
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号