Bunun eski bir soru olduğunu biliyorum, ancak son zamanlarda uyguladığım ilginç bir örnek daha olduğunu düşünüyorum.
Bu, bir belge teslim sisteminde kullanılan strateji modelinin çok pratik bir örneğidir.
Çok sayıda belge ve bazı meta veriler içeren bir arşiv alan bir PDF dağıtım sistemim vardı. Meta verilere dayanarak belgeyi nereye koyacağına karar verdi; diyelim ki, verilere bağlı olarak, ben belgeyi depolayabilir A
, B
veya C
depolama sistemleri veya üçünün bir karışımını.
Farklı müşteriler bu sistemi kullanıyordu ve hata durumunda farklı geri alma / hata işleme gereksinimleri vardı: Biri teslimat sisteminin ilk hatada durmasını, tüm belgeleri önceden deposunda bırakmasını, ancak süreci durdurmasını ve başka hiçbir şey teslim etmemesini istedi. ; diğeri B
, depolama sırasında hata olması durumunda geri alınmasını istedi C
, ancak daha önce teslim edilmiş olanı bıraktı A
. Üçüncü veya dördüncü birinin de farklı ihtiyaçları olacağını hayal etmek kolaydır.
Sorunu çözmek için, teslimat mantığını ve ayrıca tüm depolardan geri alma yöntemlerini içeren temel bir teslim sınıfı oluşturdum. Bu yöntemler aslında hata durumunda doğrudan dağıtım sistemi tarafından çağrılmaz. Bunun yerine sınıf, hata durumunda çağrılan bir "Geri Alma / Hata İşleme Stratejisi" sınıfını (sistemi kullanan müşteriye dayalı olarak) almak için Bağımlılık Ekleme kullanır ve bu strateji için uygunsa geri alma yöntemlerini çağırır.
Teslimat sınıfı, strateji sınıfına ne olduğunu (hangi belgelerin hangi depolara teslim edildiğini ve hangi başarısızlıkların gerçekleştiğini) rapor eder ve bir hata meydana geldiğinde stratejiye devam edip etmeyeceğini sorar. Strateji "durdur" diyorsa, sınıf stratejinin "cleanUp" yöntemini çağırır; bu yöntem, teslimat sınıfından hangi geri alma yöntemlerinin çağrılacağına karar vermek için önceden bildirilen bilgileri kullanır veya hiçbir şey yapmaz.
rollbackStrategy.reportSuccessA(...);
rollbackStrategy.reportFailureB(...);
if (rollbackStrategy.mustAbort()) {
rollbackStrategy.rollback();
return false;
}
Şimdi iki farklı stratejim var: biri QuitterStrategy
(ilk hatadan çıkan ve hiçbir şeyi temizlemeyen) ve diğeri MaximizeDeliveryToAStrategy
(mümkün olduğunca işlemi iptal etmemeye çalışan ve depoya teslim edilen şeyleri asla geri almamaya çalışan A
, ancak B
teslimat C
başarısız olursa öğeleri geri alır ).
Benim anlayışıma göre, bu strateji modelinin bir örneğidir. Eğer (evet, okuyorsun) yanlış olduğumu düşünüyorsan, lütfen aşağıya yorum yap ve bana haber ver. Strateji modelinin "saf" kullanımını neyin oluşturacağını ve uygulamamın hangi yönlerinin tanımı ihlal ettiğini merak ediyorum. Strateji arayüzü biraz şişman olduğu için biraz komik göründüğünü düşünüyorum. Şimdiye kadar gördüğüm tüm örnekler yalnızca bir yöntem kullanıyor, ancak yine de bunun bir algoritmayı kapsadığını düşünüyorum (eğer bir iş mantığı parçası bir algoritma olarak kabul edilebilirse, ki öyle olduğunu düşünüyorum).
Strateji ayrıca teslimat uygulaması sırasında olaylar hakkında da bilgilendirildiğinden, bir Gözlemci olarak da düşünülebilir , ancak bu başka bir hikaye.
Küçük bir araştırma yapmaktan, bunun Danışman olarak adlandırılan bir "bileşik model" (MVC gibi, altında belirli bir şekilde birden fazla tasarım modeli kullanan bir model) olduğu anlaşılıyor . Bu, dağıtımın devam edip etmeyeceği konusunda bir danışmandır, ancak istendiğinde işleri geri alabildiğinden aynı zamanda etkin bir hata işleyicidir.
Her neyse, bu strateji modelinin kullanımlarının çok basit / aptalca olduğu hissine kapılmanıza neden olabilecek oldukça karmaşık bir örnek. Diğer kalıplarla birlikte kullanıldığında gerçekten karmaşık ve daha da uygulanabilir olabilir.