J'ai étudié les modèles de conception (mémo personnel) Partie 5 (modèle composite, modèle décorateur, modèle visiteur)

introduction

Cet article est un mémo d'étude personnel. J'écris un article motivé par l'obsession que ce que j'entre doit être une sortie. J'écris cet article sur Qiita avec l'espoir que quelqu'un qui le connaît pourra signaler les erreurs et donner des conseils.

Je vis une vie professionnelle en tant qu'ingénieur, mais je n'ai pas bien appris les modèles de conception, alors j'ai essayé d'étudier.

Ce qui est décrit ici https://github.com/ck-fm0211/notes_desigh_pattern Je télécharge sur.

Journal passé

J'ai étudié les modèles de conception (mémo personnel) Partie 1 J'ai étudié les modèles de conception (mémo personnel) Partie 2 J'ai étudié les modèles de conception (mémo personnel) Partie 3 J'ai étudié les modèles de conception (mémo personnel) Partie 4

Motif composite

-Le motif composite facilite la manipulation des structures récursives en "identifiant le contenu avec le conteneur".

En fait utiliser

Matière

class File:
    def __init__(self, name):
        self._name = name

    def remove(self):
        print("{}A été supprimée".format(self._name))
class Directory:
    def __init__(self, name):
        self._name = name
        self._list = []

    def add(self, arg):
        self._list.append(arg)

    def remove(self):
        itr = iter(self._list)

        i = 0

        while next(itr, None) is not None:

            obj = self._list[i]

            if isinstance(obj, File):
                obj.remove()
            elif isinstance(obj, Directory):
                obj.remove()
            else:
                print("Ne peut pas être supprimé")

            i += 1

        print("{}A été supprimée".format(self._name))


if __name__ == "__main__":
    file1 = File("file1")
    file2 = File("file2")
    file3 = File("file3")
    file4 = File("file4")

    dir1 = Directory("dir1")
    dir1.add(file1)

    dir2 = Directory("dir2")
    dir2.add(file2)
    dir2.add(file3)

    dir1.add(dir2)
    dir1.add(file4)

    dir1.remove()
class DirectoryEntry(metaclass=ABCMeta):
    @abstractmethod
    def remove(self):
        pass

--Définissez uniquement la méthode remove dans l'interface DirectoryEntry --Implémenter la classe File et la classe Directory sous la forme de l'implémentation de ceci.

class File(DirectoryEntry):
    def __init__(self, name):
        self._name = name

    def remove(self):
        print("{}A été supprimée".format(self._name))


class Directory(DirectoryEntry):
    def __init__(self, name):
        self._name = name
        self._list = []

    def add(self, entry: DirectoryEntry):
        self._list.append(entry)

    def remove(self):
        itr = iter(self._list)

        i = 0

        while next(itr, None) is not None:

            obj = self._list[i]
            obj.remove()

            i += 1

        print("{}A été supprimée".format(self._name))
class SymbolicLink(DirectoryEntry):
    def __init__(self, name):
        self._name = name

    def remove(self):
        print("{}A été supprimée".format(self._name))

Résumé du motif composite

Composite.png

Motif décorateur

En fait utiliser

Matière

――A la boutique de crème glacée, vous pouvez choisir librement les garnitures. Le client n'a pas à faire de garnitures et peut sélectionner plusieurs garnitures en couches. --Définissez l'interface suivante comme interface commune pour la crème glacée.

class Icecream(metaclass=ABCMeta):

    @abstractmethod
    def get_name(self):
        pass

    @abstractmethod
    def how_sweet(self):
        pass

―― En tant que classes avec ces interfaces, la classe de crème glacée à la vanille, la classe de crème glacée au matcha, etc. sont fournies comme suit.

class VanillaIcecream(Icecream):
    def get_name(self):
        return "Glace à la vanille"

    def how_sweet(self):
        return "Saveur vanille"


class GreenTeaIcecream(Icecream):
    def get_name(self):
        return "Glace au matcha"

    def how_sweet(self):
        return "Saveur de matcha"
class CashewNutsVanillaIcecream(Icecream):
    def get_name(self):
        return "Glace aux noix de cajou et à la vanille"

«Ce genre d '« ajout de fonctions utilisant l'héritage »devient très fixe. --Par exemple, si vous voulez une instance qui représente la crème glacée au matcha avec des noix de cajou, vous avez besoin de la classe de succession de crème glacée au matcha.

class CashewNutsToppingIcecream(Icecream):

    def __init__(self, ice: Icecream):
        self._ice = ice

    def get_name(self):
        name = "Noix de cajou"
        name += self._ice.get_name()
        return name

    def how_sweet(self):
        return self._ice.how_sweet()

