1、导学
策略模式用于算法的自由切换和扩展,它是使用较为广泛的设计模式之一。
策略模式实现了算法定义和算法使用的分离,它通过继承和多态的机制实现对算法的使用和管理,是一种简单易用的设计模式。
完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该任务。
在很多情况下,实现某个目标的路径不止一条,例如人们外出旅行时,可以选择多种不同的出行方式(旅行出行策略),如可以骑自行车、坐汽车、坐火车、坐飞机,可以根据环境的不同选择不同的策略。。
2、策略模式结构
1. 模式的结构
策略模式的主要角色如下。
- 抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
- 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
- 环境(Context)类:持有一个策略类的引用,最终给客户端调用。
其结构图如图 1 所示。
2. 模式的实现
策略模式的实现代码如下:
package strategy; public class StrategyPattern { public static void main(String[] args) { Context c=new Context(); Strategy s=new ConcreteStrategyA(); c.setStrategy(s); c.strategyMethod(); System.out.println("-----------------"); s=new ConcreteStrategyB(); c.setStrategy(s); c.strategyMethod(); } } //抽象策略类 interface Strategy { public void strategyMethod(); //策略方法 } //具体策略类A class ConcreteStrategyA implements Strategy { public void strategyMethod() { System.out.println("具体策略A的策略方法被访问!"); } } //具体策略类B class ConcreteStrategyB implements Strategy { public void strategyMethod() { System.out.println("具体策略B的策略方法被访问!"); } } //环境类 class Context { private Strategy strategy; public Strategy getStrategy() { return strategy; } public void setStrategy(Strategy strategy) { this.strategy=strategy; } public void strategyMethod() { strategy.strategyMethod(); } }
策略模式的应用实例
策略模式实例:之排序策略:
某系统提供了一个用于对数组数据进行操作的类,该类封装了对数组的常见的操作,如对数组进行排序等。
多种排序算法供用户选择: 冒泡排序,或者选择插入排序,或者选择排序,可以更换排序算法,也能灵活地增加新的排序算法。
实例类图:
实例代码:
1)抽象策略类Sort (抽象排序类)
public interface Sort{
public abstract int[] sort(int arr[]);
}
2) 冒泡排序-具体策略类BubbleSort
public class BubbleSort implements Sort{
public int[] sort (int arr[]){
System.ouut.println("冒泡排序");
}
}
3) 具体策略类 - SelectionSort 选择排序
public class SelectionSort implements Sort{
public int[] sort (int arr[]){
System.ouut.println("选择排序");
}
}
4) 具体策略类 - InsertionSort 插入排序
public class SelectionSort implements Sort{
public int[] sort (int arr[]){
System.ouut.println("插入排序");
}
}
5) 环境类
public class ArrayHandler {
private Sort sortObj;
public int[] sort(int arr[]){
sortObj.sort(arr);
return arr;
}
public void setSortObj(Sort sortObj){
this.sortObj = sortObj;
}
}