mirror of
https://github.com/JakubVojvoda/design-patterns-cpp.git
synced 2025-12-17 21:04:36 +03:00
add Template Method pattern
This commit is contained in:
12
template-method/README.txt
Normal file
12
template-method/README.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
## Template Method
|
||||||
|
|
||||||
|
Template method defines the skeleton of an algorithm in an operation, deferring some
|
||||||
|
steps to subclasses. It lets subclasses redefine certain steps of an algorithm
|
||||||
|
without changing the algorithm's structure. The pattern has behavioral purpose and
|
||||||
|
applies to the classes.
|
||||||
|
|
||||||
|
### When to use
|
||||||
|
|
||||||
|
* to implement the invariant parts of an algorithm once and leave it up to subclasses to implement the behavior that can vary
|
||||||
|
* when common behavior among subclasses should be factored and localizedin a common class to avoid code duplication
|
||||||
|
* to control subclasses extensions
|
||||||
59
template-method/TemplateMethod.cpp
Normal file
59
template-method/TemplateMethod.cpp
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/*
|
||||||
|
* C++ Design Patterns: Template Method
|
||||||
|
* Author: Jakub Vojvoda [github.com/JakubVojvoda]
|
||||||
|
* 2016
|
||||||
|
*
|
||||||
|
* Source code is licensed under MIT License
|
||||||
|
* (for more details see LICENSE)
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* AbstractClass
|
||||||
|
* implements a template method defining the skeleton of an algorithm
|
||||||
|
*/
|
||||||
|
class AbstractClass {
|
||||||
|
public:
|
||||||
|
void templateMethod() {
|
||||||
|
// ...
|
||||||
|
primitiveOperation1();
|
||||||
|
// ...
|
||||||
|
primitiveOperation2();
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void primitiveOperation1() = 0;
|
||||||
|
virtual void primitiveOperation2() = 0;
|
||||||
|
// ...
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Concrete Class
|
||||||
|
* implements the primitive operations to carry out specific steps
|
||||||
|
* of the algorithm, there may be many Concrete classes, each implementing
|
||||||
|
* the full set of the required operation
|
||||||
|
*/
|
||||||
|
class ConcreteClass : public AbstractClass {
|
||||||
|
public:
|
||||||
|
void primitiveOperation1() {
|
||||||
|
std::cout << "Primitive operation 1" << std::endl;
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
|
||||||
|
void primitiveOperation2() {
|
||||||
|
std::cout << "Primitive operation 2" << std::endl;
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
// ...
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
AbstractClass *tm = new ConcreteClass;
|
||||||
|
tm->templateMethod();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user