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

原创 2004年05月12日 18:25:00

Delphi模式编程之策略模式<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

 

1.1                         模式解说

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

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

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

 

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />CSDN_Dev_Image_2004-5-111610080.gif

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

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

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

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

CSDN_Dev_Image_2004-5-111610082.gif

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

CSDN_Dev_Image_2004-5-111610084.png

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

命令行操作组策略

1.导出组策略secedit /export /cfg gp.inf /quiet 2.删去gp.inf中不需要修改的组策略项,修改需要修改的项保存 如:更改允许远程登录用户为admin [Un...
  • yiyefangzhou24
  • yiyefangzhou24
  • 2015年12月15日 14:39
  • 2855

《JAVA与模式》之策略模式——我看过最好的一篇策略模式博文

《JAVA与模式》之策略模式(转载自http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html) 在阎宏博士的《JAV...
  • zhangliangzi
  • zhangliangzi
  • 2016年08月09日 11:30
  • 5754

Java设计模式之策略模式

本文属于23种设计模式系列。 介绍的是策略模式。
  • jason0539
  • jason0539
  • 2015年04月13日 07:20
  • 33394

【设计模式】策略模式详解

学习设计模式已经有一段时间了,前段时间一直在忙一个安卓的app,没时间更新。今天有点空,本着开源的精神,把策略模式的一些东西分享一下。...
  • H28496
  • H28496
  • 2015年06月07日 20:46
  • 1226

delphi xe7 下实现的策略模式例子

  • 2017年06月26日 14:36
  • 3.01MB
  • 下载

《大话设计模式》之 策略模式 Delphi实现

{ 策略模式 :用来封装算法,处理各种变法,而简单工厂模式,则是解决创建对象的问题 策略(Strategy)模式的用意是定义一组算法(algorithms),并将每个算法封装到具有共同...
  • easyboot
  • easyboot
  • 2012年06月28日 09:35
  • 913

Java经典编程300例之实例064 策略模式的简单应用

实例说明 在使用图像处理软件处理图片后,需要选择一种格式进行保存,然而各种格式在底层实现的算法并不相同,这刚好适合策略模式。本实例将演示如何使用策略模式与简单工厂模式组合进行实例开发。   实现...
  • HanTangSongMing
  • HanTangSongMing
  • 2014年08月01日 10:03
  • 3335

策略模式:封装变化与面向接口编程

在使用Java的集合框架中,经常需要通过构造方法传入一个比较器Comparator或者创建比较器传入Collections的静态方法中作为方法参数,进行比较排序等,这其实就是策略模式的应用。策略模式是...
  • justloveyou_
  • justloveyou_
  • 2017年11月28日 14:59
  • 155

java 策略模式 完全展现面向接口编程的经典样例

策略模式的定义: 策略模式定义了一些列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变换。 乍一看,也没看出个所以然来。举个栗子吧。 假设我们要出去...
  • q610098308
  • q610098308
  • 2017年07月27日 13:57
  • 136

策略模式-面向接口编程

策略模式-面向接口编程定义定义了一系列算法,并将每一个算法封装起来,而且使他们可以相互替换。让算法独立于使用它的客户而独立变化。使用场景 同一类型的问题又多种算法解决。 需要安全的封装多种同一类型的操...
  • Joki233
  • Joki233
  • 2017年03月30日 13:05
  • 234
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Delphi模式编程之策略模式(上)
举报原因:
原因补充:

(最多只允许输入30个字)