[PYTHON] Ich habe über Designmuster (persönliches Memo) Teil 7 (Beobachtermuster, Erinnerungsmuster, Zustandsmuster, Fliegengewichtsmuster) studiert.

Einführung

Dieser Artikel ist ein persönliches Studienmemo. Ich schreibe einen Artikel, der von der Besessenheit getrieben ist, dass das, was ich eingebe, ausgegeben werden muss. Ich schreibe diesen Artikel über Qiita in der Hoffnung, dass jemand, der damit vertraut ist, auf Fehler hinweisen und Ratschläge geben kann.

Ich lebe ein Berufsleben als Ingenieur, aber ich habe nicht richtig über Entwurfsmuster gelernt, also habe ich versucht zu studieren.

Was ist hier beschrieben https://github.com/ck-fm0211/notes_desigh_pattern Ich lade auf.

Vergangenes Protokoll

Ich habe über Entwurfsmuster (persönliches Memo) Teil 1 studiert Ich habe über Entwurfsmuster (persönliches Memo) Teil 2 studiert Ich habe über Entwurfsmuster (persönliches Memo) Teil 3 studiert Ich habe über Entwurfsmuster (persönliches Memo) Teil 4 studiert Ich habe über Entwurfsmuster (persönliches Memo) Teil 5 studiert Ich habe über Entwurfsmuster (persönliches Memo) Teil 6 studiert

Beobachtermuster

――Der Zweck besteht darin, Änderungen im Zustand zu beobachten, sondern der Schwerpunkt liegt eher auf "Benachrichtigung" als auf "Beobachtung".

Eigentlich verwenden

Gegenstand

--Boss und Untergebene

Observer_1.png

Zusammenfassung der Beobachtermuster

Observer_2.png

Erinnerungsmuster

Eigentlich verwenden

Gegenstand

--Zusatz ――Adding 1 bis 5 ...

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


class Memento:
    """Erinnerungsklasse, die den Überblick behält"""
    result = -1 #Stellt den Fortschritt der Berechnung dar

    def __init__(self, temp):
        """Konstruktor, der den Berechnungsfortschritt als Argument erhält"""
        Memento.result = temp


class Calc:
    """Eine Klasse, die eine einzelne Berechnung darstellt."""
    temp = 0

    @staticmethod
    def plus(plus):
        """Methode zur Durchführung der Addition"""
        Calc.temp += plus

    @staticmethod
    def create_memento():
        """Eine Methode, um den Fortschritt als Memento zu erhalten"""
        return Memento(Calc.temp)

    @staticmethod
    def set_memento(memento: Memento):
        """Holen Sie sich den Berechnungsfortschritt von Memento und stellen Sie ihn auf temp"""
        Calc.temp = memento.result

    @staticmethod
    def get_temp():
        """Methode, um das Berechnungsergebnis zu erhalten"""
        return Calc.temp


class Calculator:

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

    def run(self):
        c = Calc()

        #Erste Berechnung
        for i in range(1, 6):
            c.plus(i)

        print(f"Zugabe bis zu 5: {c.get_temp()}")
        self.result_dict["Zugabe bis zu 5"] = c.create_memento()

        #Zweite Berechnung
        c2 = Calc()
        c2.set_memento(self.result_dict["Zugabe bis zu 5"])

        #Erste Berechnung
        for i in range(6, 11):
            c2.plus(i)

        print(f"Zugabe bis zu 10: {c2.get_temp()}")
        self.result_dict["Zugabe bis zu 10"] = c2.get_temp()


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

――Wenn Sie eine bestimmte Phase als "Schnappschuss" verlassen, können Sie schnell zu diesem Status zurückkehren.

Zusammenfassung der Erinnerungsmuster

Memento.png

Zustandsmuster

Eigentlich verwenden

Gegenstand

Untergebene: Guten Morgen
Boss: Guten Morgen
Untergebene: Ich mache heute xxx
Boss: Viel Glück
Untergebene: Guten Morgen
Boss: Oh
Untergebene: Ich mache heute xxx
Boss: Hey, hast du mir gesagt, ich soll ooo machen? Hast du es getan?
Untergebene: (habe ich nicht gehört ...) Es tut mir leid, ich werde es bald tun! !! !! !! !! !! !! !!

--Code

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


