美文网首页软件自动化测试
测试工具中的设计模式实例谈 - 策略模式(Strategy)

测试工具中的设计模式实例谈 - 策略模式(Strategy)

作者: antony已经被占用 | 来源:发表于2018-08-13 13:30 被阅读4次

    设计模式第二式 - 策略模式(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种策略模式中,和迭代器模式一样属于比较简单、直观的模式。后续,我们将陆续介绍更为复杂的模式。

    相关文章

      网友评论

        本文标题:测试工具中的设计模式实例谈 - 策略模式(Strategy)

        本文链接:https://www.haomeiwen.com/subject/uoaybftx.html