《GOF设计模式》—职责链(CHAIN OF RESPONSIBILITY)—Delphi源码示例:帮助机制

来源:互联网 发布:java 架构师培训课程 编辑:程序博客网 时间:2024/05/21 01:15
示例:帮助机制

说明:

代码:

unit uHelp;

 

interface

 

uses

    Dialogs;

 

const

    NO_HELP_TOPIC = -1;

    PRINT_TOPIC = 1;

    PAPER_ORIENTATION_TOPIC = 2;

    APPLICATION_TOPIC = 3;

 

type

    TTopic = integer;

 

    THelpHandler = class

    private

        FSuccessor: THelpHandler;

        FTopic: TTopic;

    public

        constructor Create(h: THelpHandler = nil; t: TTopic = NO_HELP_TOPIC);

        //---

        procedure SetHandler(h: THelpHandler; t: TTopic); virtual;

        function HasHelp(): boolean; virtual;

        procedure HandleHelp(); virtual;

    end;

 

    TWidget = class(THelpHandler)

    private

        FParent: TWidget;

    public

        constructor Create(w: TWidget; t: TTopic = NO_HELP_TOPIC); reintroduce; virtual;

    end;

 

    TButton1 = class(TWidget)

    public

        procedure HandleHelp(); override;

    end;

 

    TDialog1 = class(TWidget)

    public

        constructor Create(h: THelpHandler; t: TTopic = NO_HELP_TOPIC); reintroduce;

        //---

        procedure HandleHelp(); override;

    end;

 

    TApplication1 = class(THelpHandler)

    public

        constructor Create(t: TTopic); reintroduce;

        //---

        procedure HandleHelp(); override;

    end;

 

implementation

 

constructor THelpHandler.Create(h: THelpHandler; t: TTopic);

begin

    SetHandler(h,t);

end;

 

procedure THelpHandler.SetHandler(h: THelpHandler; t: TTopic);

begin

    FSuccessor := h;

    FTopic := t;

end;

 

function THelpHandler.HasHelp(): boolean;

begin

    Result := (FTopic <> NO_HELP_TOPIC);

end;

 

procedure THelpHandler.HandleHelp();

begin

    if FSuccessor <> nil then

        FSuccessor.HandleHelp();

end;

 

constructor TWidget.Create(w: TWidget; t: TTopic);

begin

    inherited Create(w,t);

    //---

    FParent := w;

end;

 

procedure TButton1.HandleHelp();

begin

    if self.HasHelp then

        ShowMessage('Button Help')

    else

        inherited;

end;

 

constructor TDialog1.Create(h: THelpHandler; t: TTopic);

begin

    inherited Create(nil,t);

    //---

    self.SetHandler(h,t);

end;

 

procedure TDialog1.HandleHelp();

begin

    if self.HasHelp then

        ShowMessage('Dialog Help')

    else

        inherited;

end;

 

constructor TApplication1.Create(t: TTopic);

begin

    inherited Create(nil,t);

end;

 

procedure TApplication1.HandleHelp();

begin

    ShowMessage('Application Help');

end;

 

end.

 

procedure TForm1.Button1Click(Sender: TObject);

var

    AnApplication: TApplication1;

    APrintDialog: TDialog1;

    APrintButton: TButton1;

begin

    AnApplication := TApplication1.Create(APPLICATION_TOPIC);

    APrintDialog := TDialog1.Create(AnApplication,PRINT_TOPIC);

    APrintButton := TButton1.Create(APrintDialog,PAPER_ORIENTATION_TOPIC);

    try

        APrintButton.HandleHelp;

    finally

        AnApplication.Free;

        APrintDialog.Free;

        APrintButton.Free;

    end;

end;

 

 

 

原创粉丝点击