《GOF设计模式》—策略(STRATEGY)—Delphi源码示例:策略接口

来源:互联网 发布:oracle hr 数据库 编辑:程序博客网 时间:2024/06/07 06:24

示例:策略接口
说明:
(1)、定义
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

(2)、结构
clip_image002 
策略:
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.