Entwurfsmuster nach Ruby Template-Methode Musternotiz

Ich lese "Entwurfsmuster mit Ruby", um die Entwurfsfähigkeit des Programms zu verbessern, und ich werde die Entwurfsmuster, die mich interessieren, einzeln zusammenfassen.

Dieses Mal habe ich das Muster der Vorlagenmethode zusammengefasst.

Informationen zum Muster der Vorlagenmethode

Es ist ein Muster, das den invarianten Teil in der Basisklasse beschreibt und den geänderten Teil in der in der Unterklasse definierten Methode kapselt.

Es basiert auf der Entwurfsidee, zu trennen, was sich ändert und was nicht.

Beispielcode

Ich werde nach meinem Hobby-Muskeltraining einen Beispielcode schreiben. Sowohl das Bankdrücken als auch die Federung haben den gleichen Trainingsfluss, aber der spezifische Fluss ist unterschiedlich.

Schreiben Sie daher ein Programm, das den Inhalt jedes Trainings ausgibt.

class Training
  def initialize(type)
    @type = type
  end

  def start
    prepare
    execute
    cleanup
  end

  def prepare
    if @type == :bench_press
      puts 'Starten Sie das Bankdrücken'
      puts 'Stellen Sie die Langhantel'
    elsif @type == :tinning
      puts 'Fangen Sie an zu hängen'
      puts 'Steig auf die Plattform'
    end
  end

  def execute
    puts 'Zug'
  end

  def cleanup
    puts 'Mit Alkohol desinfizieren'
    if @type == :bench_press
      puts 'Gib die Langhantel zurück'
    elsif @type == :tinning
      puts 'Verlasse die Plattform'
    end
  end
end

Übergeben Sie zum Zeitpunkt des Aufrufs den Trainingstyp als Argument. Das Ausführungsergebnis ist wie folgt.

bench_press = Training.new(:bench_press)
bench_press.start
#Starten Sie das Bankdrücken
#Stellen Sie die Langhantel
#Zug
#Mit Alkohol desinfizieren
#Gib die Langhantel zurück

tinning = Training.new(:tinning)
tinning.start
#Fangen Sie an zu hängen
#Steig auf die Plattform
#Zug
#Mit Alkohol desinfizieren
#Verlasse die Plattform

Verzweigung nach if Minuten nach Instanzvariable @type. Es wäre schön, zwei Arten von Training zu haben, aber wenn die Anzahl der Trainings zunimmt, nimmt dieser bedingte Zweig zu, was eine Methode lang und kompliziert macht.

Als nächstes beim Umschreiben durch Anwenden des Musters der Vorlagenmethode.

class Training
  def start
    prepare
    execute
    cleanup
  end

  def prepare
  end

  def execute
    puts 'Zug'
  end

  def cleanup
    puts 'Mit Alkohol desinfizieren'
  end
end

class BenchPress < Training
  def prepare
    puts 'Starten Sie das Bankdrücken'
    puts 'Stellen Sie die Langhantel'
  end

  def cleanup
    puts 'Gib die Langhantel zurück'
    super
  end
end

class Tinning < Training
  def prepare
    puts 'Fangen Sie an zu hängen'
    puts 'Steig auf die Plattform'
  end

  def cleanup
    super
    puts 'Verlasse die Plattform'
  end
end

Zum Zeitpunkt des Aufrufs wird eine Instanz der Unterklasse erstellt, und bevor das Muster der Vorlagenmethode angewendet wird, wurde das Trainingselement als Argument übergeben, aber das ist weg. Das Ausführungsergebnis ist wie folgt.

bench_press = BenchPress.new
bench_press.start
#Starten Sie das Bankdrücken
#Stellen Sie die Langhantel
#Zug
#Mit Alkohol desinfizieren
#Gib die Langhantel zurück


tinning = Tinning.new
tinning.start
#Fangen Sie an zu hängen
#Steig auf die Plattform
#Zug
#Mit Alkohol desinfizieren
#Verlasse die Plattform

Die Grundklasse Training definiert nur den Umriss des Trainings, und der spezifische Trainingsinhalt wird in Unterklassen definiert.

Wenn ich eine neue Unterklasse erstellen musste, musste ich nur die Unterklasse ändern, ohne die Basisklasse zu ändern, wodurch sie widerstandsfähiger gegen Änderungen wurde.

Zusammenfassung

Das Muster der Vorlagenmethode war ein objektorientiertes Entwurfsmuster unter Verwendung von Vererbung.

Persönlich denke ich, dass es das am häufigsten verwendete Designmuster ist, also möchte ich es beherrschen können.

Recommended Posts

Entwurfsmuster nach Ruby Template-Methode Musternotiz
Entwurfsmuster ~ Vorlagenmethode ~
C # gekautes Designmuster: TemplateMethod
Muster der Vorlagenmethode
Muster der Vorlagenmethode
[Entwurfsmuster] Allgemeine Logik mit der Vorlagenmethode
Entwurfsmuster ~ Fabrikmethode ~
Überdenken des Java8-Lambda-Ausdrucks- und Stream-Entwurfsmusters - Muster der Vorlagenmethode -
Java-Anfänger-Entwurfsmuster (Factory-Methodenmuster)
Entwurfsmuster ~ Builder ~
Ruby to_s Methode
Entwurfsmuster ~ Besucher ~
Java-Entwurfsmuster
Entwurfsmuster ~ Proxy ~
Entwurfsmuster ~ Zustand ~
Factory Method Pattern
Entwurfsmuster ~ Strategie ~
Entwurfsmuster ~ Singleton ~
Entwurfsmuster ~ Composite ~
Entwurfsmuster (2): Builder
Entwurfsmuster (1): AbstractFactory
Entwurfsmuster ~ Befehl ~
Entwurfsmuster ~ Iterator ~
Entwurfsmuster ~ Fassade ~
Entwurfsmuster ~ Brücke ~
Entwurfsmuster ~ Mediator ~
Entwurfsmuster ~ Dekorateur ~
Entwurfsmuster ~ Interpreter ~
Factory Method Muster
Entwurfsmuster ~ Beobachter ~
Entwurfsmuster ~ Prototyp ~
[Ruby] Initialisierungsmethode
Entwurfsmuster ~ Memento ~
Ruby-Build-Methode
Entwurfsmuster ~ Adapter ~
Ruby-Accessor-Methode
Ruby Map Methode
Entwurfsmuster ~ Fliegengewicht ~
Java-Muster-Memo
C ++ - Entwurfsmuster (TemplateMethod-Muster)
Entwurfsmuster ~ Abstrakte Fabrik ~
Abkürzung für Ruby-Methode
Java-Lernnotiz (Methode)
Ruby grundlegende Syntaxnotizen
Hinweise zu Rubys Thread # [] = Methode
Definition der Rubinmethode
Zusammenfassung des GoF-Entwurfsmusters
[Ruby] Zusammenfassung der Methodendefinitionen
Zusammenfassung des Java-Entwurfsmusters
Entwurfsmuster ~ Verantwortungskette ~
Punkt 51: Signaturen der Entwurfsmethode sorgfältig