java设计模式(三)策略模式(行为型):依稀记得我们本科时学过各种排序算法,比如冒泡排序,二分排序,归并排序等等。这些算法在功能上是一致的,只是其中的实现方式不同,时间复杂度和空间复杂度的差别而已。
但是当我们作为系统开发者时,需要为用户提供相同问题不同的算法的实现。这时我们可以考虑使用策略模式来解决问题。
一.策略模式理解
策略模式定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化不会影响到使用算法的客户。策略模式的变化点在于算法的具体实现不同,而封装变化点是面向对象的一种重要的思维方式。策略模式定义的这些算法完成的都是相同的工作,只是实现不同,该模式提供一致的接口访问所有的算法。
二.实践
这里我们以排序为例来说明策略模式的应用
1.定义排序接口,或者协议
//排序接口 public interface Sort(){ public void sort(); }
2,具体各种排序实现算法
//冒泡排序算法 public BubbleSort(){ public void sort(){ System.out.println("bubble sort") } } //二分排序算法 public BinarySort(){ public void sort(){ System.out.println("binary sort"); } } //归并排序算法 public MergeSort(){ public void sort(){ System.out.println("merge sort"); } }
3.客户端调用程序
public class ClientContext{ public void main(){ //调用冒泡排序 Sort bubble=new BubbleSort(); bubble.sort(); } }
这里我们将对象的创建工作直接放在了客户程序中。似乎觉得不是那么妥当,还记得我们之前讲过的设计模式创建型-工厂模式吗?我们可以将对象创建过程使用工厂模式完成。
4.程序改进之路
我们使用简单工厂来改进上面的客户端程序。
//排序算法生产工厂 SortFactory{ #定义排序枚举变量 public enum SortType{ Bubble,Binary,Merge; } #提供不同排序算法的选择接口 public Sort getSort(SortType type){ switch(type){ case Bubble:return new Bubble(); case Binary:return new Binary(); case Merge:return new Merge(); } } } //客户端程序 public class ClientContext{ public static void main(String[]args){ #调用排序 Sort customsort=SortFactory.getSort(SortType.Bubble); customsort.sort(); } }
三.总结
其实这样的程序仍然存在问题,如果程序多次调用排序类,那么我们需要不断的创建该类的对象。我们有时可以通过将排序类设计成单例来减少类的创建工作,我们需要知道设计模式的应用场景才可以灵活真正的应用好设计模式。
所以任何一个问题的解决并不是单纯使用一种设计模式来解决,所以我之前一直在强调知道这个设计模式的应用场景以及该设计模式的优缺点比你背上相应设计模式的模板代码深的许刻多。