[PYTHON] 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)

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 J'ai étudié les modèles de conception (mémo personnel) Partie 5 J'ai étudié les modèles de conception (mémo personnel) Partie 6

Modèle d'observateur

«Le but est d'observer les changements d'état, mais l'accent est plutôt mis sur la« notification »que sur« l'observation ». --Lorsque l'état d'une instance change, l'instance elle-même «notifie» le changement d'état à «l'observateur». --Exemple

En fait utiliser

Matière

Observer_1.png

Résumé des modèles d'observateur

Observer_2.png

Motif de souvenir

--Mémento: Souvenir, souvenir

En fait utiliser

Matière

--Une addition ――Ajout de 1 à 5 ...

# -*- coding:utf-8 -*-


class Memento:
    """Classe de souvenir qui garde une trace"""
    result = -1 #Représente la progression du calcul

    def __init__(self, temp):
        """Constructeur qui reçoit la progression du calcul comme argument"""
        Memento.result = temp


class Calc:
    """Une classe qui représente un seul calcul."""
    temp = 0

    @staticmethod
    def plus(plus):
        """Méthode pour effectuer l'addition"""
        Calc.temp += plus

    @staticmethod
    def create_memento():
        """Une méthode pour obtenir la progression comme Memento"""
        return Memento(Calc.temp)

    @staticmethod
    def set_memento(memento: Memento):
        """Obtenez la progression du calcul de Memento et réglez-la sur temp"""
        Calc.temp = memento.result

    @staticmethod
    def get_temp():
        """Méthode pour obtenir le résultat du calcul"""
        return Calc.temp


class Calculator:

    def __init__(self):
        self.result_dict = {}

    def run(self):
        c = Calc()

        #Premier calcul
        for i in range(1, 6):
            c.plus(i)

        print(f"Addition jusqu'à 5: {c.get_temp()}")
        self.result_dict["Addition jusqu'à 5"] = c.create_memento()

        #Deuxième calcul
        c2 = Calc()
        c2.set_memento(self.result_dict["Addition jusqu'à 5"])

        #Premier calcul
        for i in range(6, 11):
            c2.plus(i)

        print(f"Addition jusqu'à 10: {c2.get_temp()}")
        self.result_dict["Addition jusqu'à 10"] = c2.get_temp()


if __name__ == '__main__':
    c = Calculator()
    c.run()

――En laissant une certaine étape comme "instantané", vous pouvez rapidement revenir à l'état à ce moment-là.

Résumé des modèles Memento

Memento.png

Modèle d'état

En fait utiliser

Matière

--Conversation au travail ――La façon dont vous attribuez les tâches change en fonction de l'humeur de votre patron (je déteste ce genre de lieu de travail ...) --Quand vous êtes de bonne humeur

Subordonnés: Bonjour
Patron: Bonjour
Subordonnés: je vais faire xxx aujourd'hui
Patron: Bonne chance

--Quand vous êtes de mauvaise humeur

