Annonce commerciale :

  
 English (United States) Français (France)
Inscription  
 
samedi 19 mai 2012

Annonce commerciale

Articles
05

Introduction au pattern builder en C#

Si on peut avoir une certaine confusion de compréhension entre le factory et le builder dans le monde "merveilleux" des patterns, j'avoue avoir une préférence pour le builder qui suffit amplement à mes besoins.

On utilise ce pattern quand on doit avoir une implémentation de classe différentes depuis la même interface... OK c'est du blabla. Mais prenons un cas concret. Imaginons qu'on fasse une authentification mais que plusieurs solutions soit possibles (depuis un LDAP, depuis KEBEROS, etc...) selon différents paramètres, ou imaginons qu'on doit dans ses tests tester la classe de connexion à un service web mais qu'on puisse le faire y compris si le service n'est pas dispo (en associant un pattern MVP ou dans Castle)... On a deux choix. Soit on implémente des méthodes différentes pour chaque type d'accès et on fait un if ou un switch pour choisir la bonne méthode... Mais si on ajoute une nouvelle implémentation il faudra changer aussi le code qu'il l'appelle, soit on utilise un pattern Builder (ou un factory qu'on verra après). 

Pour cela nous allons coder un constructeur de crèpes bretonnes...


Etape n°1 : Créons un webform

cc

avec comme éléments : 

 

        private System.Windows.Forms.RadioButton radioButton1;
        private System.Windows.Forms.RadioButton radioButton2;
        private System.Windows.Forms.CheckBox cbJambon;
        private System.Windows.Forms.CheckBox cbFromage;
        private System.Windows.Forms.CheckBox bxOeuf;
        private System.Windows.Forms.Button btGetIngredients;

Etape n°2 : Créons notre interface Ibuilder.cs

Dans ce cas il s'agit de définir notre interface qui sera commune à chacune de nos implémentations. Pour cela tapons ce code :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace BuilderPattern
{
    public  interface Ibuilder
    {
        int PreparerLaCrepe(); 
    }
}


 

Nous aurons donc une méthode partager par toutes nos implémentations, la méthode préparer la crèpe...

Etape n°3 : Implémentons nos différentes implémentations de notre pattern builder

Nous allons concevoir deux méthodes, une pour préparer une crèpe complète, une pour une crèpe jambon fromage (mon fils supporte mal les oeufs ). 

Pour cela créons le fichier builder.cs et tapons le code suivant...


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace BuilderPattern
{
    public class CrepeComplete : Ibuilder
    {
        public int PreparerLaCrepe()
        {
            MessageBox.Show("Une crepe Jambon Fromage Oeuf");
            return 1; 
        
        }
    }
    public class CrepeJambonFromage : Ibuilder
    {
        public int PreparerLaCrepe()
        {
            MessageBox.Show("Une crepe Jambon Fromage");
            return 2;
        }
    
    }

    public class Director
    {
        public int CommandeLaCrepe(Ibuilder build)
        {
            return build.PreparerLaCrepe();
        }
    }
    
}
Remarquez qu'en plus de nos deux recettes de crèpe, nous avons créée une classe Director qui contient la méthode CommandeLaCrepe(). C'est cette méthode qui sera invoquer depuis un objet instancé depuis notre interface mais créé avec la méthode correspondante à notre choix. 
 

Etape n°4 : Implémentons notre bouton

Tapez le code suivant :


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace BuilderPattern
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btGetIngredients_Click(object sender, EventArgs e)
        {
            int result = 0;
            if (radioButton1.Checked)
            {
                Director macrepe = new Director();
                Ibuilder build = new CrepeComplete();
                result = macrepe.CommandeLaCrepe(build);
                
            }
            if (radioButton2.Checked)
            {
                Director macrepe = new Director();
                Ibuilder build = new CrepeJambonFromage();
                 result = macrepe.CommandeLaCrepe(build);
            }
            if (result == 1)
            {
                cbFromage.Checked = true;
                cbJambon.Checked = true;
                cbOeuf.Checked = true;
            }
            else {
                cbFromage.Checked = true;
                cbJambon.Checked = true;
                cbOeuf.Checked = false;
            }
        }
    }
}

Conclusion

Avec cet exemple vous comprenez qu'il est possible de récuper des valeurs distintes (par exemple une chaine de connexion pour gérer différentes DB). Le Pattern Builder permet en fait de choisir dynamiquement l'implémentation qu'on souhaite utiliser. C'est simple et efficace. Jouer avec ce code ajouter des paramètres dans le directeur par exemple. Amusez vous ! 

Jérôme Fortias

Actions: E-mail | RSS comment feed |

Comments

There are currently no comments, be the first to post one.

Post Comment

Only registered users may post comments.
  
 Imprimer   


Les maques SAP, ABAP, BSP, Microsoft, .net, sont des marques déposées par leurs ayant-droiits.

Le site www.sap-integration.net est un site indépendant de SAP et de Microsoft et de tout autre éditeurs de logiciels ou fabricants de matériels.