Konteks
Saya telah menggunakan dengan hierarki objek (pohon ekspresi) pola pengunjung "semu" (semu, karena di dalamnya tidak menggunakan pengiriman ganda):
public interface MyInterface
{
void Accept(SomeClass operationClass);
}
public class MyImpl : MyInterface
{
public void Accept(SomeClass operationClass)
{
operationClass.DoSomething();
operationClass.DoSomethingElse();
// ... and so on ...
}
}
Desain ini, bagaimanapun dapat dipertanyakan, cukup nyaman karena jumlah implementasi MyInterface signifikan (~ 50 atau lebih) dan saya tidak perlu menambahkan operasi tambahan.
Setiap implementasi unik (ini ekspresi atau operator yang berbeda), dan beberapa komposit (yaitu, simpul operator yang akan berisi simpul operator / daun lainnya).
Traversal saat ini dilakukan dengan memanggil operasi Terima pada simpul akar pohon, yang pada gilirannya memanggil Terima pada masing-masing simpul anaknya, yang pada gilirannya ... dan seterusnya ...
Tetapi saatnya telah tiba di mana saya perlu menambahkan operasi baru , seperti pencetakan cantik:
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);
}
}
Saya pada dasarnya melihat dua opsi:
- Jaga desain yang sama, menambahkan metode baru untuk operasi saya ke setiap kelas turunan, dengan biaya pemeliharaan (bukan pilihan, IMHO)
- Gunakan pola Pengunjung "benar", dengan biaya ekstensibilitas (bukan opsi, karena saya perkirakan akan ada lebih banyak implementasi yang datang di sepanjang jalan ...), dengan sekitar 50+ kelebihan metode Kunjungan, masing-masing cocok dengan implementasi tertentu ?
Pertanyaan
Apakah Anda akan merekomendasikan menggunakan pola Pengunjung? Apakah ada pola lain yang bisa membantu menyelesaikan masalah ini?
MyInterface
.. apakah semua kelas memiliki implementasi unik DoSomething
dan DoSomethingElse
? Saya tidak melihat di mana kelas pengunjung Anda benar-benar melintasi hierarki - sepertinya lebih seperti facade
saat ini ..