Strategy Design Pattern
Bir fonksiyonun birden fazla yapılış şekli olduğu takdirde, bu fonksiyonelliği farklı versiyonlarıyla kullanmak istendiğinde kullanılabilecek bir design patternidir.
Aynı işi farklı şekillerde yapan birden fazla concrete strategy classımız olduğunda bunları bir strategy class üzerinden clienta sunmak, strategy classına da bu concrete tiplere ait ortak ata olan interfaceyi vermek , ilerleyen zamanlarda bu concrete tiplere bir yenisi daha eklendiğinde , işimizi kolaylaştıracak, bu durumda tek yapmamız gereken bu concrete tipi ortak interfaceden türetmek yeterli olacaktır. Strategy tasarım kalıbının da yaptığı tam olarak budur.
Aşağıda biri XmlSerialize yapmak diğeri ise BinarySerilalize yapmak üzere iki adet concrete tipimiz var ve bunların ikisi de ISerializeable interfacesinden türetilmiştir. Yukarıda da bahsettiğim gibi iki concrete classımız serilaze ve deserialize işlemlerini yani temelde aynı işlemleri iki farklı şekilde yapan classtır. Birisi xml serialize-deserialize ederken diğeri binary serialize-deserialize eder. Dolayısıyla bu logic üzerinde strategy pattern kullanılabilir.
//Base Interface interface ISerializable { void Serialize(string str); void Deserialize(string str); } //Concrete tip 1 class XmlSerializer : ISerializable { public void Deserialize(string str) { Console.WriteLine("xml ters serileştirme"); } public void Serialize(string str) { Console.WriteLine("xml serileştirme"); } } //Concrete tip 2 class BinarySeriazlier : ISerializable { public void Deserialize(string str) { Console.WriteLine("binary ters serileştirme"); } public void Serialize(string str) { Console.WriteLine("binary serileştirme"); } }
Serializer sınıfı ise bizim strategy sınıfımızdır. Client tamamiyle bu class ile iletişime geçecek ve gönderilen argumanlar bu sınıf üzerinden değerlendirilecektir.
//Context tip class Serializer { ISerializable _serializer; public Serializer(ISerializable serializer) { _serializer = serializer; } public void Serialize(string str) { _serializer.Serialize(str); } public void Deserialize(string str) { _serializer.Deserialize(str); } }
Client tarafından yapılması gereken tek şey strategy classımız olan Serializer sınıfına ilgili parametrenin gönderilmesi ve çalıştırılmasıdır. İlerleyen zamanlarda Json serializer gibi bir yapının da yapıya eklenmek istendiğini düşünürsek yapılması gereken tek şey bunu ISerializable’dan kalıtmak olacak ve bu şekilde yeni concrete sınıfımız sisteme entegre olmuş olacak.
class Program { static void Main(string[] args) { Serializer srz = new Serializer(new XmlSerializer()); srz.Serialize("Stragey"); srz.Deserialize("Stragey"); srz = new Serializer(new BinarySeriazlier()); srz.Serialize(""); srz.Deserialize(""); } }