1. 程式人生 > >C++ 模版方法模式

C++ 模版方法模式

簡述

模版方法模式(Template Method Pattern)定義一個操作中演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。

|

模式結構

UML 結構圖:

Template Method Pattern

  • 抽象類(AbstractClass):定義抽象的原語操作,具體的子類將重定義它們以實現一個演算法的各步驟。主要是實現一個模板方法,定義一個演算法的骨架。該模板方法不僅呼叫原語操作,也呼叫定義在 AbstractClass 或其他物件中的操作。
  • 具體類(ConcreteClass):實現原語操作以完成演算法中與特定子類相關的步驟。

優缺點

優點:

  • 在父類中形式化地定義一個演算法,而由其子類實現細節的處理,在子類實現詳細的處理演算法時並不會改變演算法中步驟的執行次序。
  • 模板方法模式是一種程式碼複用技術,在類庫設計中尤為重要,它提取了類庫中的公共行為,將公共行為放在父類中,而通過其子類來實現不同的行為,它鼓勵我們恰當使用繼承來實現程式碼複用。
  • 可實現一種反向控制結構,通過子類覆蓋父類的鉤子方法來決定某一特定步驟是否需要執行。
  • 在模板方法模式中,可以通過子類來覆蓋父類的基本方法,不同的子類可以提供基本方法的不同實現,更換和增加新的子類很方便,符合單一職責原則和開閉原則。

缺點:

  • 需要為每一個基本方法的不同實現提供一個子類,如果父類中可變的基本方法太多,將會導致類的個數增加,系統更加龐大,設計也更加抽象,此時,可結合橋接模式來進行設計。

適用場景

  • 對一些複雜的演算法進行分割,將演算法中固定不變的部分設計為模板方法和父類具體方法,而一些可變的細節由子類實現。
  • 各子類中公共的行為應被提取出來並集中到一個公共父類中,以避免程式碼重複。
  • 需要通過子類來決定父類演算法中某個步驟是否執行,實現子類對父類的反向控制。

案例分析

招聘流程

Recruitment Process

談及校招,對學生們而言,最誘人的名字無疑是 BAT,工資高、福利好,而且還能學到很多前沿的技術!當然,巨頭公司的 Offer 不是那麼容易拿的,不僅要成績優異,更要技術過人。

無論什麼公司,在校招時一般都會採用“宣講會 -> 接收簡歷 -> 面試 -> 發放 Offer”這樣一套固定流程。其中,各公司宣講會(宣傳企業文化、福利待遇)和接收簡歷(自帶簡歷)的形式幾乎是一樣的,不同的是面試和發放 Offer 環節。阿里需要經過一面、二面、三面,並提供30W/年的薪酬;而騰訊則需要一面、二面,並提供25W/年的薪酬。

這裡,公司是抽象類,“宣講會 -> 接收簡歷 -> 面試 -> 發放 Offer”則是一套固定的模板方法(招聘流程)。具體類由阿里和騰訊表示,不同之處在於面試和發放 Offer 環節,需要它們分別實現。

程式碼實現

建立抽象類

抽象類由 Company 表示,它提供了一套固定的模板方法 Recruit(),用於標準化演算法的骨架:

// abstract_class.h
#ifndef ABSTRACT_CLASS_H
#define ABSTRACT_CLASS_H

#include <iostream>

// 公司
class Company
{
public:
    virtual ~Company() {}

    // 校園招聘
    void Recruit() {
        std::cout << "---------- Begin ----------" << std::endl;
        CareerTalk();
        ReceiveResume();
        Interview();
        Offer();
        std::cout << "---------- End ----------" << std::endl;
    }

    // 宣講會
    void CareerTalk() {
        std::cout << "Delivery" << std::endl;
    }

    // 接收簡歷
    void ReceiveResume() {
        std::cout << "Receive Resume" << std::endl;
    }

    // 面試
    virtual void Interview() = 0;

