สิ่งที่ผู้เขียนรูปแบบการออกแบบกังวลมากที่สุดคือรูปแบบ "ผู้เยี่ยมชม"
มันเป็น "ความชั่วร้ายที่จำเป็น" แต่มักจะถูกใช้มากเกินไปและความจำเป็นในการใช้มันมักจะเผยให้เห็นข้อบกพร่องพื้นฐานในการออกแบบของคุณ
ชื่ออื่นสำหรับรูปแบบ "ผู้เยี่ยมชม" คือ "การจัดส่งหลายรายการ" เนื่องจากรูปแบบผู้เยี่ยมชมคือสิ่งที่คุณลงท้ายด้วยเมื่อคุณต้องการใช้ภาษา OO สำหรับการจัดส่งประเภทเดียวเพื่อเลือกรหัสที่จะใช้ตามประเภทของสองประเภท (หรือมากกว่า) วัตถุที่แตกต่างกัน
ตัวอย่างคลาสสิกคือคุณมีจุดตัดระหว่างสองรูปร่าง แต่มีกรณีที่ง่ายกว่าที่มักถูกมองข้ามนั่นคือการเปรียบเทียบความเท่าเทียมกันของวัตถุสองชิ้นที่ต่างกัน
อย่างไรก็ตามบ่อยครั้งที่คุณจบลงด้วยสิ่งนี้:
interface IShape
{
double intersectWith(Triangle t);
double intersectWith(Rectangle r);
double intersectWith(Circle c);
}
ปัญหาคือคุณได้ใช้ "IShape" ร่วมกันทั้งหมด คุณบอกเป็นนัยว่าเมื่อใดก็ตามที่คุณต้องการเพิ่มรูปร่างใหม่ในลำดับชั้นคุณจะต้องเปลี่ยนการใช้งาน "รูปร่าง" อื่น ๆ ทั้งหมดด้วย
บางครั้งนี่เป็นการออกแบบที่เรียบง่าย แต่คิดให้ดี ไม่ออกแบบของคุณจริงๆเอกสารที่คุณจำเป็นต้องจัดส่งในสองประเภท? คุณยินดีที่จะเขียนการระเบิดหลายวิธีร่วมกันหรือไม่?
บ่อยครั้งโดยการแนะนำแนวคิดอื่นคุณสามารถลดจำนวนชุดค่าผสมที่คุณจะต้องเขียน:
interface IShape
{
Area getArea();
}
class Area
{
public double intersectWith(Area otherArea);
...
}
แน่นอนว่ามันขึ้นอยู่กับ - บางครั้งคุณจำเป็นต้องเขียนโค้ดเพื่อจัดการกับกรณีต่างๆเหล่านั้นจริงๆ - แต่มันก็คุ้มค่าที่จะหยุดและคิดก่อนที่จะกระโดดและใช้ผู้เยี่ยมชม อาจช่วยให้คุณไม่ต้องเจ็บปวดได้มากในภายหลัง