Trang chủHướng dẫnComposite Design Pattern trong Java: Cấu trúc, ưu điểm và ứng dụng
Java

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

CyStack blog 4 phút để đọc
CyStack blog19/08/2025
Locker Avatar

Bao Tran

Web Developer

Locker logo social
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

0 Bình luận

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

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất