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

(เปลี่ยนทางจาก Composite pattern)

แบบแผนประกอบรวม (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)

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