本文主要是介绍《GOF设计模式》—适配器(ADAPTER)—Delphi源码示例:可插入的Adapter(参数化的适配器),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
示例:可插入的Adapter(参数化的适配器)
实现:
c)、参数化的适配器
用一个或多个模块对适配器进行参数化。模块构造支持无子类化的适配。一个模块可以匹配一个请求,并且适配器可以为每个请求存储一个模块。
在本例中意味着,TreeDisplay存储的一个模块用来将一个节点转化成为一个GraphicNode,另外一个模块用来存取一个节点的子节点。
例如,当对一个目录层次建立TreeDisplay时,我们可以这样写:
如果你在一个类中创建接口适配,这种方法提供了另外一种选择,它相对于子类化方法来说更方便一些。
代码:
unit uTreeDisplay2;
interface
uses
Classes;
type
PNodes = ^TNodes;
TNode = record
Text: string;
Child: PNodes;
end;
TNodes = array of TNode;
TFileDirs = array of string;
TCreateGraphiNodeBlock = function(n: TNode): string of object;
TGetChildrenBlock = procedure(var n: TNode) of object;
TTreeDisplay = class
private
FList: TStringList;
FOnCreateGraphiNodeBlock: TCreateGraphiNodeBlock;
FOnGetChildrenBlock: TGetChildrenBlock;
procedure AddGraphiNode(const n: string);
protected
function CreateGraphiNode(n: TNode): string;
procedure GetChildren(var n: TNode);
public
constructor Create;
destructor Destroy; override;
//---
function Display: string;
procedure BuildTree(n: TNode);
//---
property OnGetChildrenBlock: TGetChildrenBlock write FOnGetChildrenBlock;
property OnCreateGraphiNodeBlock: TCreateGraphiNodeBlock write
FOnCreateGraphiNodeBlock;
end;
TFileSystemEntity = class
public
procedure GetSubDirectories(var n: TNode);
function CreateGraphiNode(n: TNode): string;
end;
implementation
constructor TTreeDisplay.Create;
begin
FList := TStringList.Create;
end;
destructor TTreeDisplay.Destroy;
begin
FList.Free;
//---
inherited;
end;
procedure TTreeDisplay.BuildTree(n: TNode);
var
i: integer;
begin
GetChildren(n);
if n.Child <> nil then
begin
for i := low(n.Child^) to high(n.Child^) do
begin
AddGraphiNode(CreateGraphiNode(n.Child^[i]));
BuildTree(n.Child^[i]);
end;
//---
Dispose(n.Child);
n.Child := nil;
end;
end;
procedure TTreeDisplay.AddGraphiNode(const n: string);
begin
FList.Add(n);
end;
function TTreeDisplay.Display: string;
begin
result := FList.Text;
end;
function TFileSystemEntity.CreateGraphiNode(n: TNode): string;
begin
Result := n.Text;
end;
procedure TFileSystemEntity.GetSubDirectories(var n: TNode);
var
ADirs: TFileDirs;
i: integer;
begin
if n.Child <> nil then
begin
Dispose(n.Child);
n.Child := nil;
end;
//---
if n.Text = 'a' then
begin
new(n.Child);
//---
setlength(n.Child^,2);
n.Child^[0].Text := '123';
n.Child^[1].Text := '456';
end;
end;
function TTreeDisplay.CreateGraphiNode(n: TNode): string;
begin
if assigned(FOnCreateGraphiNodeBlock) then
Result := FOnCreateGraphiNodeBlock(n)
end;
procedure TTreeDisplay.GetChildren(var n: TNode);
begin
if assigned(FOnGetChildrenBlock) then
FOnGetChildrenBlock(n);
end;
end.
procedure TForm1.Button1Click(Sender: TObject);
var
AEntity: TFileSystemEntity;
ADirectoryDisplay:TTreeDisplay;
n: TNode;
begin
AEntity := TFileSystemEntity.Create;
ADirectoryDisplay := TTreeDisplay.Create;
try
ADirectoryDisplay.OnGetChildrenBlock := AEntity.GetSubDirectories;
ADirectoryDisplay.OnCreateGraphiNodeBlock := AEntity.CreateGraphiNode;
//---
n.Text := 'a';
n.Child := nil;
//---
ADirectoryDisplay.BuildTree(n);
self.Memo1.Text := ADirectoryDisplay.Display;
finally
ADirectoryDisplay.Free;
AEntity.Free;
end;
end;
这篇关于《GOF设计模式》—适配器(ADAPTER)—Delphi源码示例:可插入的Adapter(参数化的适配器)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!