`

TEMPLATE METHOD(模板方法)----- 类行为型模式

 
阅读更多
1、意图
    定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2、动机
    考虑一个提供Application和Document类的应用框架。Application类负责打开一个已有的已外部形式存储的文档,如一个文件。一旦一个文档中的信息从该文件中读出后,它就由一个Document对象表示。
    用框架构建的应用可以通过继承Application和Document来满足特定的需求。例如,一个绘图应用定义DrawApplication和DrawDocument子类;一个电子表格应用定义SpreadsheetApplication和SpreadsheetDocument子类,如下图所示。
    抽象的的Application类在它的OpenDocument操作中定义了打开和读取一个文档的算法:

 
  void Application::OpenDocument(const char* name){
      if(!canOpenDocument(name)){
        //cannot handle this document
        return;
      }
      Document* doc = DoCreateDocument();
      if(doc){
        _doc->AddDocument(doc);
        aboutToOpenDocument(doc);
        doc->Open();
        doc->DoRead();
      }
    }

   OpenDocument定义了打开一个文档的每一个步骤。它检查该文档是否能被打开,创建与应用相关的Document对象,将它加到文档集合中,并且从一个文件中读取该Document。
    我们称OpenDocument为一个模板方法(template method)。一个模板方法用一些抽象的操作定义一个算法,而子类将重定义这些操作以提供具体的行为。Application的子类将定义检查一个文档是否能被打开(CanOpenDocument)和创建文档(DoCreateDocument)的具体算法步骤。Document子类将定义读取文档(DoRead)的算法步骤。如果需要,模板方法也可定义一个操作(AboutToOpenDocument)让Application子类知道该文档合适被打开。
    通过使用抽象操作定义一个算法中的一些步骤,模板方法确定了它们的先后顺序,但它允许Application和Document子类改变这些步骤以满足它们各自的需求。
3、适用性
  模板方法应用于下列的情况:
    一次性实现一个算法的不变得部分,并将可变的行为留给子类来实现。
    各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。首先识别现有代码中的不同之处,并将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
     控制子类扩展。模板方法中只有特定点调用“hook”操作,这样就只允许在这些点进行扩展。
4、结构




5、代码示例

/**
 * An abstract class that is common to several games in
 * which players play against the others, but only one is
 * playing at a given time.
 */
 
abstract class Game {
 
    protected int playersCount;
    abstract void initializeGame();
    abstract void makePlay(int player);
    abstract boolean endOfGame();
    abstract void printWinner();
 
    /* A template method : */
    public final void playOneGame(int playersCount) {
        this.playersCount = playersCount;
        initializeGame();
        int j = 0;
        while (!endOfGame()) {
            makePlay(j);
            j = (j + 1) % playersCount;
        }
        printWinner();
    }
}
 
//Now we can extend this class in order 
//to implement actual games:
 
class Monopoly extends Game {
 
    /* Implementation of necessary concrete methods */
    void initializeGame() {
        // Initialize players
        // Initialize money
    }
    void makePlay(int player) {
        // Process one turn of player
    }
    boolean endOfGame() {
        // Return true if game is over 
        // according to Monopoly rules
    }
    void printWinner() {
        // Display who won
    }
    /* Specific declarations for the Monopoly game. */
 
    // ...
}
 
class Chess extends Game {
 
    /* Implementation of necessary concrete methods */
    void initializeGame() {
        // Initialize players
        // Put the pieces on the board
    }
    void makePlay(int player) {
        // Process a turn for the player
    }
    boolean endOfGame() {
        // Return true if in Checkmate or 
        // Stalemate has been reached
    }
    void printWinner() {
        // Display the winning player
    }
    /* Specific declarations for the chess game. */
 
    // ...
}
  • 大小: 28.2 KB
分享到:
评论

相关推荐

    template-method-demo 模板方法示例

    模板方法设计模式是一种行为设计模式,它在面向对象编程中扮演着重要的角色。这个模式允许我们在父类中定义一个算法的骨架,而将一些步骤延迟到子类中。子类可以重写某些步骤来实现定制化的行为,但整体算法结构保持...

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

    模板方法模式(Template Method)是设计模式中行为型模式的一种,它定义了操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这个模式在C++编程中有着...

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

    模板方法模式是设计模式中的一种行为模式,它在软件工程中扮演着重要的角色,尤其是在C++这样的面向对象编程语言中。这种模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的...

    c++设计模式-行为型模式-模板方法模式

    c++设计模式-行为型模式-模板方法模式;qt工程;c++简单源码; 模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重...

    模板方法模式----设计模式系列

    模板方法模式是面向对象设计模式的一种,它在行为模式中占据重要地位。此模式的核心思想是定义一个操作的框架,允许子类在这个框架内自定义具体的行为。这为代码复用和实现相同逻辑的不同实现提供了方便,同时也遵循...

    设计模式--模板方法模式java例子

    模板方法模式是设计模式中行为型模式的一种,它在软件工程中扮演着非常重要的角色,尤其是在Java编程中。模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。它允许子类不改变一个算法的结构即可重...

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

    模板方法模式(Template Method Pattern)是一种行为型设计模式,它允许我们定义算法的骨架,并将部分步骤推迟到子类中实现。这种模式使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。 #### 模式背景...

    Template(模板模式)

    模板模式是一种行为设计模式,它使你能在不破坏封装性的前提下,定义对象间的一系列基本操作,并在子类中实现这些操作的具体步骤。在模板模式中,一个抽象类公开定义了执行它的方法的方式,而将具体实现延迟到子类中...

    设计模式-模板方法模式ppt

    - **抽象类(Abstract Class)**:包含一个或多个抽象方法,并且有一个模板方法(template method)。模板方法通常被声明为final,这意味着它不能被子类覆盖。 - **具体操作(Concrete Operations)**:在抽象类中...

    设计模式专题之(十三)模板模式---设计模式模板模式示例代码(python--c++)

    模板模式是一种行为设计模式,它使你能在不破坏封装性的前提下,定义执行算法的框架,而将一些步骤延迟到子类中。这样,你就能创建一个可复用的框架,将具体步骤留给子类来实现。这个模式的核心思想是抽象类定义了一...

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

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

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

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

    java设计模式-模板模式

    3. **模板方法(Template Method)**:这是在抽象类中定义的方法,它调用了一个或多个钩子方法(即抽象方法或可选的具体方法)。模板方法执行整体算法的顺序,并且通常在最后调用钩子方法以完成算法的定制部分。 4....

    设计模式-模板方法模式(讲解及其实现代码)

    在这个例子中,`AbstractClass` 是抽象类,`templateMethod` 是模板方法,`step1`、`step2` 和 `step3` 是基本方法,其中 `step2` 提供了一个默认实现,`step3` 是一个钩子方法,子类可以选择是否覆盖。`Concrete...

    3 模板模式-课程内容.rar

    2. **模板模式的结构**:详细阐述抽象类与具体类之间的关系,包括模板方法(Template Method)和具体方法(Concrete Methods)的定义,以及钩子方法(Hook Methods)的概念和用途。 3. **模板模式的实现**:通过...

    TemplateMethod 模式与代码重构

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

    模版方法模式TemplatePattern

    模板方法模式(Template Pattern)是设计模式中行为型模式的一种,它定义了操作中的算法骨架,而将一些步骤延迟到子类中。这种模式允许子类重新定义或改变某些基本操作,但整体结构和顺序保持不变。在Java编程中,...

    20-Template Method.rar

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

    设计模式_行为型_模板方法模式.md

    - **模板方法(Template Method)**:调用抽象类中的其他方法来定义算法的步骤。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。 2. **具体类(ConcreteClass)**:实现抽象类中定义的...

    TemplateMethod.rar

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

Global site tag (gtag.js) - Google Analytics