Delphi 语言策略模式应用示例
策略模式是一种行为设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。本文将围绕Delphi语言,通过一个示例来展示策略模式的应用。
策略模式概述
策略模式的主要目的是将算法的封装与使用算法的客户解耦。在策略模式中,通常包含以下角色:
- Context(环境类):维护一个策略对象的引用,并负责调用策略对象的方法。
- Strategy(策略接口):定义所有支持的算法的公共接口。
- ConcreteStrategy(具体策略类):实现Strategy接口,定义所有支持的算法。
示例:计算折扣
假设我们有一个电商系统,需要根据不同的折扣策略计算商品的价格。以下是一个使用策略模式的Delphi示例。
1. 定义策略接口
我们定义一个策略接口,用于计算折扣。
delphi
interface
uses
SysUtils;
type
// 折扣策略接口
IDiscountStrategy = interface
['{F7F8E3C0-9F3C-4E7A-9C0C-5C8C7C7C9F9F}']
function CalculateDiscount(OriginalPrice: Double): Double;
end;
2. 实现具体策略类
接下来,我们实现几个具体的折扣策略类。
delphi
type
// 固定折扣策略
TFixedDiscountStrategy = class(TInterfacedObject, IDiscountStrategy)
private
FDiscountRate: Double;
public
constructor Create(ADiscountRate: Double);
function CalculateDiscount(OriginalPrice: Double): Double;
end;
// 满减折扣策略
TFullReductionDiscountStrategy = class(TInterfacedObject, IDiscountStrategy)
private
FFullPrice: Double;
FReductionAmount: Double;
public
constructor Create(AFullPrice, AReductionAmount: Double);
function CalculateDiscount(OriginalPrice: Double): Double;
end;
3. 实现环境类
环境类负责维护一个策略对象的引用,并调用策略对象的方法。
delphi
type
// 环境类
TShoppingCart = class
private
FStrategy: IDiscountStrategy;
public
constructor Create;
destructor Destroy; override;
procedure SetStrategy(AStrategy: IDiscountStrategy);
function CalculateFinalPrice(OriginalPrice: Double): Double;
end;
4. 使用策略模式
现在,我们可以创建一个购物车对象,并设置不同的折扣策略来计算最终价格。
delphi
var
ShoppingCart: TShoppingCart;
FixedDiscountStrategy: TFixedDiscountStrategy;
FullReductionDiscountStrategy: TFullReductionDiscountStrategy;
begin
ShoppingCart := TShoppingCart.Create;
try
// 设置固定折扣策略
FixedDiscountStrategy := TFixedDiscountStrategy.Create(0.1); // 10%折扣
ShoppingCart.SetStrategy(FixedDiscountStrategy);
WriteLn('Final Price with Fixed Discount: ', ShoppingCart.CalculateFinalPrice(100));
// 设置满减折扣策略
FullReductionDiscountStrategy := TFullReductionDiscountStrategy.Create(200, 20); // 满减20元
ShoppingCart.SetStrategy(FullReductionDiscountStrategy);
WriteLn('Final Price with Full Reduction Discount: ', ShoppingCart.CalculateFinalPrice(100));
finally
ShoppingCart.Free;
end;
end.
5. 运行结果
运行上述代码,将输出:
Final Price with Fixed Discount: 90
Final Price with Full Reduction Discount: 80
总结
通过上述示例,我们可以看到策略模式在Delphi语言中的应用。策略模式使得算法的封装与使用算法的客户解耦,提高了代码的灵活性和可维护性。在实际项目中,我们可以根据需求定义更多的折扣策略,并通过环境类灵活地切换不同的策略,从而实现更加灵活的折扣计算功能。
Comments NOTHING