Subordonnés: Bonjour
Patron: Oh
Subordonnés: je vais faire xxx aujourd'hui
Patron: Hey, tu m'as dit de faire ooo? L'AS-tu fait?
Subordonné: (je n'ai pas entendu ...) Je suis désolé, je le ferai bientôt! !! !! !! !! !! !! !!

--Code

# -*- coding:utf-8 -*-


class Boss:
    STATE_ORDINARY = 0  #Boss normal
    STATE_IN_BAD_MOOD = 1   #Patron de mauvaise humeur

    def __init__(self):
        self.state = -1  #Représente l'état du boss

    def change_state(self, state):
        """Changer le statut de votre patron"""
        self.state = state

    def morning_greet(self):
        """Retourner le salut du matin"""
        if self.state == Boss.STATE_ORDINARY:
            return "Bonjour"
        elif self.state == Boss.STATE_IN_BAD_MOOD:
            return "Oh"
        else:
            pass

    def assign_task(self):
        """Secouez la tâche"""
        if self.state == Boss.STATE_ORDINARY:
            return "Bon, bonne chance"
        elif self.state == Boss.STATE_IN_BAD_MOOD:
            return "Hé, tu as dit ooo? L'AS-tu fait?"
        else:
            pass

――Supposons que le patron de votre patron vous ait signalé et que vous ayez commencé à mieux gérer → Un nouveau modèle est né ――Ce n'est pas cool de modifier la branche if --Dans le modèle State, préparez une classe qui représente "l'état" et rendez cet "état" interchangeable.

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


class State(metaclass=ABCMeta):

    @staticmethod
    def morning_greet():
        """Salutation du matin"""
        pass

    @staticmethod
    def assign_task():
        """Secouez la tâche"""
        pass


class BadMoodState(State):

    @staticmethod
    def morning_greet():
        return "Oh"

    @staticmethod
    def assign_task():
        return "Hé, tu as dit ooo? L'AS-tu fait?"


class OrdinaryState(State):

    @staticmethod
    def morning_greet():
        return "Bonjour"

    @staticmethod
    def assign_task():
        return "Bon, bonne chance"


class StatePatternBoss:

    def __init__(self):
        self.state = None

    def change_state(self, state: State):
        self.state = state

    def morning_greet(self):
        return self.state.morning_greet()

    def assign_task(self):
        return self.state.assign_task()


if __name__ == '__main__':

    boss_state = StatePatternBoss()

    print("=====Jour 1: Bonne humeur=====")
    boss_state.change_state(OrdinaryState())
    print("Subordonnés: Bonjour")
    print(f"patron:{boss_state.morning_greet()}")
    print("Subordonnés: je vais faire xxx aujourd'hui")
    print(f"patron:{boss_state.assign_task()}")

    print("=====Jour 2: mauvaise humeur=====")
    boss_state.change_state(BadMoodState())
    print("Subordonnés: Bonjour")
    print(f"patron:{boss_state.morning_greet()}")
    print("Subordonnés: je vais faire xxx aujourd'hui")
    print(f"patron:{boss_state.assign_task()}")

=====Jour 1: Bonne humeur=====
Subordonnés: Bonjour
Patron: Bonjour
Subordonnés: je vais faire xxx aujourd'hui
Patron: Bonne chance
=====Jour 2: mauvaise humeur=====
Subordonnés: Bonjour
Patron: Oh
Subordonnés: je vais faire xxx aujourd'hui
Patron: Hey, tu m'as dit de faire ooo? L'AS-tu fait?

―― En faisant cela, il est facile de répondre même si le modèle d'humeur augmente

(Omission)
class GoodMoodState(State):

    @staticmethod
    def morning_greet():
        return "Bonjour! Faisons de notre mieux aujourd'hui!"

    @staticmethod
    def assign_task():
        return "Comme c'est gentil! L'autre ooo était aussi bien! Bonne chance avec cette condition!"
(Omis)
    print("=====Jour 3: Bonne humeur=====")
    boss_state.change_state(GoodMoodState())    #Changez juste ici
    print("Subordonnés: Bonjour")
    print(f"patron:{boss_state.morning_greet()}")
    print("Subordonnés: je vais faire xxx aujourd'hui")
    print(f"patron:{boss_state.assign_task()}")
=====Jour 3: Bonne humeur=====
Subordonnés: Bonjour
Patron: Bonjour! Faisons de notre mieux aujourd'hui!
Subordonnés: je vais faire xxx aujourd'hui
Patron: Bien! L'autre ooo était aussi bien! Bonne chance avec cette condition!

Résumé des modèles d'état

State.png

Modèle de poids mouche

--Flyweight: signifie "fly weight" en anglais

En fait utiliser

Matière

# -*- coding:utf-8 -*-


class HumanLetter:

    def __init__(self, letter):
        self._letter = letter

    def get_letter(self):
        return self._letter


class Main:

    @staticmethod
    def take_a_photo(letter: HumanLetter):
        """Prendre une photo"""
        print(letter.get_letter())

    def main(self):
        """Créer une lettre"""
        a = HumanLetter("Ah")
        self.take_a_photo(a)

        i = HumanLetter("je")
        self.take_a_photo(i)

        ha = HumanLetter("Est")
        self.take_a_photo(ha)

        a2 = HumanLetter("Ah")
        self.take_a_photo(a2)

        o = HumanLetter("Oh")
        self.take_a_photo(o)

        yo = HumanLetter("Yo")
        self.take_a_photo(yo)

        ri = HumanLetter("Ri")
        self.take_a_photo(ri)

        mo = HumanLetter("Aussi")
        self.take_a_photo(mo)

        a3 = HumanLetter("Ah")
        self.take_a_photo(a3)

        o2 = HumanLetter("Oh")
        self.take_a_photo(o2)

        i2 = HumanLetter("je")
        self.take_a_photo(i2)


if __name__ == '__main__':
    h = Main()
    h.main()

―― Le même caractère apparaît plusieurs fois. ――Si vous venez de prendre une photo, vous pouvez la réutiliser ...

# -*- coding:utf-8 -*-


class HumanLetter:

    def __init__(self, letter):
        self._letter = letter

    def get_letter(self):
        return self._letter


class Main:

    @staticmethod
    def take_a_photo(letter: HumanLetter):
        """Prendre une photo"""
        print(letter.get_letter())

    def main(self):
        """Créer une lettre"""
        a = HumanLetter("Ah")
        self.take_a_photo(a)

        i = HumanLetter("je")
        self.take_a_photo(i)

        ha = HumanLetter("Est")
        self.take_a_photo(ha)

        self.take_a_photo(a)

        o = HumanLetter("Oh")
        self.take_a_photo(o)

        yo = HumanLetter("Yo")
        self.take_a_photo(yo)

        ri = HumanLetter("Ri")
        self.take_a_photo(ri)

        mo = HumanLetter("Aussi")
        self.take_a_photo(mo)

        self.take_a_photo(a)

        self.take_a_photo(o)

        self.take_a_photo(i)


if __name__ == '__main__':
    h = Main()
    h.main()

# -*- coding:utf-8 -*-


class HumanLetter:

    def __init__(self, letter):
        self._letter = letter

    def get_letter(self):
        return self._letter


class HumanLetterFactory:
    __singleton = None
    __human_letter = None

    def __new__(cls, *args, **kwargs):
        if cls.__singleton is None:
            cls.__singleton = super(HumanLetterFactory, cls).__new__(cls)
        return cls.__singleton

    def __init__(self):
        self.dic = {}

    def get_human_letter(self, letter: str):

        try:
            human_letter = self.dic[letter]
        except KeyError:
            human_letter = HumanLetter(letter)
            self.dic[letter] = human_letter

        return human_letter



class Main:

    @staticmethod
    def take_a_photo(letter: HumanLetter):
        """Prendre une photo"""
        print(letter.get_letter())

    def main(self):
        """Créer une lettre"""

        #Créer un singleton
        hlf = HumanLetterFactory()

        a = hlf.get_human_letter("Ah")
        self.take_a_photo(a)
        print(a)

        i = hlf.get_human_letter("je")
        self.take_a_photo(i)
        print(i)

        ha = hlf.get_human_letter("Est")
        self.take_a_photo(ha)

        a2 = hlf.get_human_letter("Ah")
        self.take_a_photo(a2)
        print(a2)

        o = hlf.get_human_letter("Oh")
        self.take_a_photo(o)
        print(o)

        yo = hlf.get_human_letter("Yo")
        self.take_a_photo(yo)

        ri = hlf.get_human_letter("Ri")
        self.take_a_photo(ri)

        mo = hlf.get_human_letter("Aussi")
        self.take_a_photo(mo)

        a3 = hlf.get_human_letter("Ah")
        self.take_a_photo(a3)
        print(a3)

        o2 = hlf.get_human_letter("Oh")
        self.take_a_photo(o2)
        print(o2)

        i2 = hlf.get_human_letter("je")
        self.take_a_photo(i2)
        print(i2)


if __name__ == '__main__':
    h = Main()
    h.main()

Ah
<__main__.HumanLetter object at 0x1039c4da0> #C'est une instance courante dans "A"
je
<__main__.HumanLetter object at 0x1039c4dd8>
Est
Ah
<__main__.HumanLetter object at 0x1039c4da0>  #C'est une instance courante dans "A"
Oh
<__main__.HumanLetter object at 0x1039c4e48>
Yo
Ri
Aussi
Ah
<__main__.HumanLetter object at 0x1039c4da0> #C'est une instance courante dans "A"
Oh
<__main__.HumanLetter object at 0x1039c4e48>
je
<__main__.HumanLetter object at 0x1039c4dd8>

Résumé du modèle de poids mouche

Flyweight.png

Recommended Posts

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 5 (modèle composite, modèle décorateur, modèle visiteur)
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 6 (modèle de chaîne de responsabilité, modèle de façade, modèle de médiateur)
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 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 #Builder
J'ai écrit un modèle de conception dans l'édition Kotlin Prototype
J'ai bien étudié Systemd
Modèle de conception #Observer