Delphi模式编程之策略模式(上)

Delphi模式编程之策略模式

 

 

1.1                         模式解说

策略(Strategy)模式的用意是定义一组算法(algorithms),并将每个算法封装到具有共同接口的独立的类中,从而使它们可以相互替换。策略模式让算法变化独立于使用它的客户端。

要了解策略模式的使用动机和意义,我们得先从一个有趣的例子说起。在一个物料管理系统中,出库和入库模块是该系统的核心部分(下面我们以出库为例进行分析)。

对于一个没有面向对象编程经验的程序员,他们往往会把出库的所有逻辑都放在客户端(出库单界面),并在客户端利用条件分支语句来判断该出库单类型是领料、借料还是报损,以便选择不同的出库结算方法,如 11所示。这样一来,客户端的代码就变得复杂和难以维护。比如:需要新增调拨单类型的出库时,就要修改判断条件,重新编译和发布客户端。当情况愈来愈复杂,条件分支会愈来愈多,添加的程序代码也会愈来愈多,这样让客户端愈来愈大并难以维护,互相影响和出错的可能性增大。

 

11 基于面向过程思想设计的出库模块

如果用面向对象的思想来分析,可以把领料单、借料单、报损单看作是出库单的派生类,如 12所示。这样出库单作为单据基类提供单据的共同接口,而利用继承的办法在子类里实现不同的出库行为。这实际上利用了面向对象里的一个重要概念:多态。

但是这样的设计还有美中不足的地方,这就是环境和行为紧密耦合在一起。也就是说,单据和具体出库的算法紧密耦合在一起。强耦合使得两者不能独立演化,限制了重用性和扩展性。

13是利用策略模式重新设计的出库模块。出库单据对象通过一个出库操作对象(即策略模式中的Context)来引用出库策略对象。各种具体的出库策略则由出库策略类的派生类实现。出库单据可以由出库操作和单据样式分别提供出库结算方法和单据显示界面。这样,策略模式就把出库的行为从出库单据的环境中独立出来,出库算法的增减、修改都不会影响到环境和客户端。

12基于面向对象思想设计的出库模块

13基于设计模式思想设计的出库模块

策略模式的优势在于算法和环境的分离,两者可以独立演化。为了更好地说明算法和环境分离的好处,我们不妨看一下 14的设计。在这个设计中,已经没有出库和入库模块的概念,因为我将所有出/入库单据抽象出来,在运行期动态组合单据的界面和行为。通过出/入库操作类,可以维护、查询、配置不同的行为类。抽象出的出/入库行为以策略类的方式封装了其对应的算法,以便完成不同类型的出入库单据的操作。这就显而易见地提高了系统的重用性和可扩展性,减低维护的难度。

14 策略模式的优势在于算法和环境的分离,两者可以独立演化

由此可见,策略模式适用于以下情形:

·           当许多相关的类之间的差异只在于其行为时。策略模式可以动态地让一个对象在许多行为中选择一种行为。

·           当实现一个目的有多种可选算法时,比如:你出于不同的利弊权衡考虑定义的那些算法(即相当于应用不同的策略)。这些具体的算法可以封装成抽象算法类的派生类,并享用该抽象算法类的统一接口。通过多态性,客户端只要持有一个抽象算法类的对象,就可以选用任何一个具体的算法。

·           当一个算法使用的数据不可以让客户端得知时。使用策略模式可以避免暴露复杂的与算法相关的数据结构。其实客户端也没有必要知道这些与算法相关的知识和数据。

·           当一个类定义有很多行为,且用多个条件语句来判断选择这些行为时。策略模式可以把这些行为转移到对应的具体策略类中,从而避免了难以维护的多重条件选择,体现了面向对象的编程思想。

1.2                         结构与用法

策略模式的结构如 15所示,它包括了以下参与者:

·           抽象策略(TStrategy)——为所有支持的算法声明一个共同的接口。TContext使用这个接口调用由TConcreteStrategy定义和封装的算法。

·           具体策略(TConcreteStrategy)——封装了具体算法或行为。实现TStrategy接口。

·           上下文(TContext)——持有一个到TStrategy的引用。调用TStrategy接口,动态配置具体算法或行为。

