设计模式、用Delphi实现---->Strategy模式

原创 2001年11月27日 09:33:00

Strategy模式

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

起源

DelphiSTRATEGY模式是在STRATEGY的基础上进行了扩展。更多STRATEGY模式的资料请参阅 《设计模式208页》

目的

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户面变化。

动机

·         由于需要可以动态的变换不同的策略。

·         更好的封装多个行为与算法结构,而不让客户程序直接干扰

·         通过相关的条件语句选择正确的行为方法。

Template方法使用继承来变换部分算法。Strategies则使用代理和组合来变换所有的算法并支持动态变换。以后,将使用context对象在运行期动态的分配具体的算法。同样,通过使用context对象,客户类将从依赖的算法接口中分离出来,通过context对象可以提供更多的泛化接口。同样意义的是,通过contextstrategy接口可以在将来设计并提供全系统的相关算法来实现具体的应用而无需改变接口。

Strategies同样让你您创建单一的、间单的、易维护的类框架。类框架依赖于继承。

 

 

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

应用

Implementation

下例中的对信用卡进行月利率进行计算。Strategy模式通过充一的抽象类TfinanzeCharge封装、访问接口并担供不同的算法来进行月利率计算。TregularChargeTpreferredCharge信用卡的月利率计算封装了不同的具体算法

TmonthlyCharge实现了TcontextCharge接口并配置了不同的策略对象。TconntextCharge成为客户对象与策略对象的中场发动机,这样有助于感轻客户对象与策略/对象的依赖性。

 

 

    // 策略接口 (抽象类)

  TFinanzeCharge = class

  public

      // 返回计算的结果

    function getCharge(const Balance: double): double; virtual; abstract;

  end;

 

    // 具体策略

  TRegularCharge = class(TFinanzeCharge)

  public

    function getCharge(const Balance: double): double; override;

  end;

 

    //具体策略

  TPreferredCharge = class(TFinanzeCharge)

  public

     function getCharge(const Balance: double): double; override;

  end;

 

客户程序依赖上下文接口来调度指定的策略。无论如何,因为上下文接口是为客户程序而产生的,客户程序必需知道可用的策略/对象。如果上下文无法返回一个有效的实例,可选择选择默认策略的方法实现。

 

 

     // 上下文接口

  TChargeContext = class

  public

    function ComputeCharges(const Balance: double): double; virtual; abstract;

  end;

 

//具体上下文

TmonthlyCharges作为客户对象与策略对象的中场发动机,并通过在它的构造器传递一个具体的利率计算实例进行设置。

This class acts as a mediator between the client and the strategy classes, and is configured by using composition and passing an instance of a concrete finance charge in its constructor.

 

  TMonthlyCharges = class(TChargeContext)

  private

    FFinanzeCharge: TFinanzeCharge;

  public

// 客户程序访问的接口

    function ComputeCharges(const Balance: double): double; override;

    // constructor configures the context object

    constructor Create(aFinanzeCharge: TFinanzeCharge); virtual;

    destructor Destroy; override;

  end;

 

---

implementation

 

// TRegularCharge

function TRegularCharge.getCharge(const Balance: double): double;

begin

  result := Balance * (REG_RATE / 12);

end;

 

// TPreferredCharge

function TPreferredCharge.getCharge(const Balance: double): double;

begin

   // this could be a complex algorithm that takes into account the

   // credit card holder’s buying patterns and reward points accumulated.

  result := Balance * (PREFERRED_RATE / 12);

end;

 

 

// Concrete Context

// TMonthlyCharges

constructor TMonthlyCharges.Create(aFinanzeCharge: TFinanzeCharge);

begin

  inherited Create;

    // aFinanzeCharge configures the context object

    // this class takes ownership of aFinanzeCharge (will destroy it)

  FFinanzeCharge := aFinanzeCharge;

end;

 

destructor TMonthlyCharges.Destroy;

begin

  FFinanzeCharge.Free;

  inherited Destroy;

end;

 

function TMonthlyCharges.ComputeCharges(const Balance: double): double;

begin

  result := FFinanzeCharge.getCharge(Balance);

end;

 

Delphi实例

设计模式、用Delphi实现----&gt;Strategy模式

Strategy模式  起源Delphi的STRATEGY模式是在STRATEGY的基础上进行了扩展。更多STRATEGY模式的资料请参阅 《设计模式208页》目的定义一系列的算法,把它们一个个封装起...
  • programlover
  • programlover
  • 2001年11月27日 09:33
  • 662

设计模式学习笔记--Strategy、State

最近在看设计模式的,防止遗忘,总结一下,如有不足还望指正! 策略模式:(strategy)定义算法家族,分别封装起来,让他们之间可以相互替换。此模式可以让算法的变化,不影响使用算法的用户。 类图如下:...
  • smartboy_01
  • smartboy_01
  • 2014年12月30日 22:32
  • 553

浅谈JAVA设计模式之——策略模式(Strategy)

一、概述 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 二、适用性 1.许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为...
  • l1028386804
  • l1028386804
  • 2015年05月09日 14:02
  • 1892

设计模式之策略(Strategy)模式

Strategy模式是一种行为型设计模式,它将算法一个个封装起来,在某一时刻能够互换地使用其中的一个算法。从概念上看,所有这些算法完成的都是相同的工作,只是实现不同而已。动机在开发中,我们常常会遇到概...
  • lihao21
  • lihao21
  • 2015年08月26日 19:51
  • 2173

设计模式--深度解析策略模式(Strategy Pattern)

前些天网购一本Head First Design Patterns,学习了一下,觉得写的挺好,而且挺有趣的,推荐大家都去买一本,真心不错。在这里我先讲一下,这两天学的,两个常见的设计模式,分别Stra...
  • qq_29282475
  • qq_29282475
  • 2015年12月04日 14:17
  • 3556

iOS 设计模式之策略模式( Strategy)

超市搞活动后,计算活动后商品的价格,使用策略模式实例地址:https://github.com/clairehu7/DesignPatterns 02Strategy...
  • a12a33
  • a12a33
  • 2016年02月17日 11:36
  • 297

delphi版大话设计模式

前段时间听到一个小家伙说, 只听过JAVA. C#有设计模式, DELPHI应该没有吧, 我听了窃笑,  但又不好明说,  一来,  用delphi的人现在本来就很少了,   以前做delphi的年龄...
  • x34205
  • x34205
  • 2013年09月29日 22:42
  • 741

23种经典设计模式之策略模式

前言 相信只要是学过java或者其他面向对象编程语言的伙伴们多少都听说过设计模式,比如可以说算是烂大街的mvc、单例模式都是其中之一。当然设计模式的家族很庞大,远远不止这些。那设计模式是用来干什么的呢...
  • ahzpc007
  • ahzpc007
  • 2016年11月03日 16:24
  • 766

Delphi五种设计模式

今天抽空浏览了一下Delphi写的设计模式,网页在如下位置:http://www.delphi-jedi.org/art_patterns.html今天再看。仍然有种感觉。我把Observer模式的代...
  • penker_zhao
  • penker_zhao
  • 2010年08月06日 15:10
  • 931

设计模式、用Delphi描述--&gt;Observer模式

  • zgqtxwd
  • zgqtxwd
  • 2008年04月30日 17:30
  • 133
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式、用Delphi实现----&gt;Strategy模式
举报原因:
原因补充:

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