    // 發放 Offer
    virtual void Offer() = 0;
};

#endif // ABSTRACT_CLASS_H

注意: 相同的行為 CareerTalk() 和 ReceiveResume() 有預設實現,不同的行為 Interview() 和 Offer() 採用“佔位符”方式,需要由具體公司來實現。

建立具體類

具體公司有兩個 - Alibaba、Tencent,它們的面試、錄用方式不同:

// concrete_class.h
#ifndef CONCRETE_CLASS_H
#define CONCRETE_CLASS_H

#include "abstract_class.h"
#include <iostream>

// 阿里
class Alibaba : public Company
{
public:
    virtual void Interview() override {
        std::cout << "First interview -> Second interview -> Third interview" << std::endl;
    }

    virtual void Offer() override {
        std::cout << "30W" << std::endl;
    }
};

// 騰訊
class Tencent : public Company
{
public:
    virtual void Interview() override {
        std::cout << "First interview -> Second interview" << std::endl;
    }

    virtual void Offer() override {
        std::cout << "25W" << std::endl;
    }
};

#endif // CONCRETE_CLASS_H

建立客戶端

校招開啟,Offer 快到碗裡來:

// main.cpp
#include "concrete_class.h"

#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
#endif

int main()
{
    // 阿里校招
    Company *alibaba = new Alibaba();
    alibaba->Recruit();

    // 騰訊校招
    Company *tencent = new Tencent();
    tencent->Recruit();

    SAFE_DELETE(tencent);
    SAFE_DELETE(alibaba);

    getchar();

    return 0;
}

輸出如下:

———- Begin ———-
Delivery
Receive Resume
First interview -> Second interview -> Third interview
30W
———- End ———-
———- Begin ———-
Delivery
Receive Resume
First interview -> Second interview
25W
———- End ———-

相關推薦

C++ 模版方法模式

