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 *)
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.
~~ 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();
};
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();
};
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;
};
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