Reversible Command Pattern
sources disponibles
http://blogs.msdn.com/pedram/archive/2007/10/02/reversible-command-pattern.aspx
sources disponibles
http://blogs.msdn.com/pedram/archive/2007/10/02/reversible-command-pattern.aspx
| Décembre 2009 | ||||||||||
| L | M | M | J | V | S | D | ||||
| 1 | 2 | 3 | 4 | 5 | 6 | |||||
| 7 | 8 | 9 | 10 | 11 | 12 | 13 | ||||
| 14 | 15 | 16 | 17 | 18 | 19 | 20 | ||||
| 21 | 22 | 23 | 24 | 25 | 26 | 27 | ||||
| 28 | 29 | 30 | 31 | |||||||
|
||||||||||
|
public abstract class Strategy
{
//autres membres
public abstract void Method1();
}
|
|
public class ConcreteStrategyA :
Strategy
{
public override void Method1()
{
}
}
|
|
public class Context
{
Strategy strategy;
public Context(Strategy strategy)
{
this.strategy = strategy;
}
public void CallMethod1()
{
strategy.Method1();
}
}
|
|
// en définissant directement la strategie utilisée
Strategy strategy =
new ConcreteStrategyA();
Strategy strategy = new ConcreteStrategyB();
// ou en passant par le context
Context context = new Context(new ConcreteStrategyA());
context.CallMethod1();
Context context = new Context(new ConcreteStrategyB());
context.CallMethod1();
|
|
public abstract class AbstractClassFactory
{
public abstract BaseObject CreateObject();
}
// IMPLEMENTATION
public class ConcreteClassAFactory :
AbstractClassFactory
{
public override BaseObject CreateObject()
{
return new ObjectA();
}
}
public class ConcreteClassBFactory :
AbstractClassFactory
{
public override BaseObject CreateObject()
{
return new ObjectB();
}
}
//
public abstract class BaseObject
{
}
public class ObjectA : BaseObject
{
}
public class ObjectB : BaseObject
{
}
// FABRIQUE
public static class ClassFactories
{
public static AbstractClassFactory GetAbstractClassFactory(string paramaterName)
{
if (paramaterName == "A")
return new ConcreteClassAFactory();
else
return new ConcreteClassBFactory();
}
}
// utilisation
public class Client
{
private AbstractClassFactory
factory;
// Constructor
public Client(AbstractClassFactory
factory)
{
this.factory = factory;
}
public BaseObject CreateObject()
{
BaseObject _object
= factory.CreateObject();
return _object;
}
}
|
|
public class Singleton
{
private static Singleton uniqueInstance;
//autres variables
private Singleton()
{ }
public static Singleton GetInstance()
{
if (uniqueInstance == null)
uniqueInstance = new Singleton();
return uniqueInstance;
}
//autres méthodes
}
|
|
public class Singleton
{
private static readonly Singleton uniqueInstance = new Singleton();
//autres variables
private Singleton()
{ }
public static Singleton GetInstance()
{
return uniqueInstance;
}
//autres méthodes
}
|
|
public class SousSingleton : Singleton
{
//autres variables
private SousSingleton()
: base()
{
}
//autres méthodes
}
|
|
public class Singleton
{
private static Singleton uniqueInstance = null;
private static readonly object uniqueInstanceLocker = new object();
// constructeur Private
private Singleton()
{ }
// méthode permettant de récupérer l'uniqueinstance est static
public static Singleton GetInstance()
{
lock (uniqueInstanceLocker)
{
if (uniqueInstance ==
null)
uniqueInstance = new Singleton();
return
uniqueInstance;
}
}
}
|
|
class Program
{
static void Main(string[] args)
{
Singleton singleton = Singleton.GetInstance();
Singleton sousSingleton = SousSingleton.GetInstance();
}
}
|
|
Abstraction
|
|
Interface de classe ou classe abstraite
|
|
// ne contient que des méthodes à implémenter
public interface IAbstractInterfaceFactory
{ }
// ou
// contient des membres et des méthodes abstraites à implémenter
public abstract class AbstractClassFactory
{ }
|
|
Implémentation
|
|
Classes héritant de l’interface ou de la classe abstraite
|
|
public class ConcreteClass1Factory : AbstractClassFactory // ou IAbstractInterfaceFactory
{ }
public class ConcreteClass2Factory :
AbstractClassFactory // ou IAbstractInterfaceFactory
{ }
public class ConcreteClass3Factory :
AbstractClassFactory // ou IAbstractInterfaceFactory
{ }
// ...
|
|
Fabrique
|
|
Classe contenant une fonction attendant un paramètre
Cette méthode détermine à partir du paramètre l’instance de la classe « concrète » à créer et à retourner
|
|
public static class ClassFactories
{
public static AbstractClassFactory GetAbstractClassFactory(string parameter)
{
// retourne selon le parametre une nouvelle instance de
ConcreteClass1Factory ou ConcreteClass2Factory ou ConcreteClass3Factory
}
}
|
|
AbstractClassFactory abstractClassFactory = ClassFactories.GetAbstractClassFactory("mon parametre");
// ou
IAbstractInterfaceFactory iAbstractInterfaceFactory =
ClassFactories.GetAbstractClassFactory("mon parametre");
|
|
Déroulement :
on appelle la méthode GetFactory() de la fabrique DbProviderFactories
en passant un paramètre (le ProviderName ,ex : « System.Data.SqlClient »),
c’est grâce à ce paramètre que la classe concrète (SqlClientFactory,OleDbFactory,OdbcFactory) est déterminée
et qu’une instance de celle-ci(la classe concrète) est retournée
ensuite lorsque l’on fera appel aux méthodes CreateCommand(),… ce sera la méthode dans la classe concrète correspondante qui sera appelée
|
|
ex :
DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory("System.Data.SqlClient");
DbConnection dbConnection = dbProviderFactory.CreateConnection(); // c'est la
méthode CreateConnection de SqlClientFactory qui est appelée
|
Design patterns
|
public class Singleton
{
private static readonly Singleton _instance = new Singleton();
private Singleton()
{ }
public static Singleton GetInstance()
{
return _instance;
}
}
|
|
public class Singleton
{
private static Singleton _instance;
private Singleton()
{ }
public static Singleton GetInstance()
{
if (_instance == null)
_instance = new
Singleton();
return _instance ;
}
}
|
|
private void button1_Click(object sender,
EventArgs e)
{
Singleton.GetInstance().Message = "mon message";
MessageBox.Show(Singleton.GetInstance().Message);
Form2 oForm2 = new
Form2();
oForm2.ShowDialog();
}
|
|
private void button1_Click(object sender,
EventArgs e)
{
MessageBox.Show(Singleton.GetInstance().Message);
}
|
|
public class Singleton
{
private static readonly Singleton _instance = new Singleton();
public string Message;
private Singleton()
{ }
public static Singleton GetInstance()
{
return _instance;
}
}
|