Modèle de conception par la méthode Ruby Template Mémo de modèle

Je lis "Design Patterns with Ruby" pour améliorer la capacité de conception du programme, et je vais résumer les modèles de conception qui m'intéressent un par un.

Cette fois, j'ai résumé le modèle de méthode de modèle.

À propos du modèle de méthode de modèle

Il s'agit d'un modèle qui décrit la partie invariante dans la classe de base et encapsule la partie modifiée dans la méthode définie dans la sous-classe.

Il est basé sur l'idée de conception de séparer ce qui change et ce qui ne change pas.

Exemple de code

J'écrirai un exemple de code après mon entraînement musculaire amateur. Le développé couché et la suspension ont le même flux d'entraînement, mais le flux spécifique est différent.

Par conséquent, écrivez un programme qui produit le contenu de chaque formation.

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

  def start
    prepare
    execute
    cleanup
  end

  def prepare
    if @type == :bench_press
      puts 'Démarrer le développé couché'
      puts 'Réglez la barre'
    elsif @type == :tinning
      puts 'Commencez à vous accrocher'
      puts 'Montez sur la plateforme'
    end
  end

  def execute
    puts 'Train'
  end

  def cleanup
    puts 'Désinfecter avec de l'alcool'
    if @type == :bench_press
      puts 'Retournez la barre'
    elsif @type == :tinning
      puts 'Descendez de la plateforme'
    end
  end
end

Au moment de l'appel, transmettez le type d'entraînement comme argument. Le résultat de l'exécution est le suivant.

bench_press = Training.new(:bench_press)
bench_press.start
#Démarrer le développé couché
#Réglez la barre
#Train
#Désinfecter avec de l'alcool
#Retournez la barre

tinning = Training.new(:tinning)
tinning.start
#Commencez à vous accrocher
#Montez sur la plateforme
#Train
#Désinfecter avec de l'alcool
#Descendez de la plateforme

Branchement par if minutes par variable d'instance @type. Ce serait bien d'avoir deux types de formation, mais à mesure que le nombre de formations augmente, cette branche conditionnelle augmente, ce qui rend une méthode longue et compliquée.

Ensuite, lors de la réécriture en appliquant le modèle de méthode modèle.

class Training
  def start
    prepare
    execute
    cleanup
  end

  def prepare
  end

  def execute
    puts 'Train'
  end

  def cleanup
    puts 'Désinfecter avec de l'alcool'
  end
end

class BenchPress < Training
  def prepare
    puts 'Démarrer le développé couché'
    puts 'Réglez la barre'
  end

  def cleanup
    puts 'Retournez la barre'
    super
  end
end

class Tinning < Training
  def prepare
    puts 'Commencez à vous accrocher'
    puts 'Montez sur la plateforme'
  end

  def cleanup
    super
    puts 'Descendez de la plateforme'
  end
end

Au moment de l'appel, une instance de la sous-classe est créée et avant d'appliquer le modèle de méthode de modèle, l'élément d'apprentissage a été transmis en tant qu'argument, mais il n'y en a plus. Le résultat de l'exécution est le suivant.

bench_press = BenchPress.new
bench_press.start
#Démarrer le développé couché
#Réglez la barre
#Train
#Désinfecter avec de l'alcool
#Retournez la barre


tinning = Tinning.new
tinning.start
#Commencez à vous accrocher
#Montez sur la plateforme
#Train
#Désinfecter avec de l'alcool
#Descendez de la plateforme

La classe de base Formation définit uniquement le plan de la formation et le contenu de la formation spécifique est défini dans les sous-classes.

Quand j'avais besoin de créer une nouvelle sous-classe, je n'avais qu'à changer la sous-classe sans changer la classe de base, ce qui la rendait plus résistante au changement.

Sommaire

Le modèle de méthode de modèle était un modèle de conception orienté objet utilisant l'héritage.

Personnellement, je pense que c'est le design pattern le plus fréquemment utilisé, donc je veux pouvoir le maîtriser.

Recommended Posts

Modèle de conception par la méthode Ruby Template Mémo de modèle
Modèle de conception ~ Méthode de modèle ~
Modèle de conception mâché C #: TemplateMethod
Modèle de méthode de modèle
Modèle de modèle de méthode
[Modèle de conception] Logique commune avec la méthode de modèle
Modèle de conception ~ Méthode d'usine ~
Repenser les modèles d'expression et de conception de flux Java8 - Modèle de méthode
Modèle de conception Java pour débutant (modèle de méthode d'usine)
Modèle de conception ~ Constructeur ~
Méthode Ruby to_s
Modèle de conception ~ Visiteur ~
Modèle de conception Java
Modèle de conception ~ Proxy ~
Modèle de conception ~ État ~
Modèle de méthode d'usine
Modèle de conception ~ Stratégie ~
Modèle de conception ~ Singleton ~
Modèle de conception ~ Composite ~
Modèle de conception (2): constructeur
Modèle de conception (1): AbstractFactory
Modèle de conception ~ Commande ~
Modèle de conception ~ Itérateur ~
Modèle de conception ~ Façade ~
Modèle de conception ~ Pont ~
Modèle de conception ~ Médiateur ~
Modèle de conception ~ Décorateur ~
Modèle de conception ~ Interprète ~
Modèle de méthode d'usine
Modèle de conception ~ Observateur ~
Modèle de conception ~ Prototype ~
[Ruby] méthode d'initialisation
Modèle de conception ~ Memento ~
Méthode de construction Ruby
Modèle de conception ~ Adaptateur ~
Méthode d'accesseur Ruby
méthode de la carte rubis
Modèle de conception ~ Poids mouche ~
Mémo de modèle Java
Modèle de conception C ++ (modèle TemplateMethod)
Modèle de conception ~ Usine abstraite ~
abréviation de la méthode ruby
Mémo d'apprentissage Java (méthode)
notes de syntaxe de base ruby
Remarques sur le fil de discussion Ruby # [] = méthode
définition de la méthode ruby
Résumé du modèle de conception du GoF
[Ruby] Résumé des définitions de méthode
Résumé du modèle de conception Java
Modèle de conception ~ Chaîne de responsabilité ~
Point 51: Concevoir soigneusement les signatures de méthode