Als Material zum Erlernen von GoF-Entwurfsmustern scheint das Buch "Einführung in Entwurfsmuster, die in der erweiterten und überarbeiteten Java-Sprache gelernt wurden" hilfreich zu sein. Da die aufgeführten Beispiele jedoch auf JAVA basieren, habe ich dieselbe Vorgehensweise mit Python versucht, um mein Verständnis zu vertiefen.
Das Adaptermuster ist eines der von GoF (Gang of Four; 4 Banden) definierten Entwurfsmuster. Mit dem Adaptermuster können Sie die Schnittstelle ändern, ohne vorhandene Klassen zu ändern. Es gibt "** Methode mit Vererbung " und " Methode mit Delegierung **" als Methode zum Realisieren des Adaptermusters.
UML class diagram
Der Adapter, der die Vererbung verwendet, wird realisiert, indem eine Unterklasse der Klasse erstellt wird, die Sie verwenden möchten, und die erforderliche Schnittstelle für diese Unterklasse implementiert wird.
Der Adapter, der die Delegierung verwendet, wird realisiert, indem eine Instanz der Klasse erstellt wird, die Sie verwenden möchten, und diese Instanz aus einer anderen Klasse verwendet wird. (Das Obige wird aus Wikipedia zitiert)
Eigentlich möchte ich ein Beispielprogramm ausführen, das das Adaptermuster verwendet, und das folgende Verhalten überprüfen.
$ python Main.py
(Hello)
*Hello*
Ähnlicher Code wurde in das Git-Repository hochgeladen. https://github.com/ttsubo/study_of_design_pattern/tree/master/Adapter
--Verzeichnisaufbau
.
├── Main.py
└── adapter
├── __init__.py
├── banner.py
├── print.py
└── print_banner.py
Die Rolle "Ziel" definiert die Schnittstelle, die am Verhalten der Instanz beteiligt ist. Im Beispielprogramm übernimmt die Klasse "Drucken" diese Rolle.
adapter/print.py
from abc import ABCMeta, abstractmethod
class Print(metaclass=ABCMeta):
@abstractmethod
def printWeak(self):
pass
@abstractmethod
def printStrng(self):
pass
Es ist eine Rolle, mit der Methode der Rolle "Ziel" zu arbeiten. Im Beispielprogramm übernimmt die Methode "startMain" diese Rolle.
Main.py
from adapter.print_banner import PrintBanner
def startMain():
p = PrintBanner("Hello")
p.printWeak()
p.printStrng()
if __name__ == '__main__':
startMain()
Hier wird die Methode implementiert, die tatsächlich in der Rolle des Adapters funktioniert. Im Beispielprogramm übernimmt die Klasse "Banner" diese Rolle.
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))
Die Rolle "Adapter" ist eine Klasse, die die Schnittstelle für die Rolle "Ziel" implementiert. Im Beispielprogramm übernimmt die PrintBanner-Klasse diese Rolle. Es gibt die folgenden zwei Methoden zum Realisieren des Adaptermusters.
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