อันนี้น่าจะเป็น Pattern ที่ 4 ที่เขียนกันครับ
ทำไมต้องใช้ Command Pattern
- ต้องการเชื่อมของหลายๆสิ่งเข้าด้วยกันได้ เช่น Remote กับเครื่องใช้ไฟฟ้า แต่ละอย่างในบ้าน เช่น หลอดไฟ, พัดลม หรือ ทีวี ที่มีลักษณะการทำงานคล้ายๆกัน เช่น เปิด(ON) หรือป ปิด(OFF) เป็นต้น แต่ไม่อยากให้มันผูกแน่นกันจนเกินไป
- มาดูโจทย์ของเราดึงกว่า โดยผมรับ Requirement มาว่าให้ได้ออกแบบ Application ETradeStock อันนึงที่สามารถส่งคำสั่งไปที่ตลาดหุ้น SAT ซึ่งสำหรับ SAT มี API อยู่ 2 เจ้าครับ ได้แก่ DSC และ FWD
- สิ่งที่ต้องการ คือ ทำอย่างไรก็ได้ให้ Application ของเรา สามารถส่งคำสั่งซื้อ-ขาย หลักทรัพย์ไปยังตลาดหุ้น SAT โดยที่ใช้ API ของ DSC และ FWD ได้ พร้อมทั้งรองรับการเพิ่ม API ได้ในอนาคตครับ
เมื่อไหร่ควรจะใช้
- ต้องการสร้างสื่อกลางระหว่าง Control (คนสั่ง) กับ Receiver(คนทำตาม) แต่ไม่อยากให้ Controller รู้จักกับ Receiver มากนัก (อารมณ์เหมือนพวกแก๊งมาเฟีย ลูกน้องไม่รู้หรอกว่าใครสั่ง แต่ต้องทำตาม) สิ่งที่ต้องทำ คือ เพิ่มสื่อตรงกลางขั้นมา ซึ่งมัน คือ คำสั่ง (Command)
- ต้องการเชื่อม Controller กับ Receiver แม้ว่าตัว Receiver ของแต่ละค่ายมันมี API เชื่อมต่างกันก็ตาม (ส่วนตัวมองว่าเป็น Special Case ของ Adapter Pattern นะ ตัว Command == Adapter) เช่น
- Event ระหว่าง Control ต่างๆ(คนสั่ง กับพวก Handler(คนทำตาม) มี่ Object Event มาเป็น Command
- การเก็บ Log แม้ว่าจะเป็น Log ต่างๆค่ายกัน ถูกหุ้มด้วย Command แบบเดียวกัน
- การ Implement ของ CallBack ในภาษากลุ่ม OOP
- จากโจทย์ตัวอย่างของ Application ETradeStock มาแยกดีกว่าว่าแต่ละ Object เป็นอย่างไร
- Control - ETradeStock
- Receiver - DSCTradeService, FWDTradeService
- Command - อันนี้ เป็นสิ่งที่ต้องเพิ่มครับ โดยระละเอียดดูได้จาหัวข้อถัดไปครับ
Pattern มันเป็นอย่างไร - Class Diagram
- Template
- Class Diagram จากโจทยฺ์ - ที่ผมแยกเป็น 2 แบบ เพราะ ถ้า Class Diagram จริงๆ บางทีอาจจะละตัว Invoker ไปเป็น Method ได้ครับ
มุมมองตอน Runtime - Object Diagram
- Control >> Command >> Receiver
มุมมองลำดับการทำงาน - Sequence Diagram
- แบบที่ใส่ตัว Invoker
- แบบที่ไม่แสดงตัว Invoker
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.