Wednesday, 11 July 2012

Design Pattern - Composite Pattern

เวลาที่เราออกแบบโครงสร้างในแบบ Tree Structure เรามักจะมองว่า Leaf Node กับ Branch Node มีการทำงานที่แตกต่างกัน ซึ่งจะทำให้การออกแบบมีความ Complex แต่ถ้าเรามองว่า Branch Node กับ Leaf Node ต่างก็มีการทำงานคล้ายกัน จะทำให้การออกแบบง่ายขึ้น สำหรับวันนี้ผมจะมาแนะนำให้รู้จักกับ Composite Pattern ที่่มักใช้ในการแก้ปัญหาในการออกแบบ Tree Structure ก่อนอื่นต้องดู UML ของ Composite Pattern ก่อน ดังภาพต่อไปนี้

Composite Pattern UML

จากในภาพจะเห็นว่า Leaf (Leaf Node) และ Composite (Branch Node) มีการ implement method ที่ชื่อว่า operation() เหมือนกัน เนื่องจากมีการ inherit มาจาก Parent เดียวกันก็คือ Component ในขณะเดียวกัน Composite ยังสามารถที่จะมี Child Object ที่ inherit มาจาก Component อยู่ภายในตัวเอง (ซึ่งจุดนี้เองที่ทำให้ Branch Node แตกต่างจาก Leaf Node แต่ยังคงคล้ายกัน เนื่องจากมี method ชื่อว่า operation() เหมือนกัน) สิ่งที่เพิ่มเข้ามาใน Composite (Branch Node) ก็คือ method สำหรับการทำงานกับ Child Object อย่างเช่น add(), remove() และ getChild()

Key Concept ของ Composite Pattern ก็คือ เราสามารถใช้งาน Single Object (Leaf) หรือ Group of Object (Branch) ได้ในแบบเดียวกัน ซึ่งจากในภาพ ก็คือเราสามารถ เรียก method ที่ชื่อว่า operation() ได้ทั้งจาก Leaf หรือ Composite (Branch Node) เดี๋ยวเราจะลองมาดู Source Code เพื่อจะได้เข้าใจมากขึ้น ซึ่ง Code ตัวอย่างที่จะแสดงดังต่อไปนี้ เป็นการ implement Graphic Class ในภาษา Java


  จาก Code ข้างต้น เราจะเห็นว่า เราสามารถเรียก print() ผ่าน CompositeGraphic ได้ ไม่แตกต่างจากการเรียกจาก Ellipse ซึ่งการเรียก print() ผ่าน CompositeGraphic มีผลทำให้ print() ที่อยู่ใน Child Object ถูกเรียก ดังนั้นถ้าหากเราต้องการเรียก print() ของทุกๆ Graphic Object แทนที่เราจะสั่งเรียกทีละตัว เราก็จะสามารถเรียกผ่าน CompositeGraphic แทนได้ ก็ลองเอาไปประยุกต์ใช้งานดูละกันนะครับ

แหล่งที่มา: http://en.wikipedia.org/wiki/Composite_pattern


No comments:

Post a Comment