15策略模式的结构

在策略模式中,通过TStrategyTContext的交互实现所选择的算法。当算法被调用时, TContext可以将该算法所需要的所有数据都传递给该TStrategy。或者,TContext可以将自身作为一个参数传递给TStrategy操作。

TContext将客户端请求转发给它的TStrategy时,客户通常创建并传递一个TConcreteStrategy对象给该TContext;这样, 客户端仅与TContext交互。通常有一系列的TConcreteStrategy类可供客户端从中选择。

 

 

 -------------------------------------------------------------------------------------------

更多相关文章和示例程序源代码可以到作者网站下载: http://www.liu-yi.net

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

Delphi 模式编程》经过多年的酝酿和一年多的艰难写作终于完稿了。这本书最初仅仅是我本人学习模式的一个私人笔记,所以使用《Thinking in Patterns with Delphi》的英文名称可能更为准确。 本书第一部分“模式编程原理”,阐述了模式的概念,深入讨论了Delphi模式编程机制和模式编程法则;后面各部分则分别围绕23 个经典的设计模式进行解说,介绍其结构和用法,并给出模式编程的实践范例。 对于有编程经验的Delphi 程序员来说,阅读这本书并不困难。书中的例子他们大都很熟悉,只不过以前可能没有用模式编程的方式实现过。在比较不同的思考问题的方法和解决问题的途径后,我相信他们会有“于我心有戚戚焉”的感受。在理解模式的基础,如果进一步深入阅读本书的“Delphi模式编程机制”和“模式编程法则”两章将会有更高层次的收获。 诚恳地讲,这部书并不适合初学者阅读,甚至不适合没有建立面向对象概念和不了解面向对象编程的读者阅读。不过初学者可以先积累一些编程实践经验,并通过阅读本人的《Delphi 面向对象编程思想》来建立面向对象的思维方式。然后,尝试阅读本书的一些较为简单和常用的模式,例如:Factory Method 模式、Strategy 模式等。 本书的结构是松散的,各个模式相对独立,自成一章。强烈建议读者在阅读时,先跳过那些你们认为难读的章节和暂时用不模式。我并不是说这些章节不重要,而是说最后再回过头来阅读这些章节效果会更好! 当然也可以将此书作为一本模式编程参考手册,便于读者在项目开发中遇到实际的设计问题时直接查阅相关章节,而不需阅读全书。 本书的光盘中包含了书中绝大多数示例程序的源代码,并在Delphi7 调试通过。
作者: 刘艺 丛书名: Borland/Inprise核心技术丛书 出版社:机械工业出版社 ISBN:7111149491 架时间:2004-9-11 出版日期:2004 年9月 开本:16开 页码:509 版次:1-1 内容简介 《delphi模式编程》是一本delphi程序员的模式入门和实践读物。该书用最通俗易懂的语言和最明白实用的范例解说深奥睿智经典著作《设计模式》。该书不但围绕23个经典的设计模式进行解说,介绍其结构和用法,并给出模式编程的实践范例;还进一步阐述了模式的概念,深入讨论了delphi模式编程机制和模式编程法则。该书适合有编程经验的delphi程序员,以及有志从事系统设计和架构,不断挑战自我发展空间的软件开发人员阅读。该书还可以作为研究生和高级开发人员的培训教材。当然也可以将此书作为一本模式编程参考手册,便于读者在项目开发中遇到实际的设计问题时直接查阅。本书的其它相关资源和技术支持,可以在作者的个人网"http://www.liu-yi.net"获得。用最通俗易懂的语言和最明白实用的范例解说最深奥睿智的设计模式。一本真正属于delphi程序员的模式入门和实践读物,通俗易懂 通过贴近实际生活的比喻,形象解说模式,文笔生动,思路清晰。结合经验教训引导读者建立模式编程的思维,循循善诱,点石成金。全面周到所有的模式都悉心讲解;现成的模式代码模板便于套用;全部示例程序提供uml设计图和详尽注释;问题讨论,尽释疑难。好学实用所有的模式编程范例都精心设计,不但可以运行,还有源码剖析。大量应用来自开发实践,值得借鉴参考。 目录 第一部分 模式编程原理 . 第1章 模式概述 1.1 模式的概念 1.1.1 什么是模式 1.1.2 模式可以做什么 1.2 模式与架构 1.2.1 什么是架构 1.2.2 架构和模式的关系 1.3 从面向对象编程模式编程 1.3.1 关于封装的哲学 1.3.2 利用继承实现变化的封装和简单的复用 1.3.3 借助模式封装多个变化 1.3.4 模式帮助我们解决问题 第2章 delphi模式编程机制 2.1 对象模型机制 2.1.1 对象模型 2.1.2 对象建模和模式编程 2.1.3 对象关系与复用 2.2 动态绑定机制 2.2.1 方法绑定 2.2.2 虚方法 2.2.3 多态 2.3 类型转换机制 2.3.1 类型 2.3.2 向转型 2.3.3 向下转型 2.4 接口抽象机制 2.4.1 接口的概念 2.4.2 抽象类 2.4.3 对象接口 2.4.4 抽象类与对象接口的比较 2.4.5 针对接口而不是针对实现编程 第3章 模式编程法则 3.1 开闭法则(ocp) 3.2 liskov代换法则(lsp) 3.3 依赖反转法则(dip) 3.4 接口隔离法则(isp) 3.5 单一职责法则(srp) 第二部分 创建型模式编程 第4章 工厂方法模式(factory method) 4.1 模式解说 4.2 结构和用法 4.2.1 模式结构 4.2.2 代码模板 4.2.3 问题讨论 4.3 范例与实践 4.3.1 利用工厂方法模式设计可动态切换持久层机制的应用 4.3.2 范例小结 第5章 抽象工厂模式(abstract factory) 5.1 模式解说 5.2 结构和用法 5.2.1 模式结构 5.2.2 代码模板 5.3 范例与实践 5.3.1 用抽象工厂模式动态构造界面风格 5.3.2 websnap的web module架构与抽象工厂模式 5.3.3 范例小结 第6章 建造者模式(builder) 6.1 模式解说 6.2 结构和用法 6.2.1 模式结构 6.2.2 代码模板 6.3 范例与实践 6.3.1 一个数据集对象产品的建造者模式 6.3.2 范例小结 第7章 单例模式(singleton) 7.1 模式解说 7.2 结构和用法 7.2.1 模式结构 7.2.2 代码模板 7.2.3 delphi对象构造机制与单例模式 7.3 范例与实践 7.3.1 一个共享数据库连接的单例模式范例 7.3.2 范例小结 第8章 原型模式(prototype) 8.1 模式解说 8.2 结构和用法 8.2.1 模式结构 8.2.2 代码模板 8.3 范例与实践 8.3.1 delphi对象的克隆 8.3.2 用原型模式克隆字体 8.3.3 delphi对象流化与原型模式 8.3.4 范例小结 第9章 适配器模式(adapter) 9.1 模式解说 9.2 结构和用法 9.2.1 类的适配器模式 9.2.2 对象的适配器模式 9.2.3 问题讨论 9.3 范例与实践 9.3.1 用适配器模式包装第三方api的范例 9.3.2 范例小结 第10章 桥接模式(bridge) 10.1 模式解说 10.2 结构和用法 10.2.1 模式结构 10.2.2 代码模板 10.3 范例与实践 10.3.1 使用桥接模式改进数据持久层的健壮性 10.3.2 基于桥接模式的一个数据视图程序 .. 10.3.3 范例小结 第11章 合成模式(composite) 2 11.1 模式解说 11.2 结构和用法 11.2.1 模式结构 11.2.2 代码模板 11.2.3 问题讨论 11.3 范例与实践 11.3.1 合成模式在组织机构管理系统中的应用 11.3.2 范例小结 第12章 装饰者模式decorator) 12.1 模式解说 12.2 结构和用法 12.2.1 模式结构 12.2.2 代码模板 12.2.3 问题讨论 12.3 范例与实践 12.3.1 装饰者模式在图片观赏器中的应用 12.3.2 范例小结 第13章 门面模式(facade) 13.1 模式解说 13.2 结构和用法 13.2.1 模式结构 13.2.2 代码模板 13.2.3 问题讨论 13.3 范例与实践 13.3.1 门面模式和分布式系统的设计优化 13.3.2 用门面模式设计的com+银行转账系统 13.3.3 com+银行转账系统实现代码剖析 13.3.4 范例小结 第14章 享元模式(flyweight) 14.1 模式解说 14.2 结构和用法 14.2.1 模式结构 14.2.2 代码模板 14.2.3 问题讨论 14.3 范例与实践 14.3.1 对象池技术和享元模式 14.3.2 享元模式在任务调度系统中的应用 14.3.3 范例小结 第15章 代理模式(proxy) 15.1 模式解说 15.2 结构和用法 15.2.1 模式结构 15.2.2 代码模板 15.3 范例与实践 15.3.1 代理模式数据库程序中的应用 15.3.2 范例小结 第四部分 行为型模式编程 第16章 责任链模式(chain of responsibility) 16.1 模式解说 16.2 结构和用法 16.2.1 模式结构 16.2.2 代码模板 16.2.3 问题讨论 16.3 范例与实践 16.3.1 责任链模式在项目审批系统中的应用 16.3.2 责任链模式对代码的重构 16.3.3 范例小结 第17章 命令模式(command) 17.1 模式解说 17.2 结构和用法 17.2.1 模式结构 17.2.2 代码模板 17.2.3 问题讨论 17.3 范例与实践 17.3.1 delphi的action编程机制与命令模式 17.3.2 一个兼有撤销重做功能的文本编辑器范例 17.3.3 范例小结 第18章 解释器模式(interpreter) 18.1 模式解说 18.2 结构与用法 18.2.1 模式结构 18.2.2 代码模板 18.3 范例与实践 18.3.1 一个罗马数字到阿拉伯数字的转换器程序 18.3.2 范例小结 第19章 迭代子模式(iterator) 19.1 模式解说 19.2 结构与用法 19.2.1 模式结构 19.2.2 代码模板 19.2.3 问题讨论 19.3 范例与实践 19.3.1 一个基于迭代子模式的图片播放器 19.3.2 范例小结 第20章 中介者模式(mediator) 20.1 模式解说 20.2 结构与用法 20.2.1 模式结构 20.2.2 代码模板 20.2.3 问题讨论 20.3 范例与实践 20.3.1 中介者模式在聊天室系统中的应用 20.3.2 范例小结 第21章 备忘录模式(memento) 21.1 模式解说 21.2 结构与用法 21.2.1 模式结构 21.2.2 代码模板 21.2.3 问题讨论 21.3 范例与实践 21.3.1 备忘录模式在地理信息系统中的应用 21.3.2 范例小结 第22章 观察者模式(observer) 22.1 模式解说 22.2 结构与用法 22.2.1 模式结构 22.2.2 代码模板 22.2.3 问题讨论 22.3 范例与实践 22.3.1 观察者模式在界面色彩主题中的应用 22.3.2 范例小结 第23章 状态模式(state) 23.1 模式解说 23.2 结构与用法 23.2.1 模式结构 23.2.2 代码模板 23.2.3 问题讨论 23.3 范例与实践 23.3.1 状态模式在信用卡账户管理系统中的应用 23.3.2 范例小结 第24章 策略模式(strategy) 24.1 模式解说 24.2 结构与用法 24.2.1 模式结构 24.2.2 代码模板 24.2.3 问题讨论 24.3 范例与实践 24.3.1 策略模式在酒店管理系统中的应用 24.3.2 范例小结 第25章 模板方法模式(template method) 25.1 模式解说 25.2 结构与用法 25.2.1 模式结构 25.2.2 代码模板 25.2.3 问题讨论 25.3 范例与实践 25.3.1 模板方法在离线数据库系统中的应用 25.3.2 范例小结 第26章 访问者模式(visitor) 26.1 模式解说 26.2 结构与用法 26.2.1 模式结构 26.2.2 代码模板 26.2.3 问题讨论 26.3 范例与实践 26.3.1 访问者模式在薪酬福利管理中的应用 26.3.2 范例小结
©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值