Head First Design Patterns'in Duck örneğinde gösterildiği gibi bağlam mirası, strateji modeliyle alakasız mı?


10

In Head First Design Patterns o öğretir strateji deseni Duck farklı alt sınıfları zamanında belirli bir davranışı atanabilecek bir ördek örneği kullanarak. Anladığım kadarıyla, strateji modelinin amacı, çalışma zamanında tek bir nesnenin davranışını değiştirmek , ancak çeşitli Duck türlerinin davranışlarını değiştirmek için Duck'ın mirasını kullanıyorlar.

Strateji Düzeni

Uygunluk?

Ördek'in bağlamsal mirası, strateji modeliyle alakasız mı yoksa değişen Duck türleri mi ve davranışlarını değiştirmek de strateji modelini kullanmak için iyi bir neden mi? Her ikisini de değiştirmeniz gereken durumlar strateji modelini kullanmak için iyi bir neden mi oluşturuyor? Bunu neden strateji örneği örneği olarak dahil ettiler?

Daha Basit Bir Örnek

Bu örneği sadece bir Duck sınıfına (türetilmiş sınıf olmadan) sahip olarak basitleştirebilir miyim? Daha sonra bir ördek nesnesini uygularken, kendi nesne türüne bağlı olmayan belirli koşullara bağlı olarak farklı davranışlar atanabilir. Örneğin: FlyBehavior hava durumuna göre değişir veya QuackBehavior günün saatine veya bir ördeğin ne kadar aç olduğuna bağlı olarak değişir. Bunun kitaptaki sorundan farklı bir sorunu çözeceğini anlıyorum, ancak aradığım şey, geri dönecek ilgili bir strateji örneği örneği.

Yukarıdaki örneğim de strateji modelini oluşturur mu?

Düzenle:

Bağlam kalıtımı olmayan sadece strateji kalıplarına daha sıkı bağlı olan 2 daha basit strateji modeli örneği bulmayı başardım : Hunter.java ve solver.py .

Yanıtlar:


7

Evet, sanırım doğru yoldasınız. Strateji kalıbını kullanan sınıfın bir alt sınıf olması gerekmez. Strateji modeli, kodun yeniden kullanımı için devralmaya bir alternatiftir . Bu, kalıtım ile kompozisyon arasındaki daha geniş karşılaştırmaya geri dönmektedir.

Gönderen Tasarım Kalıpları: Yeniden kullanılabilir OOP Unsurları Eğer strateji deseni için kullanacağı

  • Alt sınıfların patlamasından kaçının (davranış kombinasyonları nedeniyle)
  • Çalışma zamanında davranışı değiştirmeniz gerekiyorsa

Quack ve Fly davranışlarını uygulamak için kalıtım kullandıysanız, tüm bu alt sınıfların tüm davranış kombinasyonlarını temsil etmesi ile sonuçlanırsınız.

  • FlyableQuackableDuck
  • FlyableSqeakableDuck
  • FlyableMuteDuck
  • NoFlyQuackableDuck
  • NoFlySqueakableDuck
  • NoFlyMuteDuck

Bu kadar çok alt sınıfa sahip olmak sürdürmeyi zorlaştırmaktadır, bu yüzden bu durumda strateji modeli tercih edilmektedir. Esneklik ve Quackability'yi kapsayan iki özelliğe ihtiyacınız vardır ve bunları yeni sınıflar oluşturmadan karıştırabilir ve eşleştirebilirsiniz.

Ayrıca, hava koşullarının değişmesi durumunda ördek Fly özelliğinin koşullardan dolayı bir NoFly nesnesiyle değiştirilebileceğinin çalışma zamanı avantajından da bahsetmiştiniz.

Bu, mümkün olduğunda miras yerine kompozisyonu tercih etme tavsiyesi ile tutarlıdır.


1

Bu örneği sadece bir Duck sınıfına (türetilmiş sınıf olmadan) sahip olarak basitleştirebilir miyim? Daha sonra bir ördek nesnesini uygularken, kendi nesne türüne bağlı olmayan belirli koşullara bağlı olarak farklı davranışlar atanabilir.

Kesinlikle. İlham almak için Head First Nesneye Dayalı Analiz ve Tasarım'a göz atın . Enstrüman alt sınıflarının patladığını gösteren "Rick'in Gitarları" var . Bunu düzeltmek için, tüm bu değişen davranışlar bir "spesifikasyon" sınıfına sarılır, değişen kapsülleme prensibine uyulur .

Soyut Fabrika - Bağlam Bazlı İnşaat

İşte desen . BTW, stratejinin kendisini kullandığını unutmayın.

Uygulamaya değil konsepte odaklanma ... Güneşli veya yağmurlu vb. Koşullara dayalı şartname nesneleri oluşturan bir "WeatherFactory" olabilir .

Bu "NoFlyInFogQuackableMallard" şeyleri inşa almak için "fabrika fabrikaları" olabilir. Ve aslında, Soyut Fabrika düzeni budur. Bu nedenle, belki de genel ördek türleri yapmak için bir DuckFactory, sonra ördek türüne özgü sisli hava davranışı vermek için bir WeatherFactory.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.