《GOF设计模式》—职责链(CHAIN OF RESPONSIBILITY)—Delphi源码示例:表示请求(使用处理函数)

来源:互联网 发布:java 架构师培训课程 编辑:程序博客网 时间:2024/06/03 15:58

示例:处理函数

说明:

另一选择是使用一个处理函数,这个函数以一个请求码(如一个整型常数或一个字符串)为参数。这种方法支持请求数目不限。唯一的要求是发送方和接受方在请求如何编码问题上应达成一致。

这种方法更为灵活,但它需要用条件语句来区分请求代码以分派请求。另外,无法用类型安全的方法来传递请求参数(或参数组,如“a-1,b-2),因此它们必须被手工打包和解包。显然,相对于直接调用一个操作来说它不太安全。

 

代码:

unit uChainOfResponsibility1;

 

interface

 

uses

    Dialogs;

 

type

    THandler = class

    private

        FSuccessor: THandler;

    public

        constructor Create(const ASuccessor: THandler = nil);

        //---

        procedure HandleRequest(const ACode: string); virtual;

    end;

    TConcreteHandler1 = class(THandler)

    public

        procedure HandleRequest(const ACode: string); override;

    end;

    TConcreteHandler2 = class(THandler)

    public

        procedure HandleRequest(const ACode: string); override;

    end;

 

implementation

 

constructor THandler.Create(const ASuccessor: THandler = nil);

begin

    FSuccessor := ASuccessor;

end;

 

procedure THandler.HandleRequest(const ACode: string);

begin

    case ACode[1] of

        'A':

            begin

                if Length(ACode) > 1 then

                begin

                    case ACode[2] of

                        '1'..'9': ShowMessage('An');

                    else

                        ShowMessage('Ax');

                    end;

                end

                else

                    ShowMessage('Ax');

            end;

        'B':

            begin

                ShowMessage('Bx');

            end;

    else

        if assigned(FSuccessor) then

            FSuccessor.HandleRequest(ACode);

    end;

end;

 

procedure TConcreteHandler1.HandleRequest(const ACode: string);

begin

    case ACode[1] of

        'C': ShowMessage('Cx');

    else

        inherited;

    end;

end;

 

procedure TConcreteHandler2.HandleRequest;

begin

    case ACode[1] of

        'D': ShowMessage('Dx');

    else

        inherited;

    end;

end;

 

end.

 

procedure TForm1.Button1Click(Sender: TObject);

var

    AHandler1: TConcreteHandler1;

    AHandler2: TConcreteHandler2;

begin

    AHandler2 := TConcreteHandler2.Create;

    AHandler1 := TConcreteHandler1.Create(AHandler2);

    try

        AHandler1.HandleRequest('A1');

    finally

        AHandler1.Free;

        AHandler2.Free;

    end;

end;

 

原创粉丝点击