คอมโพสิตแพตเทิร์น - วิกิพีเดีย

# คอมโพสิตแพตเทิร์น

### จากวิกิพีเดีย สารานุกรมเสรี

คอมโพสิตแพตเทิร์น (Composite pattern) เป็นดีไซน์แพตเทิร์น ที่จัดโครงสร้างของอ็อบเจกต์ที่มีลักษณะการทำงานคล้ายกันและเป็นส่วนประกอบย่อยๆ ของระบบใหญ่ให้อยู่ในรูปแบบโครงสร้างต้นไม้ คลาสผู้ใช้สามารถปฏิบัติต่อส่วนต่างๆ ของคอมโพสิตในแบบเดียวกันโดยไม่ต้องคำนึงว่าเป็นส่วนปลายหรือส่วนกลางของแผนผังต้นไม้ ตัวอย่างเช่นโครงสร้างของบทความหนึ่งๆ แบ่งเป็นหลายๆ ย่อหน้า แต่ละย่อหน้ายังแบ่งย่อยต่อไปได้เป็นประโยค คำ และตัวอักษรในที่สุด

## [แก้] การนำไปใช้งาน

องค์ประกอบของคอมโพสิตแพตเทิร์นมีสามส่วนคือ

- อินเตอร์เฟสหรือคลาสแบบแอ็บสแตรคเป็นแม่แบบที่นิยามพฤติกรรมที่แต่ละอ็อบเจกต์ของคอมโพสิตต้องมี
- คลาสที่สามารถมีองค์ประกอบอื่นของคอมโพสิตได้
- คลาสที่เป็นส่วนปลาย ไม่สามารถมีองค์ประกอบอื่นได้

UML คลาสไดอะแกรมของคอมโพสิตแพตเทิร์น

## [แก้] ตัวอย่างโปรแกรม

### [แก้] ภาษาจาวา

ตัวอย่างโปรแกรมเพื่อแสดงโครงสร้างของ File System โดยแบ่งเป็นแฟ้มและเอกสารที่อยู่ภายในแฟ้ม และการแสดงรายชื่อของแฟ้มและเอกสารภายใน

อินเตอร์เฟส `File` เป็นแม่แบบของส่วนประกอบต่างๆ ของคอมโพสิต นิยามเมธอด `list()` เพื่อให้แต่ละองค์ประกอบพิมพ์ชื่อของตัวเองและองค์ประกอบย่อยที่อยู่ภายใต้

       public interface File {
           public void list();
           public void addFile(File file);
           public void removeFile(File file);
       }

คลาส `Folder` สามารถมีอ็อบเจกต์ชนิด `File` อื่นๆ อยู่ภายใต้ได้ คือมีได้ทั้ง `Folder` ย่อยและ `Document` เมธอด `list()` จะพิมพ์ชื่อของตนเองและตามด้วยการเรียกเมธอด `list()` ของทุก `File` ที่อยู่ภายใต้ `Folder`

เมธอด `addFile()` และ `removeFile()` ทำหน้าที่จัดการกับ `File` ย่อยๆ ภายใต้ `Folder`

       public class Folder implements File {
           private String name;
           private ArrayList<File> files = new ArrayList<File>();

           public Folder(String name) {
               this.name = name;
           }

           public void addFile(File file) {
               files.add(file);
           }

           public void removeFile(File file) {
               files.remove(file);
           }

           public void list() {
               System.out.println("Folder: " + name);
               for (File file : files) {
                   file.list();
               }
           }
       }

คลาส `Document` เป็นส่วนปลายสุดหรือส่วนย่อยที่สุดของคอมโพสิต ไม่สามารถมีส่วนอื่นๆ ภายใต้ ดังนั้นเมธอด `list()` จึงมีหน้าที่เพียงพิมพ์ชื่อของตนเองและเมธอด `addFile()` และ `removeFile()` ไม่ต้องทำอะไร

       public class Document implements File {
           private String name;

           public Document(String name) {
               this.name = name;
           }

           public void list() {
               System.out.println("Document: " + name);
           }

           public void addFile(File file) {
               // do nothing
           }

           public void removeFile(File file) {
               // do nothing
           }
       }

การเรียกใช้งาน

       File root = new Folder("root");
       root.addFile(new Document("one.doc"));

       File sub = new Folder("sub");
       sub.addFile(new Document("two.doc"));
       sub.addFile(new Document("three.doc"));
       root.addFile(sub);

       root.list();

## [แก้] อ้างอิง

- Design Patterns: Elements of Reusable Object-Oriented Software (ISBN 0-201-63361-2) โดย Erich Gamma, Richard Helm, Ralph Johnson และ John Vlissides (Gang of four: GoF)

## [แก้] แหล่งข้อมูลอื่น

- Composite โดย Vince Huston ((อังกฤษ))
- A look at the Composite design pattern โดย David Geary ((อังกฤษ))

ดึงข้อมูลจาก "http://th.wikipedia.org../../../%E0%B8%84/%E0%B8%AD/%E0%B8%A1/%E0%B8%84%E0%B8%AD%E0%B8%A1%E0%B9%82%E0%B8%9E%E0%B8%AA%E0%B8%B4%E0%B8%95%E0%B9%81%E0%B8%9E%E0%B8%95%E0%B9%80%E0%B8%97%E0%B8%B4%E0%B8%A3%E0%B9%8C%E0%B8%99.html".

หมวดหมู่: การเขียนโปรแกรม

##### Views

- บทความ
- อภิปราย
- รุ่นปัจจุบัน

##### ค้นหา

##### ภาษาอื่น

- Deutsch
- English
- Español
- Français
- Italiano
- 日本語
- Português
- Tiếng Việt