บริบท
ฉันได้ใช้กับลำดับชั้นของวัตถุ (ต้นไม้นิพจน์) รูปแบบผู้เข้าชม "หลอก" (หลอกเพราะมันไม่ได้ใช้ส่งสองครั้ง):
public interface MyInterface
{
void Accept(SomeClass operationClass);
}
public class MyImpl : MyInterface
{
public void Accept(SomeClass operationClass)
{
operationClass.DoSomething();
operationClass.DoSomethingElse();
// ... and so on ...
}
}
การออกแบบนี้เป็นที่ตั้งคำถาม แต่ค่อนข้างสะดวกสบายเนื่องจากจำนวนการใช้งานของ MyInterface มีความสำคัญ (~ 50 หรือมากกว่า) และฉันไม่จำเป็นต้องเพิ่มการดำเนินการเพิ่มเติม
การใช้งานแต่ละอย่างนั้นไม่ซ้ำกัน (เป็นนิพจน์หรือตัวดำเนินการที่แตกต่างกัน) และบางรายการเป็นคอมโพสิต (เช่นโหนดโอเปอเรเตอร์ที่จะมีโอเปอเรเตอร์ / โหนดใบไม้)
Traversal ปัจจุบันดำเนินการโดยการเรียกการยอมรับการดำเนินการบนโหนดรูทของต้นไม้ซึ่งจะเรียกสายยอมรับในแต่ละโหนดลูกซึ่งในทางกลับกัน ... และอื่น ๆ ...
แต่ถึงเวลาแล้วที่ฉันต้องเพิ่มการทำงานใหม่เช่นการพิมพ์ที่สวยงาม
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);
}
}
โดยทั่วไปฉันเห็นสองตัวเลือก:
- คงการออกแบบเดิมโดยเพิ่มวิธีการใหม่สำหรับการทำงานของฉันในแต่ละคลาสที่ได้รับโดยมีค่าใช้จ่ายในการบำรุงรักษา (ไม่ใช่ตัวเลือก IMHO)
- ใช้รูปแบบผู้เข้าชม "จริง" โดยเสียค่าใช้จ่ายในการขยาย (ไม่ใช่ตัวเลือกเนื่องจากฉันคาดว่าจะมีการใช้งานเพิ่มเติมตามทาง ... ) โดยมีวิธีการเยี่ยมชมประมาณ 50+ แต่ละวิธีที่ตรงกับการใช้งานเฉพาะ ?
คำถาม
คุณจะแนะนำและใช้รูปแบบผู้เข้าชมหรือไม่ มีรูปแบบอื่นที่สามารถช่วยแก้ปัญหานี้ได้หรือไม่?
MyInterface
.. ไม่ทุกชั้นเรียนเหล่านั้นมีการดำเนินงานที่ไม่ซ้ำกันของDoSomething
และDoSomethingElse
? ฉันไม่เห็นว่าที่ชั้นผู้เข้าชมของคุณไปตามลำดับชั้นจริงๆ - ดูเหมือนว่าfacade
ในขณะนี้ ..