En tant que matériel d'apprentissage des modèles de conception du GoF, le livre «Introduction aux modèles de conception appris dans le langage Java augmenté et révisé» semble être utile. Cependant, comme les exemples repris sont basés sur JAVA, j'ai essayé la même pratique avec Python pour approfondir ma compréhension.
Le modèle de méthode de modèle est l'un des modèles de conception définis par le GoF (Gang of Four; 4 gangs). Il appartient aux "Patterns liés au comportement". Le but du modèle de méthode de modèle est de prédéterminer un algorithme approximatif pour un processus et de laisser la conception spécifique de cet algorithme à une sous-classe. Par conséquent, il est souvent utilisé comme un moyen de construire un cadre système.
UML class diagram (Ce qui précède est cité sur Wikipedia)
Je voudrais exécuter un exemple de programme qui utilise le modèle de méthode modèle et vérifier le comportement suivant.
--Affichez la lettre «H» cinq fois de suite. De plus, avant et après, il est affiché entouré de "** << " et " >> **". --Affichez la chaîne de caractères "Hello, World!" 5 fois de suite. De plus, il est affiché entouré d'un cadre.
$ python Main.py
<<HHHHH>>
+-------------+
|Hello, World!|
|Hello, World!|
|Hello, World!|
|Hello, World!|
|Hello, World!|
+-------------+
Un code similaire a été téléchargé dans le référentiel Git. https://github.com/ttsubo/study_of_design_pattern/tree/master/TemplateMethod
.
├── Main.py
└── templatemethod
├── __init__.py
└── display.py
Le rôle ʻAbstractClassimplémente la méthode de modèle. Déclarez également la méthode abstraite utilisée dans la méthode modèle. Cette méthode abstraite est implémentée par le rôle de la sous-classe
ConcreteClass. Dans l'exemple de programme, la classe ʻAbstractDisplay
remplit ce rôle.
templatemethod/display.py
from abc import ABCMeta, abstractmethod
class AbstractDisplay(metaclass=ABCMeta):
@abstractmethod
def print(self):
pass
@abstractmethod
def open(self):
pass
@abstractmethod
def close(self):
pass
def display(self):
self.open()
for _ in range(5):
self.print()
self.close()
Implémentez concrètement la classe abstraite définie par le rôle de ʻAbstractClass. La méthode implémentée ici est appelée à partir de la méthode template qui joue le rôle de ʻAbstractClass
.
Dans l'exemple de programme, les classes CharDisplay
et StringDisplay
remplissent ce rôle.
templatemethod/display.py
class CharDisplay(AbstractDisplay):
def __init__(self, ch):
self.__ch = ch
def open(self):
print('<<', end='')
def print(self):
print(self.__ch, end='')
def close(self):
print('>>')
class StringDisplay(AbstractDisplay):
def __init__(self, string):
self.__string = string
self.__width = len(string)
def open(self):
self.__printLine()
def print(self):
print("|{0}|".format(self.__string))
def close(self):
self.__printLine()
def __printLine(self):
print('+', end='')
for _ in range(self.__width):
print('-', end='')
print('+')
Dans l'exemple de programme, la méthode startMain
remplit ce rôle.
Main.py
from templatemethod.display import CharDisplay, StringDisplay
def startMain():
d1 = CharDisplay('H')
d2 = StringDisplay("Hello, World!")
d1.display()
print("")
d2.display()
if __name__ == '__main__':
startMain()
Recommended Posts