Le motif facade

Définition

Le motif Façade doit mettre à disposition une interface simplifié pour la manipulation d’un groupe d’objet correspondant à un sous-système.

Principe

Il suffit de réaliser un objet sachant manipuler tous les objets du sous-système. Les objets en question ne doivent en rien modifier leur comportement, ça permet justement de pouvoir continuer à les utilisé “à l’ancienne” pour certain besoin. Cette façon vas donc proposer une serie de méthode simple qui regrouperons une série d’appel aux bon objets, dans le bonne ordre.

L’exemple par le code

Un peu de domotique ? Nous allons en mettre dans notre maison, et piloté par Ruby s’il vous plait. Voyons ce que nous allons automatiser chez nous:

class Chauffage
  def allume(piece)
    puts "Le cahuffage s'allume dans la pièce #{piece}" 
  end
  def reglage(piece,valeur)
    puts "Le cahuffage est réglé sur #{valeur} dans la pièce #{piece}" 
  end
  def eteindre(piece)
    puts "Eteind le chauffage dans #{piece}" 
  end
  def eteindre
    puts "Eteind le chauffage dans toutes les pièces" 
  end
end
class Lumiere
  def allume(piece)
    puts "La lumière s'allume dans la pièce #{piece}" 
  end
  def eteindre(piece)
    puts "Eteind le chauffage dans #{piece}" 
  end
  def eteindre
    puts "Eteind la lumière dans toutes les pièces" 
  end
end
class Cafetiere
  def allume
    puts "le café se met en route" 
  end
  def arret
    puts "la cafétière s'arrète" 
  end
end

Bon c’est assez rudimentaire, mais pour commencer ça devrais suffire :)

Ceci represente donc notre sous système d’objet de la maison. Les porteset volets pourrais en être un autres, ou venir s’ajouter. L’arrosage automatique aussi, par contre le système de sauvegarde de nos données n’a pas grand chose à voir.

Essayons d’écrire notre façade pour la manipulation de ce système, la partie maison.

class Facade_control_maison
  def initialize
    @chauffage = Chauffage.new
    @lumiere = Lumiere.new
    @cafetiere = Cafetiere.new
  end
  def reveil
    @chauffage.allume("salle de bain")
    @chauffage.reglage("salle de bain",10)
    @chauffage.allume("cuisine")
    @cafetiere.allume
    @lumiere.allume("salle de bain")
    @lumiere.allume("cuisine")
    @lumiere.allume("chambre")
  end
  def depart
    @chauffage.eteindre
    @lumiere.eteindre
    @cafetiere.arret
  end
  def arrive
    @lumiere.allume("salon")
    @chauffage.allume("salon")
    @chauffage.reglage("salon",8)
    @chauffage.allume("chambre")
    @chauffage.reglage("chambre",8)
  end
end

On à mis en place 3 méthodes simple, une qui se déclenche au reveil, une pour le départ de la maison et une pour le retour à la maison. (pour les gens qui habite le sud, chauffage pourrais être remplacé par clim :) ).

Comme on peut le voir, c’est la façade qui sais ce qu’il faut faire dans chaque cas. Sans la façade, chaque objet déclenchant toute ces actions devrais décrire et sans les oublié chacun des objets Chauffage, Lumiere et Cafetiere un peu lourd, alors autant s’en passer avec la Façade ;-).

Une Façade n’est pas exclusive, on peut très bien appeler quand même l’objet Lumiere pour affiner un réglage particulier…

J’aoubliais, voici de quoi tester notre façade:

maison = Facade_control_maison.new
maison.reveil
maison.depart
maison.arrive

Ce qui nous donnera:

Le cahuffage s'allume dans la pièce salle de bain
Le cahuffage est réglé sur 10 dans la pièce salle de bain
Le cahuffage s'allume dans la pièce cuisine
le café se met en route
La lumière s'allume dans la pièce salle de bain
La lumière s'allume dans la pièce cuisine
La lumière s'allume dans la pièce chambre
Eteind le chauffage dans toutes les pièces
Eteind la lumière dans toutes les pièces
la cafétière s'arrète
La lumière s'allume dans la pièce salon
Le cahuffage s'allume dans la pièce salon
Le cahuffage est réglé sur 8 dans la pièce salon
Le cahuffage s'allume dans la pièce chambre
Le cahuffage est réglé sur 8 dans la pièce chambre

A vos façades ;-)