起源<o:p></o:p>
Delphi的Template Method模式以Object Pascal的虚函数为基础的结构型模式。
目的
<o:p></o:p>
定义一组算法操作的框架,定义一些不改变算法结构的子类。<o:p></o:p>
动机<o:p></o:p>
· 更好地封装策略方针并分发到不同的代理。
· 更好地实现复杂算法的代码重用,基类封装不可变的部分,并让子类实现可重载的部分行为方法。
· 更好地通过子类的可扩展部分提供钩子式的操作,但template method模式只允许通过基类来调用。<o:p></o:p>
<o:p></o:p>
应用<o:p></o:p>
先让我们看看几个使用了template method模式VCL组件。在下例中,VCL组件中的抽象类Tstream(定义于classes.pas)实现了流拷贝方法CopyFrom(),template 方法CopyFrom()包含了流拷贝的必需的算法。TStream 将Read()和Write()方法声名为抽象方法,并将实现延期到其具体的子类。CopyFrom()通过ReadBuffer()、WriteBuffer() 访问Read()、Write(),
ReadBuffer()、WriteBuffer()为模板方法。以后它们将提供静态并简单Read()和Write()虚方法接口。Read() 和 Write()为指定的扩展点并在派生类中执行
更的详细实现代码请参阅VCL的classes.pas单元的,抽象类Tstream和具体的流类:TCustomMemoryStream/TmemoryStream及TstringStream。通常template方法在基类中被定义为静态,并且派生的操作定义为虚方法,以后你只需要在子类中重载扩展点。对了,接口不支持template方法。
<o:p></o:p>
{抽象类 TStream}
<o:p></o:p>
TStream = class(TObject)
private
…
protected
procedure SetSize(NewSize: Longint); virtual;
public
<o:p></o:p>
//源类支持的原始的方法<o:p></o:p>
function Read(var Buffer; Count: Longint): Longint; virtual; abstract;<o:p></o:p>
function Write(const Buffer; Count: Longint): Longint; virtual; abstract;
function Seek(Offset: Longint; Origin: Word): Longint; virtual; abstract;
// template方法
procedure ReadBuffer(var Buffer; Count: Longint);<o:p></o:p>
procedure WriteBuffer(const Buffer; Count: Longint);<o:p></o:p>
<o:p></o:p>
// 封装了由模板方法实现的流拷算法
function CopyFrom(Source: TStream; Count: Longint): Longint;<o:p></o:p>
…
end;
<o:p></o:p>
<o:p></o:p>
<o:p></o:p>
//具体类
TStringStream = class(TStream)
…
public
constructor Create(const AString: string);
// 具体类实现了可重载的方法
function Read(var Buffer; Count: Longint): Longint; override;<o:p></o:p>
…<o:p></o:p>
function Write(const Buffer; Count: Longint): Longint; override;<o:p></o:p>
…
end;
<o:p></o:p>
<o:p></o:p>
---------
<o:p></o:p>
{ TStream } // 抽象类
…
// template方法<o:p></o:p>
procedure TStream.ReadBuffer(var Buffer; Count: Longint);<o:p></o:p>
begin<o:p></o:p>
if (Count <> 0) and (Read(Buffer, Count) <> Count) then
raise EReadError.Create(SReadError);
end;<o:p></o:p>
<o:p></o:p>
procedure TStream.WriteBuffer(const Buffer; Count: Longint);<o:p></o:p>
begin<o:p></o:p>
if (Count <> 0) and (Write(Buffer, Count) <> Count) then
raise EWriteError.Create(SWriteError);
end;
<o:p></o:p>
function TStream.CopyFrom(Source: TStream; Count: Longint): Longint;<o:p></o:p>
const
MaxBufSize = $F000;
var
BufSize, N: Integer;
Buffer: PChar;
begin
if Count = 0 then
begin
Source.Position := 0;
Count := Source.Size;
end;
Result := Count;
if Count > MaxBufSize then BufSize := MaxBufSize else BufSize := Count;
GetMem(Buffer, BufSize);
try
while Count <> 0 do
begin
if Count > BufSize then N := BufSize else N := Count;
Source.ReadBuffer(Buffer^, N);<o:p></o:p>
WriteBuffer(Buffer^, N);<o:p></o:p>
Dec(Count, N);
end;
finally
FreeMem(Buffer, BufSize);
end;
end;
<o:p></o:p>
<o:p></o:p>
---------
{ TStringStream } // 具体类
…
// 具体类实现了源始的操作
function TStringStream.Read(var Buffer; Count: Longint): Longint;<o:p></o:p>
begin
Result := Length(FDataString) - FPosition;
if Result > Count then Result := Count;
Move(PChar(@FDataString[FPosition + 1])^, Buffer, Result);
Inc(FPosition, Result);
end;
<o:p></o:p>
function TStringStream.Write(const Buffer; Count: Longint): Longint;<o:p></o:p>
begin
Result := Count;
SetLength(FDataString, (FPosition + Result));
Move(Buffer, PChar(@FDataString[FPosition + 1])^, Result);
Inc(FPosition, Result);
end;
<o:p></o:p>
分享到:
相关推荐
标题“TemplateMethod.rar”暗示了这个压缩包包含的是关于Qt平台上实现模板方法设计模式的示例代码。Qt是一个跨平台的应用程序开发框架,常用于创建GUI程序,但也可用于非图形化的后台服务。 描述中的“模板方法...
这个压缩包"TemplateMethod.zip"包含了关于C++实现模板方法设计模式的代码示例。 模板方法模式的核心思想是定义一个操作中的算法骨架,而将一些步骤延迟到子类中。它允许子类不改变一个算法的结构即可重定义该算法...
在这个例子中,`AbstractClass`是模板类,定义了`templateMethod`模板方法,它调用了`primitiveOperation1`、`primitiveOperation2`以及组件(Component)的`operation`方法。`ConcreteComponentA`和`...
模板方法(Template Method)设计模式是一种行为型设计模式,它在面向对象编程中扮演着重要的角色。这个模式允许我们定义一个操作中的算法骨架,而将一些步骤延迟到子类中。这样,子类可以不改变一个算法的结构即可...
TemplateMethod(模板方法)设计模式是一种行为设计模式,它在面向对象编程中扮演着重要的角色。这个模式允许我们在抽象类中定义一个算法的框架,同时允许子类在不改变算法结构的情况下重写算法中的特定步骤。通过...
### C++设计模式课件3_Template Method_模板方法 #### 模板方法设计模式解析 模板方法模式(Template Method Pattern)是一种行为型设计模式,它允许我们定义算法的骨架,并将部分步骤推迟到子类中实现。这种模式...
在这个例子中,`AbstractClass`定义了`templateMethod`模板方法,其中`step1()`是具体实现,而`step2()`和`step3()`作为抽象方法由`ConcreteClass1`和`ConcreteClass2`这两个具体类来实现。这样,不同的具体类可以...
模板方法模式(Template Method Pattern)在Google Android框架中的应用是一个重要的设计模式实例,它允许开发者定义一个算法骨架,而将一些步骤延迟到子类中。这个模式的关键在于它定义了一个操作中的算法步骤,并...
"模板方法"(Template Method)是设计模式中的一个经典概念,它属于行为设计模式,主要用在父类中定义一个算法的框架,允许子类在这个框架内重定义特定的步骤。这个模式通常用于代码复用和保持代码结构的一致性。 ...
TemplateMethod Pattern.unitypackage是一个模板方法模式的小栗子。
在"template-method-demo"这个示例中,我们可以预见到它将展示如何在Java中应用模板方法模式。这个压缩包可能包含以下内容: 1. 一个抽象类(例如:`AbstractClass`),它定义了模板方法。在这个类中,可能会有一个...
摘要:Template Method模式是比较简单的设计模式之一,但它却是代码复用的一项基本的技术,在类库中尤其重要。变化一直以来都是软件设计的永恒话题,在XP编程中提倡拥抱变化,积极应对。如何更好的去抓住变化点,...
TemplateMethod模式是一种行为设计模式,它允许在定义算法框架的同时,允许子类为算法的特定步骤提供实现。这种模式在C#中广泛应用于创建可扩展的代码结构,使得父类可以控制算法的流程,而具体的操作则由子类来完成...
模板方法模式是一种行为设计模式,它在一个方法中定义算法的骨架,将一些步骤延迟到子类中实现。 具体来说,模板方法模式的关键特点包括: 抽象类:在抽象类中定义一个模板方法,该方法给出了算法的框架。...
在软件设计领域,设计模式是解决常见问题的可重用解决方案。它们是经过验证的、在特定上下文中高效的设计决策,被广泛应用于构建可维护和可扩展的软件系统。本篇将深入探讨“开闭原则”(Open Close Principle,OCP...
模板方法模式(Template Method Pattern)是一种行为设计模式,它允许在定义算法的框架时,将具体步骤延迟到子类中。这种模式的核心在于抽象类,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。子类可以...
void TemplateMethod() { PrimitiveOperation1(); PrimitiveOperation2(); } protected: virtual void PrimitiveOperation1() = 0; // 抽象方法 virtual void PrimitiveOperation2() = 0; // 抽象方法 ...
C++设计模式笔记(03-02) – Template Method_模板方法(下): https://blog.csdn.net/mofan6930/article/details/104383750 参考书籍:《设计模式:可复用面向对象软件的基础》 参考课程:《C++设计模式》-李建忠 ...
void templateMethod() { primitiveOperation1(); primitiveOperation2(); } protected: virtual void primitiveOperation1() = 0; virtual void primitiveOperation2() = 0; }; ``` ```cpp // Template.cpp ...