模式解说
  责任链模式是一种对象的行为模式,它将处理客户端请求的那些对象联成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
通常使用在以下场合
  1 有多个对象可以处理一个请求,哪个对象处理该请求事先并不知道,而是在运行时自动确定;
  2 希望在不明确制定接收者的情况下,向多个对象中的一个提交请求;
  3 处理一个请求的对象集合需要动态指定时;
16.2 结构和用法
  1.抽象处理者(THandler)-定义了一个处理请求的接口。如果需要,则声明一个方法,实现对后续对象的链接;
  2.具体处理者(TConcreteHandler)-负责处理求;链接后续对象,如果它能处理该请求,则处理,如果不能,则传递给其链接对象处理;
  3.客户端(TClient)-发出请求给责任链中的具体处理对象;

代码示例:
unit Chain;

interface

type

  THandler = class
  private
    FSuccessor: THandler;
    procedure SetSuccessor(const Value: THandler);
  public
    procedure HandleRequest; virtual; abstract;
    property Successor: THandler read FSuccessor write SetSuccessor;
  end;

  TConcreteHandler1 = class(THandler)
  public
    procedure HandleRequest; override;
  end;

  TConcreteHandler2 = class(THandler)
  public
    procedure HandleRequest; override;
  end;


implementation
uses Dialogs;

{ Thandler }

procedure THandler.SetSuccessor(const Value: THandler);
begin
  FSuccessor := Value;
end;

{ TConcreteHandler2 }

procedure TConcreteHandler2.HandleRequest;
begin
  inherited;
  if Successor <> nil then
  begin
    ShowMessage(self.ClassName +  '将请求传递到 ' +  Successor.ClassName);
    Successor.HandleRequest;
  end
  else
  begin
    ShowMessage(self.ClassName + ' 处理了请求!');
  end;
end;

{ TConcreteHandler1 }

procedure TConcreteHandler1.HandleRequest;
begin
  inherited;
  if Successor <> nil then
  begin
    ShowMessage(self.ClassName +  '将请求传递到 ' +  Successor.ClassName);
    Successor.HandleRequest;
  end
  else
  begin
    ShowMessage(self.ClassName + ' 处理了请求!');
  end;
end;

end.

客户端代码



unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    OtherDone: TButton;
    SelfDone: TButton;
    procedure OtherDoneClick(Sender: TObject);
    procedure SelfDoneClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Chain;

{$R *.dfm}

procedure TForm1.OtherDoneClick(Sender: TObject);
var
  Handler1, Handler2: THandler;
begin
  Handler1 := TConcreteHandler1.Create;
  Handler2 := TConcreteHandler1.Create;
  try
    Handler1.Successor := Handler2;
    Handler1.HandleRequest;
  finally
    Handler1.Free;
    Handler2.Free;
  end;
end;

procedure TForm1.SelfDoneClick(Sender: TObject);
var
  Handler1, Handler2: THandler;
begin
  Handler1 := TConcreteHandler1.Create;
  Handler2 := TConcreteHandler1.Create;
  try
    Handler1.HandleRequest;
  finally
    Handler1.Free;
    Handler2.Free;
  end;
end;


end.
posted on 2014-11-08 14:59  小光zfg  阅读(252)  评论(0编辑  收藏  举报