admin 管理员组文章数量: 887021
2023年12月21日发(作者:offsetwidth的属性)
龙源期刊网
泛型化的策略模式设计
作者:朱仙芝
来源:《现代电子技术》2013年第17期
摘 要: 按照GoF的“为变化进行设计”的原则,以匹配度算法的选择问题为实例,将泛型编程技术应用于策略模式设计中。首先通过对低层设计的重构,从诸多匹配度算法中抽取共有的部分,将其泛化为简单的函数对象,并用这些函数对象作为策略模式中的具体策略;再利用泛型技术构建抽象策略和上下文引用关系。这样的设计很好地解决了策略模式设计中的代码重用和泛化问题。
关键词: 策略模式; 重构; 泛型程序设计; 匹配度算法
中图分类号: TN711⁃34 文献标识码: A 文章编号: 1004⁃373X(2013)17⁃0159⁃04
0 引 言
面向对象已经成为软件设计与开发的主流技术,它有很多优点,同时也有自身难以克服的内在弱点。例如,直接用类(Class)作为问题域中的基本抽象和程序设计单位,将概念映射成对象类的方法在本质上是非常受限和不足的,这种抽象方法常常导致过于约束的系统设计和代码实现,并且在实际应用中缺乏通用性和运行效率[1]。许多基于OOP的通用数据结构和算法库的设计及实现都带有诸多缺陷和不足,适应不了用户遇到的各式各样的数据类型(尤其是原始类型和导出类型),并且效率难以提高。
设计模式是面向对象领域为实现高级代码复用而总结出来的各种方案,设计模式的目标是使对在特定环境中良好工作的设计能在相似的环境中被再一次应用。然而,设计模式同样无法摆脱面向对象固有的顽疾[2]。
重构是一种保持行为的转换。重构过程包括去除重复、简化复杂逻辑和澄清模糊代码。重构的目的是使设计模式的实现更具有灵活性、有效性和可维护性。设计模式是目的,重构则是手段;设计模式是重构的结果,并为重构提供了目标[3]。然而,重构改进设计模式的技术在设计模式泛化方面仍然存在问题[4]。
正是针对上述不足,泛型程序设计(Generic Programming,GP)应运而生。GP是一种以需求为中心的程序设计范式,作为面向对象程序设计技术的补充和扩展,能够克服先前程序设计中的所有主要困难,实现真正的通用和高效的数据结构和算法库[5⁃6]。然而,国内目前对泛型程序设计的研究和应用主要是通过一些泛型程序库(Standard Template Library,STL)的译著来引进和介绍泛型程序设计的基本思想和方法[2]。
本文的研究目的是探讨如何将设计模式、重构技术、泛型程序设计技术等有机地结合起来,使设计模式更加泛化。在本文的实践中将策略模式、函数作为对象和泛型程序设计及重构
龙源期刊网
的思想结合起来,以模糊识别系统中的多种匹配度算法的选择为实例,做到了为变化进行模式设计的目的。通过对低层设计的转换,利用重构改进策略模式,利用Java SE5提出的泛型方法设计策略模式,使策略模式更加泛化。实现在运行时根据客户要求,动态组合生成匹配度算法。不但使算法的选择和算法的实现相分离,去除了大量的重复代码,澄清了代码的意图,而且也容易增加新的算法,获得了更好的灵活性。
1 将匹配度算法重构为策略模式
在设计一个模糊识别系统时,通常有多种匹配度算法供选择。例如:贴近度算法、语义距离算法(如:海明距离、欧几里德距离、切比雪夫距离、明可夫斯基距离)和相似度算法(如:最大最小法、算术平均法、几何平均法、指数法、相关系数法)等。当客户发出需要某种算法的请求时,系统可以根据客户发出的请求或被处理的数据对算法做出选择。解决这个问题的设计模式可以使用图1所示的策略模式[7⁃8]。在图1中的每一个具体策略(Concrete
Strategy)就是一个对象类的方法。然而,就匹配度问题而言,可以看到,如果直接使用策略模式,则封装了相关算法的每一个具体策略角色中将出现大量重复代码,使系统非常臃肿。
为了降低对系统的整体影响,减少子系统之间的相互依赖关系,使得复用更加灵活,GoF为变化进行设计的原则[8]中有:“针对接口编程,而不是针对实现编程”;“优先使用对象组合,而不是类继承”;“考虑设计中哪些是可变的,进行封装”。使用这种设计原则不但可以减少重复代码,而且在处理新的需要时,不会使设计和实现的开销严重增大。从而实现强内聚,松耦合设计目的。
2 匹配度算法的泛型策略模式设计
策略模式属于对象的行为模式,其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换,算法的增加不会改变未增加算法前的客户端的调用代码。策略模式设计包括定义抽象策略角色、环境角色和具体策略角色三个步骤。非泛型的策略模式的设计的主要问题是对封装的算法进行限制,使得抽象策略角色、环境角色的通用性、灵活性和扩展性都比较差。为解决这些不足,可将策略模式改进为泛型策略模式。选择匹配度算法的泛型策略模式设计如下:
2.1 定义具体策略角色
2.2 定义具有泛型的抽象策略角色
2.3 定义具有泛型的环境角色
环境角色(Context)通过泛型抽象策略角色接口来调用具体策略类。Context通过类型为Strategy的引用使用特定的Concrete Strategy。设计Context角色是组合对象,针对接口编程的过程,是整个设计的核心。Context作为上下文类,如图1所示,对上与客户端交互,对下与
版权声明:本文标题:泛型化的策略模式设计 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1703164315h440554.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论