CyStack logo
  • Sản phẩm & Dịch vụ
  • Giải pháp
  • Bảng giá
  • Công ty
  • Tài liệu
Vi

vi

Mục lục

Trang chủHướng dẫnComposite Design Pattern ...
Java

Composite Design Pattern trong Java: Cấu trúc, ưu điểm và ứng dụng

4 phút đọc19/08/2025
CyStack Author
Bao Tran

Web Developer

0 lượt xem
Reading Time: 4 minutes

Composite design pattern là một trong những mẫu thiết kế cấu trúc (Structural design pattern). Mẫu này được sử dụng khi cần biểu diễn mối quan hệ phân cấp giữa một tổng thể và các thành phần cấu thành.

Composite Design Pattern trong Java

Composite Design Pattern

Khi cần tạo một cấu trúc mà các đối tượng trong đó phải được xử lý theo cách giống nhau, chúng ta có thể áp dụng Composite pattern. Hãy xét một ví dụ trong thực tế: một bản vẽ là một cấu trúc gồm các đối tượng như Hình tròn, Đường thẳng, Hình tam giác… Khi tô màu (giả sử màu đỏ) cho bản vẽ, thì tất cả các đối tượng bên trong bản vẽ cũng được tô cùng màu. Như vậy, bản vẽ được cấu thành từ nhiều phần khác nhau nhưng tất cả đều có cùng thao tác xử lý.

Composite pattern bao gồm các thành phần sau:

  • Thành phần gốc (Base Component): Đây là giao diện chung cho tất cả các đối tượng trong cấu trúc. Chương trình phía client sẽ làm việc thông qua thành phần gốc này. Thành phần này có thể là một interface hoặc lớp trừu tượng định nghĩa các phương thức chung cho toàn bộ đối tượng.
  • Lá (Leaf): Định nghĩa hành vi cho các phần tử cơ bản trong cấu trúc. Đây là đơn vị xây dựng nên cấu trúc, triển khai thành phần cơ sở và không chứa tham chiếu đến các thành phần khác.
  • Phức hợp (Composite): Chứa tập hợp các đối tượng dạng lá và triển khai các hoạt động trong thành phần cơ sở.

Dưới đây là ví dụ áp dụng Composite pattern cho kịch bản về bản vẽ.

Thành phần cơ sở của Composite Pattern

Thành phần cơ sở sẽ định nghĩa các phương thức chung cho cả đối tượng lá và đối tượng phức hợp. Ở đây, chúng ta có thể tạo một interface Shape với phương thức draw(String fillColor) để vẽ hình với màu cho trước.

java

package com.journaldev.design.composite;

public interface Shape {

public void draw(String fillColor);

}

Các đối tượng lá

Đối tượng lá triển khai thành phần cơ sở và chúng là các khối xây dựng cho đối tượng phức hợp. Chúng ta có thể tạo nhiều đối tượng lá như Triangle, Circle, v.v.

Triangle.java

java

package com.journaldev.design.composite;

public class Triangle implements Shape {

@Override
public void draw(String fillColor) {
	System.out.println("Drawing Triangle with color " + fillColor);
}

}

Circle.java

java

package com.journaldev.design.composite;

public class Circle implements Shape {

@Override
public void draw(String fillColor) {
	System.out.println("Drawing Circle with color " + fillColor);
}

}

Đối tượng phức hợp

Một đối tượng phức hợp chứa một tập hợp các đối tượng lá, chúng ta nên cung cấp các phương thức hỗ trợ để thêm hoặc xóa lá khỏi tập hợp đó. Ngoài ra, đối tượng phức hợp cũng có thể cung cấp phương thức để xóa toàn bộ phần tử khỏi nhóm khi cần thiết.

Drawing.java

package com.journaldev.design.composite;

import java.util.ArrayList; import java.util.List;

public class Drawing implements Shape{

//collection of Shapes
private List<Shape> shapes = new ArrayList<Shape>();

@Override
public void draw(String fillColor) {
	for(Shape sh : shapes)
	{
		sh.draw(fillColor);
	}
}

//adding shape to drawing
public void add(Shape s){
	this.shapes.add(s);
}

//removing shape from drawing
public void remove(Shape s){
	shapes.remove(s);
}

//removing all the shapes
public void clear(){
	System.out.println("Clearing all the shapes from drawing");
	this.shapes.clear();
}

}

Lưu ý, đối tượng phức hợp cũng triển khai cùng giao diện thành phần và hoạt động tương tự như một đối tượng lá, điểm khác biệt duy nhất là nó có khả năng chứa một tập hợp các phần tử lá.

Composite Design Pattern Trong Java

Như vậy, việc triển khai Composite Pattern đã hoàn tất và chúng ta có thể tiến hành kiểm thử thông qua một chương trình client.

Chương trình Client sử dụng Composite Design Pattern

Dưới đây là ví dụ về chương trình kiểm thử Composite pattern.

TestCompositePattern.java

package com.journaldev.design.test;

import com.journaldev.design.composite.Circle; import com.journaldev.design.composite.Drawing; import com.journaldev.design.composite.Shape; import com.journaldev.design.composite.Triangle;

public class TestCompositePattern {

public static void main(String[] args) {
	Shape tri = new Triangle();
	Shape tri1 = new Triangle();
	Shape cir = new Circle();

	Drawing drawing = new Drawing();
	drawing.add(tri1);
	drawing.add(tri1);
	drawing.add(cir);

	drawing.draw("Red");

	drawing.clear();

	drawing.add(tri);
	drawing.add(cir);
	drawing.draw("Green");
}

}

Kết quả khi chạy chương trình:

Drawing Triangle with color Red
Drawing Triangle with color Red
Drawing Circle with color Red
Clearing all the shapes from drawing
Drawing Triangle with color Green
Drawing Circle with color Green

Một số điểm quan trọng về Composite Pattern

  • Composite Pattern chỉ nên được áp dụng khi các đối tượng trong cùng một nhóm cần hành xử thống nhất như một đối tượng duy nhất.
  • Mẫu thiết kế này đặc biệt phù hợp để xây dựng các cấu trúc dạng cây (tree structure).
  • Một ví dụ tiêu biểu của Composite Pattern trong Java là phương thức java.awt.Container#add(Component), được sử dụng rộng rãi trong thư viện Swing.

Tham khảo thêm các mẫu thiết kế cấu trúc khác:

  • Bridge Pattern trong Java
  • Adapter Design Pattern trong Java

<!-- notionvc: b96fdd4c-5baf-43ce-9a75-8af5701d70b9 -->

Về tác giả

Bao Tran
Bao TranWeb Developer

I’m passionate about web development and sharing my insights through articles, with over 8 years of experience. I hope these sharings inspire you and help build a strong web development community. @#@ Tôi đam mê phát triển web và chia sẻ những hiểu biết của mình thông qua các bài viết, với hơn 8 năm kinh nghiệm. Tôi hy vọng những chia sẻ này sẽ truyền cảm hứng cho các bạn và giúp xây dựng một cộng đồng phát triển web mạnh mẽ.

Cập nhật thông tin mới nhấtNhận các thông tin mới nhất về mối đe dọa, báo cáo an ninh mạng từ CyStack về hòm thư điện tử của bạn

Thảo luận (0)

Đăng nhập để thảo luận

Bài viết liên quan