簡述 模版方法模式(Template Method Pattern)定義一個操作中演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。 | 模式結構 UML 結構圖: 抽象類(

Java設計模式模版方法模式

設計模式 pla 控制 test style 步驟 str 模版 女人 概述 模板方法模式是類的行為模式。準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,然後聲明一些抽象方法來迫使子類實現剩余的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩余的

由AbstractQueuedSynchronizer和ReentrantLock來看模版方法模式

however 結構圖 debug exception alt strac red con overhead   在學完volatile和CAS之後,近幾天在擼AbstractQueuedSynchronizer(AQS)的源代碼,很多並發工具都是基於AQS來實現的,這也是

23種設計模式(6):模版方法模式

框架 特定 over 結果 重寫 任務 .so 架構 延遲 定義:定義一個操作中算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變算法的結構即可重定義該算法中的某些特定步驟。 類型:行為類模式。 類圖: 事實上,模版方法是編程中一個經常用到的模式。先來看一個例子

設計模式 _第四招式_模版方法模式

一、定義 定義一個操作中的演算法框架,而將一些步驟延遲到子類中。使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。模版方法模式確實非常簡單,僅使用了Java的繼承機制,是一種應用非常廣泛的模式。 模版方法模式通用類圖如下: AbstractClass叫做抽象模

Java_50_回撥的實現_模版方法模式

回撥的實現 CallBack Hook ---------------------------------------------------- public class Test {//父類     public void paint() { &n

模版方法模式(Template Method)

1、概念 在模板模式(Template Pattern)中,一個抽象類公開定義了執行它的方法的方式/模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行。這種型別的設計模式屬於行為型模式。 2、模式結構 抽象類(AbstractClass): 定義一組基本方法供子類實現

設計模式 --- 模版方法模式

1.定義 定義一個操作中的演算法框架,而將一些步驟延遲到子類中,使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。   2.使用場景 1。多個子類公有的方法並且邏輯相同 2。重要、複雜的演算法,可以把核心演算法設計為模版,周邊的相關細節功能則由各個子類

設計模式(九)—— 模版方法模式

一、含義 在一個方法中定義一個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。通俗講,就是當你的程式中,有多個類,方法是相同的,只是具體實現有差異時,就可以把這多個類使用模板方法模式進行封裝。 二、要點 1.模板方法只定

ES6設計模式模版方法模式

這是一個常用的模式,也是一個容易理解的模式,我從這裡面認識了什麼叫鉤子方法。 模版方法模式,很簡單就是就是父類中對演算法進行封裝,子類中新增子集的方法做不同實現,並且父類中可以設定鉤子函式,子類通過呼叫鉤子函式控制父類的演算法流程。注意這裡還有一個原則,避免物件之間過度依賴。會造成專案混亂,要遵循最少知識原則

設計模式總結之TemplateMethod Pattern(模版方法模式

目錄 建立型設計模式: 結構型設計模式: 行為型設計模式: TemplateMethod Pattern(模版方法模式) 意圖 定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個演算法的結構即可重定義該演算法的

Java設計模式(三)模版方法模式

模版方法:在抽象類中定義了一個模版方法,在模版方法中使用了一些該抽象類中定義的空方法,而這些空方法可以供子類實現。 我們在檢視原始碼時經常能夠看到在執行一些重要的方法時,往往呼叫了一些看似沒有什麼意義的空方法。其實這就是模版方法。 abstract class Th

模版方法模式,迭代器模式,組合模式,狀態模式,代理模式

1.模版方法模式:在一個方法中定義一個演算法的骨架,而將一些步驟延遲到子類中,模版方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟,還可以提供hook()讓子類決定是否執行某些步驟。比如sort中的Comparable介面。 2.迭代器模式就是集合的迭代器 3.組合模式

C++ 工廠方法模式

簡述 工廠方法模式(Factory Method Pattern)是一種常用的物件建立型設計模式,此模式的核心思想是封裝類中不變的部分,提取其中個性化善變的部分為獨立類,通過依賴注入以達到解耦、複用以及方便後期維護拓展的目的。 模式結構 UML 結構圖:

java 模版方法模式

定義:定義一個操作中演算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變演算法的結構即可重定義該演算法中的某些特定步驟。 型別:行為類模式 類圖:         事實上,模版方法是程式設計中一個經常用到的模式。先來看一個例子,某日,程式設計師A拿到一個任務:給

C++工廠方法模式(Factory Method Pattern)

#ifndef LOGGER_H #define LOGGER_H #include <iostream> #include <string> class Logger {

設計模式系列之四_策略模式模版方法模式(Template method)

1.策略模式 1.1 策略模式   策略模式定義了一系列的演算法,並將每一個演算法封裝起來,而且使它們還可以相互替換。 策略模式讓演算法獨立於使用它的客戶而獨立變化。   策略模式屬於物件的行為模式。其用意是針對一組演算法,將每一個演算法封裝到具有 共同介面的獨立的類中,

springmvc中的設計模式---模版方法模式

如果不使用模板方法模式,那麼對於ResourceBundleViewResolver、ThymeleafViewResolver等子類來說,都需要實現快取的操作,就造成了程式碼的大量冗餘;並且在一個類中同時實現了快取以及解析ViewName的功能,也違反了設計模式的單一職責的原則。

「補課」進行時:設計模式(3)——和做菜一樣簡單的模版方法模式

![](https://cdn.geekdigging.com/DesignPatterns/java_design_pattern.jpg) ## 1. 前文彙總 [「補課」進行時:設計模式系列](https://www.geekdigging.com/category/%e8%ae%be%e8%ae%

設計模式C++實現——工廠方法模式

對象 類型 begin 創建對象 dia rate rod rtu log 模式定義: 工廠方法模式定義了一個創建對象的接口,但由子類決定要實例化的類是哪一個。工廠方法讓類把實例化推遲到子類。 模式結構: Creator是一個類,它