2012-01-30 28 views
23

Tôi đang hoàn thành khóa học về các mẫu thiết kế và trong khi xem lại ghi chú, tôi đã bỏ lỡ một số nội dung tôi bỏ lỡ trong học kỳ: Composite vs. Thành phần. Những gì tôi hiểu là composite là khi một đối tượng thực sự đóng gói toàn bộ đối tượng, trong khi bố cục là khi nó chỉ giữ con trỏ cho chúng.Mẫu thiết kế: Composite so với Thành phần

  1. Điều này có đúng không? Ai đó có thể giải thích điều này cho tôi tốt hơn một chút không?
  2. Khi nào tôi thích cái này hơn cái kia?

Trả lời

45

Composition

Đây là một khái niệm thiết kế (không phải thực sự là một mẫu). Thuật ngữ này được sử dụng khi bạn muốn mô tả một đối tượng chứa một đối tượng khác. Nó xảy ra rất thường xuyên trong các cuộc thảo luận Composition over inheritance.

Hơn nữa, bố cục ngụ ý quyền sở hữu mạnh. Một đối tượng sở hữu (tức là quản lý vòng đời) của một đối tượng khác. Khi cha mẹ bị phá hủy, tất cả trẻ em cũng bị phá hủy. Nếu không có mối quan hệ mạnh mẽ như vậy (trẻ em có thể sống lâu hơn cha mẹ), chúng tôi đang nói về tập hợp.

Trích dẫn ví dụ tuyệt vời trong Wikipedia:

Ví dụ, một trường đại học sở hữu bộ phận khác nhau (ví dụ, hóa học), và mỗi bộ phận có một số giáo sư. Nếu trường đại học đóng cửa, các phòng ban sẽ không còn tồn tại nữa, nhưng các giáo sư trong các phòng ban đó sẽ tiếp tục tồn tại. Do đó, một trường đại học có thể được xem là thành phần của các phòng ban, trong khi các phòng ban có tổng hợp các giáo sư. Ngoài ra, một Giáo sư có thể làm việc trong nhiều bộ phận, nhưng một bộ phận không thể là một phần của nhiều trường đại học.

Vì vậy, bạn có thể thấy bạn nên chọn giữa bố cục hoặc tổng hợp tùy thuộc vào loại mối quan hệ sở hữu.

Composite pattern

Đây là một mẫu thiết kế GOF mô tả một cha-con mối quan hệ mạnh mẽ nơi con có thể là một nút đơn giản hoặc một container của các nút khác (có thể chứa những đứa trẻ khác).

Điều này rất phổ biến trong cấu trúc GUI và cây giống. Ví dụ. trong Java Swing JPanel có thể chứa các điều khiển khác nhau như trường văn bản, nhãn, danh sách, v.v. nhưng nó cũng có thể giữ khác JPanel s trong đó, lần lượt, có thể chứa các thành phần đơn giản và thậm chí nhiều bảng lồng nhau hơn.

Thông thường Composite mẫu thiết kế sử dụng bố cục, tuy nhiên trong một số trường hợp, cha mẹ không phải sở hữu tất cả trẻ em. Để tiếp tục ví dụ về GUI, bạn có thể lấy một bảng và di chuyển nó đến một nơi khác (thay đổi cha mẹ).

+0

+1 để giải thích hai, nhưng OP * cũng * dường như cần trợ giúp về việc chứa và chỉ gặp sự cố về con trỏ. –

+0

@MattFenwick: phải, tôi đã thêm một số làm rõ và trích dẫn (cũng về tổng hợp). –

+1

Cảm ơn bạn. GoF là gì? – baruch

Các vấn đề liên quan