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 d'adaptateur (modèle d'adaptateur) est l'un des modèles de conception définis par GoF (Gang of Four; 4 gangs). Le modèle d'adaptateur vous permet de changer l'interface sans modifier les classes existantes. Il existe "** méthode utilisant l'héritage " et " méthode utilisant la délégation **" comme méthode pour réaliser le modèle d'adaptateur.
UML class diagram
L'adaptateur utilisant l'héritage est réalisé en créant une sous-classe de la classe que vous souhaitez utiliser et en implémentant l'interface nécessaire pour cette sous-classe.
L'adaptateur utilisant la délégation est réalisé en créant une instance de la classe que vous souhaitez utiliser et en utilisant cette instance d'une autre classe. (Ce qui précède est cité sur Wikipedia)
En fait, je voudrais exécuter un exemple de programme qui utilise le modèle d'adaptateur et vérifier le comportement suivant.
--Afficher les chaînes de caractères entre parenthèses --Afficher avec * avant et après la chaîne de caractères
$ python Main.py
(Hello)
*Hello*
Un code similaire a été téléchargé dans le référentiel Git. https://github.com/ttsubo/study_of_design_pattern/tree/master/Adapter
.
├── Main.py
└── adapter
├── __init__.py
├── banner.py
├── print.py
└── print_banner.py
Le rôle Target
définit l'interface impliquée dans le comportement de l'instance.
Dans l'exemple de programme, la classe Print
remplit ce rôle.
adapter/print.py
from abc import ABCMeta, abstractmethod
class Print(metaclass=ABCMeta):
@abstractmethod
def printWeak(self):
pass
@abstractmethod
def printStrng(self):
pass
C'est un rôle de travailler en utilisant la méthode du rôle de Target
.
Dans l'exemple de programme, la méthode startMain
remplit ce rôle.
Main.py
from adapter.print_banner import PrintBanner
def startMain():
p = PrintBanner("Hello")
p.printWeak()
p.printStrng()
if __name__ == '__main__':
startMain()
Ici, nous implémentons la méthode qui fonctionne réellement dans le rôle de ʻAdapter. Dans l'exemple de programme, la classe
Banner` remplit ce rôle.
adapter/banner.py
class Banner(object):
def __init__(self, string):
self.__string = string
def showWithParen(self):
print("({0})".format(self.__string))
def showWithAster(self):
print("*{0}*".format(self.__string))
Le rôle ʻAdapterest une classe qui implémente l'interface pour le rôle
Target. Dans l'exemple de programme, la classe
PrintBanner` remplit ce rôle.
Il existe les deux méthodes suivantes pour réaliser le modèle d'adaptateur.
--Méthode utilisant l'héritage --Méthode utilisant la délégation
adapter/print_banner.py
from adapter.banner import Banner
from adapter.print import Print
class PrintBanner(Banner, Print):
def __init__(self, string):
super(PrintBanner, self).__init__(string)
def printWeak(self):
self.showWithParen()
def printStrng(self):
self.showWithAster()
adapter/print_banner.py
from adapter.banner import Banner
from adapter.print import Print
class PrintBanner(Print):
def __init__(self, string):
self.__banner = Banner(string)
def printWeak(self):
self.__banner.showWithParen()
def printStrng(self):
self.__banner.showWithAster()
Recommended Posts