您的位置:首页 > 编程语言 > Delphi

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

2010-11-27 14:25 531 查看
示例:组合接口
说明:
(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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