B
billy_yuan
Unregistered / Unconfirmed
GUEST, unregistred user!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
// 策略接口 (抽象类)
TFinanzeCharge = class
public
// 返回计算的结果
function getCharge(const Balance:do
uble):do
uble;
virtual;
abstract;
end;
// 具体策略
TRegularCharge = class(TFinanzeCharge)
public
function getCharge(const Balance:do
uble):do
uble;
override;
end;
//具体策略
TPreferredCharge = class(TFinanzeCharge)
public
function getCharge(const Balance:do
uble):do
uble;
override;
end;
// 上下文接口
TChargeContext = class
public
function ComputeCharges(const Balance:do
uble):do
uble;
virtual;
abstract;
end;
//具体的上下文的实现
TMonthlyCharges = class(TChargeContext)
private
//其目的是存储具体策略的实例
FFinanzeCharge: TFinanzeCharge;
public
//客户程序访问的接口
function ComputeCharges(const Balance:do
uble):do
uble;
override;
//通过具体策略做为参数
constructor Create(aFinanzeCharge: TFinanzeCharge);
virtual;
destructor Destroy;
override;
end;
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
function TRegularCharge.getCharge(const Balance:do
uble):do
uble;
var
REG_RATE :integer ;
begin
REG_RATE := 100 ;
//这里是随便一个数,只是说与TPreferredCharge不同的计算方式
result := Balance * (REG_RATE / 12);
end;
function TPreferredCharge.getCharge(const Balance:do
uble):do
uble;
var
PREFERRED_RATE:double ;
begin
PREFERRED_RATE := 150 ;
//这里是随便一个数,只是说与TRegularCharge不同的计算方式
result := Balance * (PREFERRED_RATE / 12);
end;
constructor TMonthlyCharges.Create(aFinanzeCharge: TFinanzeCharge);
begin
inherited Create;
//保存传入的具体策略的实例
//所有的具体策略都是策略接口的子类,根据子类可以代替父类的原则,这里什么具体策略都可以传进来!
FFinanzeCharge := aFinanzeCharge;
end;
destructor TMonthlyCharges.Destroy;
begin
FFinanzeCharge.Free;
inherited Destroy;
end;
function TMonthlyCharges.ComputeCharges(const Balance:do
uble):do
uble;
begin
result := FFinanzeCharge.getCharge(Balance);
//这行是关键,这时的FFinanzeCharge是根据Create传入的aFinanzeCharge 来决定的!
end;
{$R *.DFM}
end.
以上的模式再加上类工厂模式的话,那样的代码的可阔张性就很强了!
最后请大家记住两件事,一件是这个模式叫strategy模式,另外一件事是我叫billy!
香蕉皮,鸡蛋怎么来了!
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
// 策略接口 (抽象类)
TFinanzeCharge = class
public
// 返回计算的结果
function getCharge(const Balance:do
uble):do
uble;
virtual;
abstract;
end;
// 具体策略
TRegularCharge = class(TFinanzeCharge)
public
function getCharge(const Balance:do
uble):do
uble;
override;
end;
//具体策略
TPreferredCharge = class(TFinanzeCharge)
public
function getCharge(const Balance:do
uble):do
uble;
override;
end;
// 上下文接口
TChargeContext = class
public
function ComputeCharges(const Balance:do
uble):do
uble;
virtual;
abstract;
end;
//具体的上下文的实现
TMonthlyCharges = class(TChargeContext)
private
//其目的是存储具体策略的实例
FFinanzeCharge: TFinanzeCharge;
public
//客户程序访问的接口
function ComputeCharges(const Balance:do
uble):do
uble;
override;
//通过具体策略做为参数
constructor Create(aFinanzeCharge: TFinanzeCharge);
virtual;
destructor Destroy;
override;
end;
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
function TRegularCharge.getCharge(const Balance:do
uble):do
uble;
var
REG_RATE :integer ;
begin
REG_RATE := 100 ;
//这里是随便一个数,只是说与TPreferredCharge不同的计算方式
result := Balance * (REG_RATE / 12);
end;
function TPreferredCharge.getCharge(const Balance:do
uble):do
uble;
var
PREFERRED_RATE:double ;
begin
PREFERRED_RATE := 150 ;
//这里是随便一个数,只是说与TRegularCharge不同的计算方式
result := Balance * (PREFERRED_RATE / 12);
end;
constructor TMonthlyCharges.Create(aFinanzeCharge: TFinanzeCharge);
begin
inherited Create;
//保存传入的具体策略的实例
//所有的具体策略都是策略接口的子类,根据子类可以代替父类的原则,这里什么具体策略都可以传进来!
FFinanzeCharge := aFinanzeCharge;
end;
destructor TMonthlyCharges.Destroy;
begin
FFinanzeCharge.Free;
inherited Destroy;
end;
function TMonthlyCharges.ComputeCharges(const Balance:do
uble):do
uble;
begin
result := FFinanzeCharge.getCharge(Balance);
//这行是关键,这时的FFinanzeCharge是根据Create传入的aFinanzeCharge 来决定的!
end;
{$R *.DFM}
end.
以上的模式再加上类工厂模式的话,那样的代码的可阔张性就很强了!
最后请大家记住两件事,一件是这个模式叫strategy模式,另外一件事是我叫billy!
香蕉皮,鸡蛋怎么来了!