class Boss:
    STATE_ORDINARY = 0  #Normaler Chef
    STATE_IN_BAD_MOOD = 1   #Chef schlecht gelaunt

    def __init__(self):
        self.state = -1  #Repräsentiert den Status des Chefs

    def change_state(self, state):
        """Ändern Sie den Status Ihres Chefs"""
        self.state = state

    def morning_greet(self):
        """Geben Sie den Morgengruß zurück"""
        if self.state == Boss.STATE_ORDINARY:
            return "Guten Morgen"
        elif self.state == Boss.STATE_IN_BAD_MOOD:
            return "Oh"
        else:
            pass

    def assign_task(self):
        """Schütteln Sie die Aufgabe"""
        if self.state == Boss.STATE_ORDINARY:
            return "Viel Glück"
        elif self.state == Boss.STATE_IN_BAD_MOOD:
            return "Hey, hast du ooo gesagt? Hast du es getan?"
        else:
            pass

――Angenommen, der Chef Ihres Chefs hat darauf hingewiesen und Sie haben begonnen, besser damit umzugehen → Ein neues Muster wurde geboren ――Es ist nicht cool, den if-Zweig zu ändern

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


class State(metaclass=ABCMeta):

    @staticmethod
    def morning_greet():
        """Morgengruß"""
        pass

    @staticmethod
    def assign_task():
        """Schütteln Sie die Aufgabe"""
        pass


class BadMoodState(State):

    @staticmethod
    def morning_greet():
        return "Oh"

    @staticmethod
    def assign_task():
        return "Hey, hast du ooo gesagt? Hast du es getan?"


class OrdinaryState(State):

    @staticmethod
    def morning_greet():
        return "Guten Morgen"

    @staticmethod
    def assign_task():
        return "Viel Glück"


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("=====Tag 1: Gute Laune=====")
    boss_state.change_state(OrdinaryState())
    print("Untergebene: Guten Morgen")
    print(f"Boss:{boss_state.morning_greet()}")
    print("Untergebene: Ich mache heute xxx")
    print(f"Boss:{boss_state.assign_task()}")

    print("=====Tag 2: schlechte Laune=====")
    boss_state.change_state(BadMoodState())
    print("Untergebene: Guten Morgen")
    print(f"Boss:{boss_state.morning_greet()}")
    print("Untergebene: Ich mache heute xxx")
    print(f"Boss:{boss_state.assign_task()}")

=====Tag 1: Gute Laune=====
Untergebene: Guten Morgen
Boss: Guten Morgen
Untergebene: Ich mache heute xxx
Boss: Viel Glück
=====Tag 2: schlechte Laune=====
Untergebene: Guten Morgen
Boss: Oh
Untergebene: Ich mache heute xxx
Boss: Hey, hast du mir gesagt, ich soll ooo machen? Hast du es getan?

Auf diese Weise ist es einfach zu reagieren, selbst wenn das Stimmungsmuster zunimmt

(Unterlassung)
class GoodMoodState(State):

    @staticmethod
    def morning_greet():
        return "Guten Morgen! Lassen Sie uns heute unser Bestes geben!"

    @staticmethod
    def assign_task():
        return "Wie schön! Das andere ooo war auch nett! Viel Glück mit dieser Bedingung!"
(Weggelassen)
    print("=====Tag 3: Gute Laune=====")
    boss_state.change_state(GoodMoodState())    #Ändern Sie einfach hier
    print("Untergebene: Guten Morgen")
    print(f"Boss:{boss_state.morning_greet()}")
    print("Untergebene: Ich mache heute xxx")
    print(f"Boss:{boss_state.assign_task()}")
=====Tag 3: Gute Laune=====
Untergebene: Guten Morgen
Boss: Guten Morgen! Lassen Sie uns heute unser Bestes geben!
Untergebene: Ich mache heute xxx
Boss: Gut! Das andere ooo war auch nett! Viel Glück mit dieser Bedingung!

Zusammenfassung der Zustandsmuster

State.png

Fliegengewichtsmuster

--Flyweight: bedeutet auf Englisch "Fliegengewicht" --Muster konzentrierten sich auf die Verschwendung von Ressourcen durch gemeinsame Nutzung von Instanzen --Beispiel: Das kleine Bild, das für den Hintergrund der Homepage verwendet wird, wird nicht so oft über das Netzwerk ausgetauscht, wie es im Hintergrund angezeigt wird. In der Regel wird das Bild jedoch einmal erfasst und "das Bild" nebeneinander angezeigt.

Eigentlich verwenden

Gegenstand