--CashewNutsToppingIcecream classe est une classe qui représente la crème glacée garnie de noix de cajou. --Cette classe implémente l'interface Icecream, et sa méthode getName () renvoie la valeur obtenue par getName () de sa propre variable d'instance ice (instance Icecream) plus la chaîne "noix de cajou". Renvoie comme. De plus, dans la méthode howSweet (), la valeur de retour de la méthode howSweet () de la variable d'instance ice est renvoyée telle quelle. ―― En concevant comme ceci, comme indiqué ci-dessous, de la glace à la vanille garnie de noix de cajou, de la crème glacée au matcha garnie de noix de cajou, de la glace à la vanille garnie d'amandes tranchées, d'amandes tranchées et de noix de cajou. Il est possible de garnir dans diverses combinaisons telles que la crème glacée à la vanille garnie des deux.

ice1 = CashewNutsToppingIcecream(VanillaIcecream())  #Glace à la vanille avec garniture de noix de cajou
ice2 = CashewNutsToppingIcecream(GreenTeaIcecream())  #Glace au matcha avec garniture de noix de cajou

Résumé des modèles de décorateur

Decorator.png

Modèle de visiteur

--Dans le modèle Visiteur, il est facile d'ajouter un traitement en décrivant le "traitement" dans l'objet Visiteur qui est le visiteur.

En fait utiliser

Matière

# -*- coding:utf-8 -*-
from abc import ABCMeta, abstractmethod


#Classe des enseignants
class Teacher(metaclass=ABCMeta):

    def __init__(self, students):
        self._students = students

    @abstractmethod
    def visit(self, student_home):
        getattr(self, 'visit_' + student_home.__class__.__name__.lower())(student_home)

    @abstractmethod
    def get_student_list(self):
        return self._students


#Classe de professeur débutant
class RookieTeacher(Teacher):

    def __init__(self, students):
        super().__init__(students)

    def visit(self, student_home):
        print("Bonjour enseignant")
        super().visit(student_home)

    @staticmethod
    def visit_tanaka(tanaka):
        tanaka.praised_child()

    @staticmethod
    def visit_suzuki(suzuki):
        suzuki.reproved_child()

    def get_student_list(self):
        return self._students


#Cours à domicile
class Home(metaclass=ABCMeta):
    @staticmethod
    def praised_child():
        pass

    @staticmethod
    def reproved_child():
        pass


#Interface d'acceptation
class TeacherAcceptor(metaclass=ABCMeta):

    def accept(self, teacher: Teacher):
        pass


#La famille de Suzuki
class Suzuki(Home, TeacherAcceptor):
    @staticmethod
    def praised_child():
        print("Suzuki Mother: Oh, si tu es professeur, fais une blague")

    @staticmethod
    def reproved_child():
        print("Suzuki Mother: C'est seulement pour mon enfant ...")

    def accept(self, teacher: Teacher):
        teacher.visit(self.__class__)


#La famille de M. Tanaka
class Tanaka(Home, TeacherAcceptor):
    @staticmethod
    def praised_child():
        print("Tanaka Mother: Oh, si vous êtes enseignant, faites une blague")

    @staticmethod
    def reproved_child():
        print("Mère Tanaka: Pas question, c'est seulement pour mon enfant ...")

    def accept(self, teacher: Teacher):
        teacher.visit(self.__class__)

if __name__ == "__main__":
    rt = RookieTeacher(["suzuki", "tanaka"])

    rt.visit(Suzuki())
    rt.visit(Tanaka())

―― La méthode d'acceptation de chaque ménage appelle la méthode de visite de l'enseignant (visiteur) pour réaliser un traitement commun.

Résumé des modèles de visiteurs

Visitor.png

Impressions

――Je pense qu'il y a un meilleur exemple ...

Recommended Posts

J'ai étudié les modèles de conception (mémo personnel) Partie 5 (modèle composite, modèle décorateur, modèle visiteur)
J'ai étudié les modèles de conception (mémo personnel) Partie 3 (modèle de prototype, modèle de constructeur)
J'ai étudié les modèles de conception (mémo personnel) Partie 4 (modèle AbstractFactory, modèle de pont, modèle de stratégie)
J'ai étudié les modèles de conception (mémo personnel), partie 8 (modèle proxy, modèle de commande, modèle d'interprétation)
J'ai étudié les modèles de conception (mémo personnel) Partie 7 (modèle d'observateur, modèle de souvenir, modèle d'état, modèle de poids mouche)
J'ai étudié les modèles de conception (mémo personnel) Partie 6 (modèle de chaîne de responsabilité, modèle de façade, modèle de médiateur)
Modèle de conception #Decorator
À propos du modèle de visiteur
J'ai bien étudié Systemd