bağlam
Nesnelerin bir hiyerarşisi (bir ifade ağacı) bir "sözde" ziyaretçi desen (sözde, çift gönderme kullanmaz gibi) ile kullanıyorum:
public interface MyInterface
{
void Accept(SomeClass operationClass);
}
public class MyImpl : MyInterface
{
public void Accept(SomeClass operationClass)
{
operationClass.DoSomething();
operationClass.DoSomethingElse();
// ... and so on ...
}
}
Ancak, MyInterface'in uygulama sayısı önemli (~ 50 veya daha fazla) olduğundan ve fazladan işlem eklemem gerekmediğinden, bu tasarım tartışmalı, oldukça rahattı.
Her uygulama benzersizdir (farklı bir ifade veya işleç) ve bazıları kompozitlerdir (diğer işleç / yaprak düğümlerini içerecek işleç düğümleri).
Geçiş şu anda ağacın kök düğümündeki Accept işlemini çağırarak gerçekleştirilir, bu da sırayla alt düğümlerinin her birinde Accept'i çağırır ...
Ama güzel baskı gibi yeni bir işlem eklemem gereken zaman geldi :
public class MyImpl : MyInterface
{
// Property does not come from MyInterface
public string SomeProperty { get; set; }
public void Accept(SomeClass operationClass)
{
operationClass.DoSomething();
operationClass.DoSomethingElse();
// ... and so on ...
}
public void Accept(SomePrettyPrinter printer)
{
printer.PrettyPrint(this.SomeProperty);
}
}
Temel olarak iki seçenek görüyorum:
- Aynı tasarımı koruyarak, her türetilmiş sınıfa operasyonum için yeni bir yöntem ekleyerek, bakım pahasına (bir seçenek değil, IMHO)
- Genişletilebilirlik pahasına "gerçek" Ziyaretçi kalıbını kullanın (bir seçenek değil, yol boyunca daha fazla uygulama olmasını bekliyorum ...), her biri belirli bir uygulamaya uyan yaklaşık 50+ aşırı yükleme ile ?
Soru
Ziyaretçi kalıbını kullanmanızı tavsiye eder misiniz? Bu sorunun çözülmesine yardımcı olabilecek başka bir model var mı?
MyInterface
.. bu sınıfların her bir ilki gerçekleştiren var mı DoSomething
ve DoSomethingElse
? Ziyaretçi sınıfınızın aslında hiyerarşiyi facade