[JAVA] Modèle de conception C ++ (modèle TemplateMethod)

introduction

Actuellement, afin d'apprendre les modèles de conception, je lis "Introduction aux modèles de conception appris dans le langage Java augmenté et révisé", qui est très considéré comme un livre de modèles de conception. Cependant, littéralement, les modèles de conception de ce livre sont écrits en Java, j'ai donc réécrit le code Java de ce livre en C ++ pour mon propre apprentissage qui utilise principalement C ++. Le code Java original peut être téléchargé depuis ici. Cette fois, j'ai écrit le code de la version C ++ de Template Method. (* 2018/11/21 Correction d'un bug qui provoquait une fuite de mémoire dans le destructeur AbstractDisplay *)

Qu'est-ce que la méthode de modèle?

TemplateMethod est un modèle dans lequel les classes avec des fonctions similaires sont regroupées et la superclasse détermine le flux de traitement. Par exemple, la fonction de modèle de Powerpo a le même travail de création de la même diapositive, et je pense que chaque modèle a un design légèrement différent.

Classe CharDisplay

~~ En fait, le type d'argument du constructeur devrait être char, mais c'est ennuyeux et l'essence ne change pas, donc je l'ai mis à std :: string. C'est une omission de le faire. ~~ Corrigé pour fonctionner correctement avec le type char.

CharDisplay.cpp


#include"CharDisplay.h"

CharDisplay::CharDisplay(const char *ch) : ch(ch){}


void CharDisplay::open() {
	std::cout << "<<" ;
}

void CharDisplay::print() {
	std::cout << ch;
}

void CharDisplay::close() {
	std::cout << ">>" << std::endl;
}

CharDisplay.h


#pragma once
#include"AbstractDisplay.h"

class CharDisplay : public AbstractDisplay {
private:
	const char *ch;

public:
	CharDisplay(const char *ch);
    void open();
	void print();
	void close();
};

Classe StringDisplay

StringDisplay.cpp


#include"StringDisplay.h"

StringDisplay::StringDisplay(std::string string) :string(string), width(string.size()) {}

void StringDisplay::open()
{
	printLine();
}

void StringDisplay::print()
{
	std::cout << "|" + string + "|" << std::endl;
}

void StringDisplay::close()
{
	printLine();
}

void StringDisplay::printLine()
{
	std::cout << "+";

	for (int i = 0; i < width; i++) {
		std::cout << "-";
	}
	std::cout << "+" << std::endl;
}

StringDisplay.h


#pragma once
#include"AbstractDisplay.h"
#include<string>

class CharDisplay : public AbstractDisplay {
private:
	std::string ch;

public:
	CharDisplay(std::string Newch);
    void open();
	void print();
	void close();
};

Classe AbstractDisplay (y compris la fonction principale)

Ici, nous avons utilisé unique_ptr pour reproduire le garbage collection Java. De plus, étant donné que final est utilisé dans le code Java d'origine, nous utilisons également final ajouté à partir de C ++ 11 ici.

AbstractDisplay.cpp


#include"AbstractDisplay.h"
#include"StringDisplay.h"
#include"CharDisplay.h"

void AbstractDisplay::display()
 {
	open();
	for (int i = 0; i < 5; i++) {
		print();
	}
	close();
}

int main() {
	std::unique_ptr<AbstractDisplay> d1(new CharDisplay("H"));
	std::unique_ptr<AbstractDisplay> d2(new StringDisplay("hello world"));
	std::unique_ptr<AbstractDisplay> d3(new StringDisplay("Bonjour"));

	d1->display();
	d2->display();
	d3->display();

}

AbstractDisplay.h


#pragma once
#include<iostream>
#include<string>
#include<memory>

class AbstractDisplay {
public:
  virtual ~AbstractDisplay() {};
	virtual void open() = 0;
	virtual void print() = 0;
	virtual void close() = 0;
	virtual void display() final;
};

finalement

Puisque cet article s'est concentré sur la réécriture du code original en C ++, l'explication du modèle de conception lui-même a été coupée. Si vous souhaitez en savoir plus sur le modèle de conception et l'explication du code d'origine, nous vous recommandons «Introduction aux modèles de conception appris dans le langage Java augmenté et révisé» qui contient le code d'origine. Nous espérons que cet article aidera les apprenants C ++ qui sont aux prises avec des modèles de conception.

Recommended Posts

Modèle de conception C ++ (modèle TemplateMethod)
Modèle de conception mâché C #: TemplateMethod
Modèle de conception ~ Constructeur ~
Modèle de conception ~ Visiteur ~
Modèle de conception Java
Modèle de conception ~ Proxy ~
Modèle de conception ~ État ~
Modèle de conception ~ Stratégie ~
Modèle de conception ~ Singleton ~
Modèle de conception ~ Composite ~
Modèle de conception (2): constructeur
Modèle de conception (1): AbstractFactory
Modèle de conception ~ Commande ~
Modèle de conception ~ Itérateur ~
Modèle de conception ~ Façade ~
Modèle de conception ~ Pont ~
Modèle de conception ~ Médiateur ~
Modèle de conception ~ Décorateur ~
Modèle de conception ~ Interprète ~
Modèle de conception ~ Observateur ~
Modèle de conception ~ Prototype ~
Modèle de conception ~ Memento ~
Modèle de conception ~ Adaptateur ~
Modèle de conception ~ Poids mouche ~
Modèle de conception ~ Méthode d'usine ~
Modèle de conception ~ Usine abstraite ~
Résumé du modèle de conception du GoF
Modèle de conception ~ Méthode de modèle ~
Résumé du modèle de conception Java
Modèle de conception ~ Chaîne de responsabilité ~
[Design pattern] Bibliothèque de base Java
Modèle de conception par la méthode Ruby Template Mémo de modèle
Exemple d'application du modèle de conception (n ° 1)
Modèle de conception Java pour débutant (modèle de méthode d'usine)
[Modèle de conception] Logique commune avec la méthode de modèle
La direction de Java dans "C ++ Design and Evolution"