示例:策略接口
说明:
(1)、定义
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
(2)、结构
策略:
Strategy:定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法。
ConcreteStrategy:具体策略。以Strategy接口实现某具体算法。
上下文:
Context:用一个ConcreteStrategy对象来配置。维护一个对Strategy对象的引用。可定义一个接口来让Stategy访问它的数据。
代码:
unit uStrategy;
interface
uses Dialogs;
type
TStrategy = class
public
procedure AlgorithmInterface; virtual; abstract;
end;
TConcreteStrategyA = class(TStrategy)
public
procedure AlgorithmInterface; override;
end;
TConcreteStrategyB = class(TStrategy)
public
procedure AlgorithmInterface; override;
end;
TConcreteStrategyC = class(TStrategy)
public
procedure AlgorithmInterface; override;
end;
TContext = class
private
FStrategy: TStrategy;
procedure SetStrategy(Value: TStrategy);
public
destructor Destroy; override;
//---
procedure ContextInterface;
//---
property Strategy: TStrategy read FStrategy write SetStrategy;
end;
procedure Test;
implementation
procedure Test;
var
AContext: TContext;
//---
function _GetStrategy(AKey: char): TStrategy;
begin
case AKey of
'A': Result := TConcreteStrategyA.Create;
'B': Result := TConcreteStrategyB.Create;
'C': Result := TConcreteStrategyC.Create;
else
Result := TConcreteStrategyA.Create;
end;
end;
begin
AContext := TContext.Create;
try
AContext.Strategy := _GetStrategy('A');
AContext.ContextInterface;
finally
AContext.Free;
end;
end;
procedure TConcreteStrategyA.AlgorithmInterface;
begin
showmessage('Strategy A');
end;
procedure TConcreteStrategyB.AlgorithmInterface;
begin
showmessage('Strategy B');
end;
procedure TConcreteStrategyC.AlgorithmInterface;
begin
showmessage('Strategy C');
end;
procedure TContext.ContextInterface;
begin
if assigned(FStrategy) then
FStrategy.AlgorithmInterface;
end;
destructor TContext.Destroy;
begin
if assigned(FStrategy) then
FStrategy.Free;
//---
inherited;
end;
procedure TContext.SetStrategy(Value: TStrategy);
begin
if assigned(FStrategy) then
FStrategy.Free;
FStrategy := Value;
end;
end.