[JAVA] C ++ - Entwurfsmuster (TemplateMethod-Muster)

Einführung

Um Designmuster zu lernen, lese ich derzeit "Einführung in Designmuster, die in der erweiterten und überarbeiteten Java-Sprache gelernt wurden", das als Designmusterbuch hoch angesehen wird. Aber buchstäblich sind die Entwurfsmuster in diesem Buch in Java geschrieben, deshalb habe ich den Java-Code in diesem Buch für mein eigenes Lernen, das hauptsächlich C ++ verwendet, in C ++ umgeschrieben. Der ursprüngliche Java-Code kann von [hier] heruntergeladen werden (http://www.hyuki.com/dp/index.html#download). Dieses Mal habe ich den Code für die C ++ - Version der Vorlagenmethode geschrieben. (* 2018/11/21 Es wurde ein Fehler behoben, durch den ein Speicherverlust im AbstractDisplay-Destruktor * auftrat.)

Was ist die Vorlagenmethode?

TemplateMethod ist ein Muster, in dem Klassen mit ähnlichen Funktionen zusammengefasst werden und die Oberklasse den Verarbeitungsablauf bestimmt. Zum Beispiel hat die Vorlagenfunktion von Powerpo die gleiche Arbeit beim Erstellen derselben Folie, und ich denke, dass jede Vorlage ein etwas anderes Design hat.

CharDisplay-Klasse

~~ Eigentlich sollte der Argumenttyp des Konstruktors char sein, aber es ist ärgerlich und die Essenz ändert sich nicht, also habe ich ihn auf std :: string gesetzt. Es ist eine Unterlassung, dies zu tun. ~~ Behoben, dass es richtig mit dem Char-Typ funktioniert.

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-Klasse

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

AbstractDisplay-Klasse (einschließlich Hauptfunktion)

Hier haben wir unique_ptr verwendet, um die Java-Garbage Collection zu reproduzieren. Da final im ursprünglichen Java-Code verwendet wird, verwenden wir auch hier final, das aus C ++ 11 hinzugefügt wurde.

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("Hallo"));

	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;
};

Schließlich

Da sich dieser Artikel auf das Umschreiben des Originalcodes in C ++ konzentrierte, wurde die Erklärung des Entwurfsmusters selbst abgeschnitten. Wenn Sie mehr über das Entwurfsmuster und die Erläuterung des Originalcodes erfahren möchten, empfehlen wir "Einführung in Entwurfsmuster, die in der erweiterten und überarbeiteten Java-Sprache gelernt wurden", die den Originalcode enthält. Wir hoffen, dass dieser Artikel C ++ - Lernenden hilft, die mit Entwurfsmustern zu kämpfen haben.

Recommended Posts

C ++ - Entwurfsmuster (TemplateMethod-Muster)
C # gekautes Designmuster: TemplateMethod
Entwurfsmuster ~ Builder ~
Entwurfsmuster ~ Besucher ~
Java-Entwurfsmuster
Entwurfsmuster ~ Proxy ~
Entwurfsmuster ~ Zustand ~
Entwurfsmuster ~ Strategie ~
Entwurfsmuster ~ Singleton ~
Entwurfsmuster ~ Composite ~
Entwurfsmuster (2): Builder
Entwurfsmuster (1): AbstractFactory
Entwurfsmuster ~ Befehl ~
Entwurfsmuster ~ Iterator ~
Entwurfsmuster ~ Fassade ~
Entwurfsmuster ~ Brücke ~
Entwurfsmuster ~ Mediator ~
Entwurfsmuster ~ Dekorateur ~
Entwurfsmuster ~ Interpreter ~
Entwurfsmuster ~ Beobachter ~
Entwurfsmuster ~ Prototyp ~
Entwurfsmuster ~ Memento ~
Entwurfsmuster ~ Adapter ~
Entwurfsmuster ~ Fliegengewicht ~
Entwurfsmuster ~ Fabrikmethode ~
Entwurfsmuster ~ Abstrakte Fabrik ~
Zusammenfassung des GoF-Entwurfsmusters
Entwurfsmuster ~ Vorlagenmethode ~
Zusammenfassung des Java-Entwurfsmusters
Entwurfsmuster ~ Verantwortungskette ~
[Entwurfsmuster] Java-Kernbibliothek
Entwurfsmuster nach Ruby Template-Methode Musternotiz
Anwendungsbeispiel für Entwurfsmuster (Nr. 1)
Java-Anfänger-Entwurfsmuster (Factory-Methodenmuster)
[Entwurfsmuster] Allgemeine Logik mit der Vorlagenmethode
Die Richtung von Java in "C ++ Design and Evolution"