แบบแผนประกอบรวม

แบบแผนประกอบรวม (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  โดย David Geary 

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