资源描述:
《每周学点设计模式(2)——策略模式(下)-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、每周学点设计模式(2)——策略模式(下)-Java开发Java经验技巧每周学点设计模式(2)——策略模式(下)本文作者:ImportNcw-唐尤华未经许可,禁止转载!在策略模式(上)屮,留下了一些练习。通过这些练习可以了解JavaAPRSWT如何实际应用策略模式。下篇将给出这些练习的参考分析,欢迎大家一起讨论。#1.请说明策略模式符合哪些面向对象设计原则?让我们再回顾一卜•策略模式:•?策略模式中,通过接口(interface)实现了业务与具体实现的隔离。所以,策略模式符合“面向接口,而不是面向实现”的编程原则。•在实现貝体的策略(算法)吋,通过实现接口可以
2、方便地增加多个具体实现。所以,策略模式符合“开放封闭原则,对扩展开放,对修改封闭覽•业务代码(Context)只依赖规则接口(Strategy),不依赖具体实现。所以,策略模式符合“依赖倒置原则,高层(业务模块)不依赖底层模块(具体算法),只依赖抽象接口#2.请说明策略模式有什么优点和缺点。•优点:遵循面向对彖设计原则,降低设计耦合、便于扩展。•缺点:当实现算法较多时,会增加需要维护的类的数量。可以使用工厂方法來解决。#3.请用说明下列JavaAPI设计中是如何使用策略模式的?Java实例1.集合、数组排序(sort)实际编程中最常见的莫过于排序了。在Jav
3、aAPI中,Collections,sort是常用方法之一(JDK7代码):publicstaticvoidsort(List〈T>list,Comparatorc){Object[]a二1ist.toArray();Arrays,sort(a,(Comparator)c);Listiteratori=list.listiterator();for(intj=0;jvoidsort(T[]a,Comp
4、arator^?superT>c){if(LegacyMergeSort.userRequested)lcgac}41crgcSort(3,c);elseTimSort.sort(a,c);}/**Toberemovedinafuturerelease.*/privatestaticvoidlegacyMergeSort(T[]a,Comparatorc){T[]aux二a.clone();if(c二二null)mergcSort(aux,a,0,a.1cngth,0);elsemergeSort(aux,a,0,a.length,0
5、,c);}这里是如何运用策略模式的呢?•Context:是实际调用排序的代码,即Collections的类。可以看到,默认使用了TimSort进行排序,排序的算法与对象的compare具体实现无关。•Strategy:即具体的对象比较接口,Comparator□•ConcreteStrategy:具体的比较算法,通过Compnnitor实现。例如实现人小写敏感、大小写不敏感或任意规则的比对。Java实例2.正则表达式正则表达式也是日常开发常用的工具,让我们来看看Pattern,Matcher是如何运用策略模式的。下面以一段简单的正则调用代码为例:Patter
6、npattern=Pattern,compile(z,ab,z,Pattern.CASE_1NSENS1T1VE);Matchermatcher二pattern,matcher(/zABcabdAb/z);//usingMatcherfind(),group(),start()andend()methodswhile(matcher,find()){System,out.printIn(z,Foundthetext+matcher,group()+〃〃startingat〃+matcher,start()+〃indexandendingatindex〃+m
7、atcher.end());可以看到,上而的示例屮对字符串”ABcabdAb"用”ab”进行大小写不敏感匹配。•Context:是实际调用正则表达式匹配的代码,即Matcher类。町以看至【J,Matcher.find()实际执行了正则匹配并返回匹配结果。•Strategy:即匹配的接口。这里并没有使用Java的interface,而是通过Pattem构造函数进行了传递,只要填入了Pattem(String,int),正则表达式和匹配参数,即实现了匹配需要的接口。•ConcreteStrategy:具休的匹配算法,pattern字符串需要符合Javail*则
8、表达式的语法规则,而匹配的参数flags由Patte