# Composite pattern

### Bách khoa toàn thư mở Wikipedia

Trong Công nghệ phần mềm, một composite object là một mẫu thiết kế (design pattern)

## [sửa] Mục đích

Trong lập trình hướng đối tượng, một đối tượng composite được tạo thành từ một hay nhiều đối tượng tương tự nhau (có một số chức năng tương tự nhau). Ý tưởng ở đây là có thể thao trên một nhóm đối tượng theo cách như thao tác trên một đối tượng duy nhất. Các đối tượng của nhóm phải có các thao tác chung, hay còn gọi là mẫu số chung nhỏ nhất.

## [sửa] Sử dụng khi nào

Bạn thấy rằng bạn sử dụng nhiều đối tượng theo cùng một cách bạn thường có cùng mã lệnh. Ví dụ, khi sự khác nhau duy nhất giữa hai hàm chỉ là thao tác trên một đối tượng kiểu `Hình vuông` hoặc `Hình tròn`. Mẫu thiết kế này sẽ rất hữu ích khi sự khác nhau không cần phải tồn tại, Nó sẽ đơn giản hơn khi xét tập các đối tượng đồng nhất.

## [sửa] Cấu trúc

- Component (thành phần)
  - khai báo giao diện cho thành phần đối tượng
  - thực thi thao tác mặc định
  - khai báo một giao diện cho phép truy cập đến các thành phần con

- Leaf (Lá)
  - biểu diễn các đối tượng lá trong thành phần đối tượng

- Composite (Hợp tử)
  - định nghĩa một thao tác cho các thành phần có thành phần con
  - lưu trữ thành phần con
  - thực thi sự quản lý các thành phần con của giao diện `Component`

- Client
  - thao tác các đối tượng dựa trên giao diện `Composite`

## [sửa] Ví dụ

### [sửa] Java

Ví dụ sau minh hoạ ví dụ nêu ở trên với kết quả là:

    (Europe:  (England: London)   (France: Paris) )

    import java.util.*;

    interface Component {
       public String defaultMethod();
       public ArrayList<Component> getChildren();
       public boolean addComponent(Component c);
       public boolean removeComponent(Component c);
    }

    class Composite implements Component {
       private String id;
       private ArrayList<Component> components = new ArrayList<Component>();

       public Composite(String identification)         { id = identification; }

       public String defaultMethod() {
           String s = " (" + id + ":";
           for (Component child : getChildren())
               s += " " + child.defaultMethod();
           return s + ") ";
       }

       public ArrayList<Component> getChildren()       { return components; }
       public boolean addComponent(Component c)        { return components.add(c); }
       public boolean removeComponent(Component c)     { return components.remove(c); }
    }

    class Leaf implements Component {
       private String id;

       public Leaf(String identification)              { id = identification; }

       public String defaultMethod()                   { return id; }
       public ArrayList<Component> getChildren()       { return null; }
       public boolean addComponent(Component c)        { return false; }
       public boolean removeComponent(Component c)     { return false; }
    }

    class CompositePattern {
       public static void main(String[] args) {
           Composite england = new Composite("England");
           Leaf york = new Leaf("York");
           Leaf london = new Leaf("London");
           england.addComponent(york);
           england.addComponent(london);
           england.removeComponent(york);

           Composite france = new Composite("France");
           france.addComponent(new Leaf("Paris"));

           Composite europe = new Composite("Europe");
           europe.addComponent(england);
           europe.addComponent(france);

           System.out.println( europe.defaultMethod() );
       }
    }

Lấy từ “http://vi.wikipedia.org../../../c/o/m/Composite_pattern.html”

Thể loại: Các mẫu thiết kế phần mềm

##### Views

- Bài viết
- Thảo luận
- Phiên bản hiện hành

##### Tìm kiếm

##### Ngôn ngữ khác

- Deutsch
- English
- Español
- Français
- Italiano
- 日本語
- Português
- ไทย