《GOF设计模式》—组合(COMPOSITE)—Delphi源码示例:组合接口

来源:互联网 发布:中咨数据有限公司待遇 编辑:程序博客网 时间:2024/05/22 06:46

示例:组合接口

说明:

1)、定义

将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。

2)、结构

 

组合:

Component:为组合中的对象声明接口。在适当的情况下,实现所有类共有接口的缺省行为。声明一个接口用于访问和管理Component的子组件。在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它(可选)

Leaf:在组合中表示叶节点对象,叶节点没有子节点。在组合中定义图元对象的行为。

Composite:定义有子部件的那些部件的行为。存储子部件。在Component接口中实现与子部件有关的操作。

客户端:

Client:通过Component接口操纵组合部件的对象。

协作:

用户使用Component类接口与组合结构中的对象进行交互。如果接收者是一个叶节点,则直接处理请求。如果接收者是Composite,它通常将请求发送给它的子部件,在转发请求之前与/或之后可能执行一些辅助操作。

 

代码:

 

unit uComposite;

 

interface

 

uses

   Dialogs;

 

type

   TComponent = class

   public

       procedure Operation; virtual; abstract;

       procedure Add(AComponent: TComponent); virtual;

       procedure Remove(AComponent: TComponent); virtual;

       function GetChild(const AIndex: integer): TComponent; virtual;

   end;

   TLeaf = class(TComponent)

   public

       procedure Operation; override;

   end;

   TComposite = class(TComponent)

   private

       FChilds: array of TComponent;

   public

       constructor Create;

       destructor Destroy; override;

       //---

       procedure Operation; override;

       procedure Add(AComponent: TComponent); override;

       procedure Remove(AComponent: TComponent); override;

       function GetChild(const AIndex: integer): TComponent; override;

   end;

 

implementation

 

procedure TComponent.Add(AComponent: TComponent);

begin

end;

 

procedure TComponent.Remove(AComponent: TComponent);

begin

end;

 

function TComponent.GetChild(const AIndex: integer): TComponent;

begin

   Result := nil;

end;

 

procedure TLeaf.Operation;

begin

   ShowMessage('Leaf');

end;

 

constructor TComposite.Create;

begin

   SetLength(FChilds,0);

end;

 

destructor TComposite.Destroy;

   //---

   procedure _Clear;

   var

       i: integer;

   begin

       for i := low(FChilds) to high(FChilds) do

           FChilds[i].Free;

       SetLength(FChilds,0);

   end;

begin

   _Clear;

   //---

   inherited;

end;

 

procedure TComposite.Add(AComponent: TComponent);

var

   ACount: integer;

begin

   ACount := Length(FChilds);

   SetLength(FChilds,ACount + 1);

   FChilds[ACount] := AComponent;

end;

 

procedure TComposite.Remove(AComponent: TComponent);

   //---

   function _IndexOf: integer;

   var

       i: integer;

   begin

       for i := low(FChilds) to high(FChilds) do

       begin

           if FChilds[i] = AComponent then

           begin

               Result := i;

               exit;

           end;

       end;

       //---

       Result := -1;

   end;

   //---

   procedure _Delete(AIndex: integer);

   var

       ACount: integer;

   begin

       ACount := Length(FChilds);

       if AIndex < ACount - 1 then

           Move(FChilds[AIndex + 1],FChilds[AIndex],(ACount - AIndex - 1) * 4);

       SetLength(FChilds,ACount - 1);

   end;

var

   AIndex: integer;

begin

   AIndex := _IndexOf;

   if AIndex >= 0 then

       _Delete(AIndex);

end;

 

function TComposite.GetChild(const AIndex: integer): TComponent;

begin

   Result := FChilds[AIndex];

end;

 

procedure TComposite.Operation;

var

   i: integer;

begin

   ShowMessage('Composite');

   //---

   for i := low(FChilds) to high(FChilds) do

       FChilds[i].Operation;

end;

 

end.

 

procedure TForm1.Button1Click(Sender: TObject);

var

   AComposite:TComponent;

begin

   AComposite := TComposite.Create;

   try

       AComposite.Add(TLeaf.Create);

       AComposite.Add(TLeaf.Create);

       AComposite.Add(TComposite.Create);

       //---

       AComposite.Operation;

   finally

       AComposite.Free;

   end;

end;

0 0
原创粉丝点击