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 DoSomethingdan DoSomethingElse? Saya tidak melihat di mana kelas pengunjung Anda benar-benar melintasi hierarki - sepertinya lebih seperti facadesaat ini ..