快速引入
在做项目中经常会遇到,实现某一个功能有多种算法或者策略,我们可以根据应用场景的不同选择不同的算法或者策略来完成该功能。比如我对一个数组排序,有时候想用冒泡排,有时候想用快排排序,那么这个排序功能就有多种算法和策略。如果没学习此设计模式之前我们可能会这么实现,把所有的算法写进一个类中,然后在类中判断使用什么方法,例如使用if else 或者其他条件判断语句来进行选择,但是这种方法会让类变的臃肿,耦合度太高难以维护,而且当需要增加一种新方法时又得改类,这样不遵守开闭原则。
实现
那么如果我们使用策略模式这就大大不同了,现在让我们用策略模式来设计下上述代码
//这是sort抽象类
public interface class Sort {
public int[] sortResult(int[] arry);
}
具体的排序方法,这里只列举两种,其他类似
//快排
public class QuickSort implements Sort{
@Override
public int[] sortResult(int[] arry){
//在这里用快排进行排序后返回排序后arry
return arry;
}
}
//XXX排序
public class XXXSort implements Sort{
@Override
public int[] sortResult(int[] arry){
//在这里用xxx排序方法进行排序后返回排序后arry
return arry;
}
}
再定义一个总类,再次封装下,这个类用来设置具体的算法实现类,并且提供调用接口
public class SortWay{
Sort sort;
public setSortWay(Sort sort){
this.sort=sort;
}
public int[] sortResult(int[] arry){
return sort.sortResult(arry);
}
}
具体使用
SortWay mSort = new SortWay();
// 设置具体算法类。
mSort.setSortWay(new QuickSort());
//调用方法获取排序结果,arry为待排序数组
mSort.sortResult(arry);
总结
其实我们可以看到用了策略模式以后很明显的类变多了,也很明显的类结构清晰明了,职责单一,分工明确了。这就其实就是这种模式的优缺点,具体怎么使用还是得看具体情况来。