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

ตัวอย่างโปรแกรม
[แก้]ภาษาจาวา
[แก้]ตัวอย่างโปรแกรมเพื่อแสดงโครงสร้างของ 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 เก็บถาวร 2013-10-31 ที่ เวย์แบ็กแมชชีน โดย David Geary (อังกฤษ)