mirror of
https://github.com/rjNemo/design-patterns
synced 2026-06-06 02:26:40 +00:00
57 lines
1.6 KiB
Python
57 lines
1.6 KiB
Python
from abc import ABC, abstractmethod
|
|
|
|
|
|
class AbstractClass(ABC):
|
|
"""
|
|
The Abstract Class defines a template method that contains a skeleton of
|
|
some algorithm, composed of calls to (usually) abstract primitive
|
|
operations.
|
|
|
|
Concrete subclasses should implement these operations, but leave the
|
|
template method itself intact.
|
|
"""
|
|
|
|
def template_method(self) -> None:
|
|
"""
|
|
The template method defines the skeleton of an algorithm.
|
|
"""
|
|
|
|
self.base_operation1()
|
|
self.required_operations1()
|
|
self.base_operation2()
|
|
self.hook1()
|
|
self.required_operations2()
|
|
self.base_operation3()
|
|
self.hook2()
|
|
|
|
"""These operations already have implementations."""
|
|
|
|
def base_operation1(self):
|
|
print("AbstractClass says: I am doing the bulk of the work")
|
|
|
|
def base_operation2(self):
|
|
print("AbstractClass says: But I let subclasses override some operations")
|
|
|
|
def base_operation3(self):
|
|
print("AbstractClass says: But I am doing the bulk of the work anyway")
|
|
|
|
"""These operations have to be implemented in subclasses."""
|
|
|
|
@abstractmethod
|
|
def required_operations1(self):
|
|
pass
|
|
|
|
@abstractmethod
|
|
def required_operations2(self):
|
|
pass
|
|
|
|
"""
|
|
These are "hooks." Subclasses may override them, but it's not mandatory since the hooks already have default (but
|
|
empty) implementation. Hooks provide additional extension points in some crucial places of the algorithm.
|
|
"""
|
|
|
|
def hook1(self):
|
|
pass
|
|
|
|
def hook2(self):
|
|
pass
|