mirror of
https://github.com/JakubVojvoda/design-patterns-cpp.git
synced 2025-12-16 20:37:05 +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