--Versuchen Sie, eine Nachricht mit "menschlichen Zeichen" zu erstellen. ―― "Ai ist besser als Ao" ――Machen Sie jedes Zeichen mit "menschlichen Zeichen", machen Sie ein Bild vom Dach und lassen Sie es im Bild. --Wenn die Klasse, die ein einzelnes menschliches Zeichen darstellt, die HumanLetter-Klasse ist, lautet die Klasse, die eine Nachricht mit menschlichen Zeichen generiert, wie folgt.

# -*- 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):
        """Mach ein Foto"""
        print(letter.get_letter())

    def main(self):
        """Erstellen Sie einen Brief"""
        a = HumanLetter("Ah")
        self.take_a_photo(a)

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

        ha = HumanLetter("Ist")
        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("Ebenfalls")
        self.take_a_photo(mo)

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

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

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


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

――Das gleiche Zeichen wird häufig angezeigt. ――Wenn Sie nur ein Bild aufnehmen, können Sie es wiederverwenden ...

# -*- 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):
        """Mach ein Foto"""
        print(letter.get_letter())

    def main(self):
        """Erstellen Sie einen Brief"""
        a = HumanLetter("Ah")
        self.take_a_photo(a)

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

        ha = HumanLetter("Ist")
        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("Ebenfalls")
        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()

――Wir konnten die Anzahl kostspieliger Instanziierungen reduzieren (hier ein Konstruktor, der Personen neu anordnet, um Zeichen zu bilden. Ursprünglich kann der DB-Zugriff usw. in Betracht gezogen werden). Natürlich nimmt auch die Anzahl der Instanzen ab.

# -*- 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):
        """Mach ein Foto"""
        print(letter.get_letter())

    def main(self):
        """Erstellen Sie einen Brief"""

        #Singleton erstellen
        hlf = HumanLetterFactory()

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

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

        ha = hlf.get_human_letter("Ist")
        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("Ebenfalls")
        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("ich")
        self.take_a_photo(i2)
        print(i2)


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

Ah
<__main__.HumanLetter object at 0x1039c4da0> #Es ist eine häufige Instanz in "A"
ich
<__main__.HumanLetter object at 0x1039c4dd8>
Ist
Ah
<__main__.HumanLetter object at 0x1039c4da0>  #Es ist eine häufige Instanz in "A"
Oh
<__main__.HumanLetter object at 0x1039c4e48>
Yo
Ri
Ebenfalls
Ah
<__main__.HumanLetter object at 0x1039c4da0> #Es ist eine häufige Instanz in "A"
Oh
<__main__.HumanLetter object at 0x1039c4e48>
ich
<__main__.HumanLetter object at 0x1039c4dd8>

Zusammenfassung des Fliegengewichtsmusters

Flyweight.png

Recommended Posts

Ich habe über Designmuster (persönliches Memo) Teil 7 (Beobachtermuster, Erinnerungsmuster, Zustandsmuster, Fliegengewichtsmuster) studiert.
Ich habe über Designmuster (persönliches Memo) Teil 5 (Verbundmuster, Dekorationsmuster, Besuchermuster) studiert.
Ich habe über Designmuster studiert (persönliches Memo) Teil 4 (AbstractFactory-Muster, Brückenmuster, Strategiemuster)
Ich habe über Entwurfsmuster (persönliches Memo) Teil 8 (Proxy-Muster, Befehlsmuster, Interpreter-Muster) studiert.
Ich habe über Designmuster (persönliches Memo) Teil 6 (Muster der Verantwortungskette, Fassadenmuster, Vermittlermuster) studiert.
Ich habe über Designmuster (persönliches Memo) Teil 5 (Verbundmuster, Dekorationsmuster, Besuchermuster) studiert.
Ich habe über Designmuster studiert (persönliches Memo) Teil 4 (AbstractFactory-Muster, Brückenmuster, Strategiemuster)
Ich habe über Entwurfsmuster (persönliches Memo) Teil 8 (Proxy-Muster, Befehlsmuster, Interpreter-Muster) studiert.
Ich habe über Designmuster (persönliches Memo) Teil 7 (Beobachtermuster, Erinnerungsmuster, Zustandsmuster, Fliegengewichtsmuster) studiert.
Ich habe über Designmuster (persönliches Memo) Teil 6 (Muster der Verantwortungskette, Fassadenmuster, Vermittlermuster) studiert.
Entwurfsmuster #Builder
Ich habe ein Designmuster in der Kotlin Prototype Edition geschrieben
Ich habe richtig über Systemd gelernt
Entwurfsmuster #Observer