`
cooldesigner
  • 浏览: 68260 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

Template Method

阅读更多

起源<o:p></o:p>

DelphiTemplate 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()为指定的扩展点并在派生类中执行

更的详细实现代码请参阅VCLclasses.pas单元的,抽象类Tstream和具体的流类:TCustomMemoryStream/TmemoryStreamTstringStream。通常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

    标题“TemplateMethod.rar”暗示了这个压缩包包含的是关于Qt平台上实现模板方法设计模式的示例代码。Qt是一个跨平台的应用程序开发框架,常用于创建GUI程序,但也可用于非图形化的后台服务。 描述中的“模板方法...

    TemplateMethod.zip

    这个压缩包"TemplateMethod.zip"包含了关于C++实现模板方法设计模式的代码示例。 模板方法模式的核心思想是定义一个操作中的算法骨架,而将一些步骤延迟到子类中。它允许子类不改变一个算法的结构即可重定义该算法...

    设计模式C++学习之模板方法模式(Template Method)

    在这个例子中,`AbstractClass`是模板类,定义了`templateMethod`模板方法,它调用了`primitiveOperation1`、`primitiveOperation2`以及组件(Component)的`operation`方法。`ConcreteComponentA`和`...

    20-Template Method.rar

    模板方法(Template Method)设计模式是一种行为型设计模式,它在面向对象编程中扮演着重要的角色。这个模式允许我们定义一个操作中的算法骨架,而将一些步骤延迟到子类中。这样,子类可以不改变一个算法的结构即可...

    TemplateMethod 模式与代码重构

    TemplateMethod(模板方法)设计模式是一种行为设计模式,它在面向对象编程中扮演着重要的角色。这个模式允许我们在抽象类中定义一个算法的框架,同时允许子类在不改变算法结构的情况下重写算法中的特定步骤。通过...

    C++设计模式课件3_Template Method_模板方法.pdf

    ### C++设计模式课件3_Template Method_模板方法 #### 模板方法设计模式解析 模板方法模式(Template Method Pattern)是一种行为型设计模式,它允许我们定义算法的骨架,并将部分步骤推迟到子类中实现。这种模式...

    Head First 设计模式 (八) 模板方法模式(Template Method pattern) C++实现

    在这个例子中,`AbstractClass`定义了`templateMethod`模板方法,其中`step1()`是具体实现,而`step2()`和`step3()`作为抽象方法由`ConcreteClass1`和`ConcreteClass2`这两个具体类来实现。这样,不同的具体类可以...

    Discovering Template Method Pattern in Google Android framework

    模板方法模式(Template Method Pattern)在Google Android框架中的应用是一个重要的设计模式实例,它允许开发者定义一个算法骨架,而将一些步骤延迟到子类中。这个模式的关键在于它定义了一个操作中的算法步骤,并...

    C++设计模式代码资源3_Template Method_模板方法.zip

    "模板方法"(Template Method)是设计模式中的一个经典概念,它属于行为设计模式,主要用在父类中定义一个算法的框架,允许子类在这个框架内重定义特定的步骤。这个模式通常用于代码复用和保持代码结构的一致性。 ...

    TemplateMethod Pattern.unitypackage

    TemplateMethod Pattern.unitypackage是一个模板方法模式的小栗子。

    template-method-demo 模板方法示例

    在"template-method-demo"这个示例中,我们可以预见到它将展示如何在Java中应用模板方法模式。这个压缩包可能包含以下内容: 1. 一个抽象类(例如:`AbstractClass`),它定义了模板方法。在这个类中,可能会有一个...

    .NET设计模式(16):模版方法(TemplateMethod)

    摘要:Template Method模式是比较简单的设计模式之一,但它却是代码复用的一项基本的技术,在类库中尤其重要。变化一直以来都是软件设计的永恒话题,在XP编程中提倡拥抱变化,积极应对。如何更好的去抓住变化点,...

    C#中的TemplateMethod模式问题分析

    TemplateMethod模式是一种行为设计模式,它允许在定义算法框架的同时,允许子类为算法的特定步骤提供实现。这种模式在C#中广泛应用于创建可扩展的代码结构,使得父类可以控制算法的流程,而具体的操作则由子类来完成...

    模板方法模式(TemplateMethod)原理图

    模板方法模式是一种行为设计模式,它在一个方法中定义算法的骨架,将一些步骤延迟到子类中实现。 具体来说,模板方法模式的关键特点包括: 抽象类:在抽象类中定义一个模板方法,该方法给出了算法的框架。...

    【原创】Open close principle sample, state pattern, template method pattern

    在软件设计领域,设计模式是解决常见问题的可重用解决方案。它们是经过验证的、在特定上下文中高效的设计决策,被广泛应用于构建可维护和可扩展的软件系统。本篇将深入探讨“开闭原则”(Open Close Principle,OCP...

    C#模板方法模式(Template Method Pattern)实例教程

    模板方法模式(Template Method Pattern)是一种行为设计模式,它允许在定义算法的框架时,将具体步骤延迟到子类中。这种模式的核心在于抽象类,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。子类可以...

    C++设计模式编程中Template Method模板方法模式的运用

    void TemplateMethod() { PrimitiveOperation1(); PrimitiveOperation2(); } protected: virtual void PrimitiveOperation1() = 0; // 抽象方法 virtual void PrimitiveOperation2() = 0; // 抽象方法 ...

    C++设计模式笔记(03-01) – Template Method_模板方法(上)

    C++设计模式笔记(03-02) – Template Method_模板方法(下): https://blog.csdn.net/mofan6930/article/details/104383750 参考书籍:《设计模式:可复用面向对象软件的基础》 参考课程:《C++设计模式》-李建忠 ...

    Template(模板模式)

    void templateMethod() { primitiveOperation1(); primitiveOperation2(); } protected: virtual void primitiveOperation1() = 0; virtual void primitiveOperation2() = 0; }; ``` ```cpp // Template.cpp ...

Global site tag (gtag.js) - Google Analytics