设计模式第二式 - 策略模式(Strategy)
从群众中来,到群众中去。
摘要:
本文将继续以OPENCSV为案例,介绍迭代器模式(Iterator)的实现CSVIterator,并以Iterable接口的实现CSVReader为例,简要讨论了Iterator和Iterable这两个接口的差异。
1. 策略模式模式简介
策略模式定义了一组算法,将每个算法都封装起来,并使它们之间可以互换。这个模式让法算法的变化独立于客户端的调用。
c2153f1becfe6dcf675388318e5b3722.png其中,
- Strategy 策略接口或者(抽象策略类),定义策略执行接口
- ConcreteStrategy 具体策略类
- Context 上下文类,持有具体策略类的实例,并负责调用相关的算法
2. 来自OpenCsv的策略案例-MappingStrategy
在OPENCSV中的,需要解决CSV文件和JAVA对象之间互相转换的问题,其中CSV文件数据的解析是一个基础问题。而数据文件可能有各种类型,譬如
-
普通数据文件,指第一行是表头,第二行开始是数据的文件。
-
纯数据文件,指没有表头,全是数据的文件。
-
表头需转义的数据文件,由于表头可能来是程序自动化生成,需要额外指定表头名称来和JAVA对象的属性之间进行匹配。
从上面的介绍中,我们可以知道譬如表头内容,数据条数的计算等,在不同类型的文件中,需要采用不同的方式来解析和处理。OPENCSV的开发者当然没有采用IF-THEN-ELSE这种方式,而是采用了策略模式。如下图所示,
6b6a5ec1665cfd27fbd275dd30c4849d.jpg
Opencsv 定义了MappingStrategy这个接口,并有若干个类实现了这个接口,来完成不同的匹配任务。我们再来看一下MappingStrategy这类接口的定义
bf96af41407aeccfe66469ea476dc5ca.png可以看到,这个接口定义了一些处理表头(captureheader)、转换成对象(createBean)等方法,并交由不同的策略类去实现具体的行为。
而在具体的使用中,对于客户端的代码则无需进行改动。
举个例子。。。。
3. 策略模式小结
从上述案例中,我们可以看到,策略模式很好地支持了OPENCSV对于不同类型的数据文件表头部分的解析工作。当然,这种模式下,客户端必须知道具体有哪些策略类,并自行显示决定使用哪一个策略类。实际中,如果需要进一步解耦合代码,可以通过结合工厂模式结合,避免在客户端中new 策略的实例,进而可以有效避免该问题。
另一方面,读者可以看到,所谓的策略模式其实只是定义了一个接口,“面向接口编程”而已。在23种策略模式中,和迭代器模式一样属于比较简单、直观的模式。后续,我们将陆续介绍更为复杂的模式。
网友评论