หลังจากเรียนวิชา Object-oriented and design pattern มาได้ครึ่งเทอม ก็ถึงเวลานำสิ่งที่ได้เรียนมามาใช้สักที ถึงจะเป็นแค่การเอามาใช้ทำการบ้านก็เถอะ เพราะการบ้านที่อาจารย์ให้ทำมันไม่ได้ง่ายอย่างที่คิดเลย ไหนๆ ก็นั่งทำความเข้าใจเรื่องที่เรียนซะตั้งนาน (ไม่งั้นทำการบ้านไม่ได้) ก็ขอเอามาเขียนลงบล็อกซะหน่อยนะครับ (ฮา)

ตอนแรกกะว่าจะเขียนทีเดียวทั้ง Mediator และ Observer ซึ่งเป็น pattern สองตัวหลักๆ ที่ต้องใช้ในการทำการบ้านนี้ แต่ว่าดูท่าจะยาวเกินไป ก็เลยขอตัดเรื่อง Observer ไปเขียนเป็นเรื่องใหม่ดีกว่า 🙂

หลักการของ Mediator pattern พอสรุปได้ว่ามันคือรูปแบบการสร้างคลาสและออบเจ็กต์ โดยให้มีคลาสหนึ่งเป็นตัวกลาง (Mediator) ในการติดต่อคลาสอื่นๆ ในโปรแกรม

mediator1
จากตัวอย่าง สมมติว่าเป็นโปรแกรมระบบข้อมูลสักอย่าง ซึ่งข้อมูลถูกเก็บอยู่ใน DataEntity (ไม่ใช่ database นะ) แล้ว user จะทำการแก้ไขข้อมูลที่เก็บไว้ใน DataEntity ผ่านทาง GUI ที่สร้างขึ้นใน UserInterface

จากแผนภาพจะเห็นได้ว่าตัวที่ทำการ implement พวก Listener มาใช้ หรือก็คือตัวที่ตอบสนองต่อเหตุการณ์ต่างๆ ที่เกิดจากผู้ใช้ก็คือคลาส Mediator ไม่ใช่ UserInterface

คลาส UserInterface เป็นเพียงตัวสร้าง component ต่างๆ เช่น drop-down list หรือปุ่มกดต่างๆ

เมื่อ Mediator รับรู้ถึงเหตุการณ์ที่เกิดจาก user (ซึ่งก็คือผู้ใช้กรอกข้อมูลเพื่อแก้ไขข้อมูลเดิมใน DataEntity) Mediator ก็จะไปทำการแก้ไขข้อมูลใน DataEntity

จะเห็นได้ว่า Mediator จะทำหน้าที่เป็นตัวกลางในการตอบสนองต่อเหตุการณ์ต่างๆ ที่เกิดขึ้น นอกจากนี้ยังใช้เป็นตัวกลางเพื่อให้ออบเจ็กต์ต่างๆ ทำงานร่วมกันได้ด้วย เช่น
mediator2
ในตัวอย่าง(ส่วนหนึ่งของการบ้านที่ต้องทำเลยนะเนี่ย) คลาส PostOffice ให้บริการระบบธนาณัติ โดยจะมีการสร้างออบเจ็กต์ของไปรษณีย์แต่ละสาขา แล้วก็สร้างออบเจ็กต์ของธนาณัติแต่ละใบเก็บไว้ใน list ของออบเจ็กต์ไปรษณีย์สาขาต่างๆ ซึ่งจากแผนภาพจะเห็นว่ามีออบเจ็กต์ของ PostOffice สามออบเจกต์ แล้วก็มีออบเจ็กต์ของ MoneyTransfer อีกสามออบเจ็กต์ ทั้งหมดทำงานร่วมกันได้ผ่านทาง Mediator นั่นคือ หากมีการส่งธนาณัติจากไปรษณีย์สาขาหนึ่งไปอีกสาขาหนึ่ง Mediator ก็จะรับหน้าที่ย้ายออบเจ็กต์ธนาณัติจากออบเจ็กต์ไปรษณีย์สาขาหนึ่งไปยังอีกสาขาหนึ่ง หรือก็คือ Mediator ทำหน้าที่ mapping ออบเจ็กต์ทุกตัวในระบบนั่นเอง

สามารถศึกษาข้อมูลเพิ่มเติมได้จาก http://en.wikipedia.org/wiki/Mediator_pattern (มีตัวอย่างโค้ดด้วย :D)