Composite Pattern trong Java – Code ví dụ Composite Pattern.
1. Composite Pattern là gì?
Composite Pattern là một mẫu cấu trúc (Structural Pattern).
Composite Pattern cho phép tương tác với tất cả các đối tượng tương tự nhau giống như là các đối tượng đơn hoặc collections.
Ví dụ: Đối tượng File sẽ là 1 đối tượng đơn nếu bên trong nó không có file nào khác, nhưng đối tượng file sẽ được đối xử giống như 1 collections nếu bên trong nó lại có những File khác.
Khi tính kích thước của File ta sẽ cần tính kích thước của tất cả các file bên trong nó.
2. Composite Pattern UML Diagram.
Component (Thành phần):
- Khai báo interface hoặc abstract chung cho các thành phần đối tượng.
- Chứa các method thao tác chung của các thành phần đối tượng.
Leaf (Lá):
- Biểu diễn các đối tượng lá (ko có con) trong thành phần đối tượng.
Composite (Hỗn hợp):
- Đị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.
3. Ví dụ.
1 project là 1 tập hợp nhiều tác vụ (Task) con, đồng thời bản thân project cũng là 1 task lớn.
Ta cần tính tống thời gian của project thông qua thời gian của các task con.
Code ví dụ:
TaskItem.java
public abstract class TaskItem { public abstract double getTime(); }
Task.java
public class Task extends TaskItem { String name; double time; public Task() { } public Task(String name, double time) { this.name = name; this.time = time; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public double getTime() { return time; } public void setTime(double time) { this.time = time; } }
Project.java
public class Project extends TaskItem { String name; ArrayList<TaskItem> subTask = new ArrayList<>(); public Project() { } public Project(String name, ArrayList<TaskItem> subTask) { this.name = name; this.subTask = subTask; } public String getName() { return name; } public void setName(String name) { this.name = name; } public ArrayList<TaskItem> getSubTask() { return subTask; } public void setSubTask(ArrayList<TaskItem> subTask) { this.subTask = subTask; } @Override public double getTime() { double time = 0; for (int i = 0; i < subTask.size(); i++) { time += subTask.get(i).getTime(); } return time; } public void addTask(TaskItem taskItem) { if (subTask.contains(taskItem) == false) { subTask.add(taskItem); } } public void removeTask(TaskItem taskItem) { subTask.remove(taskItem); } }
Demo
public class MainApp { public static void main(String[] args) { Task task1 = new Task("requirement", 50); Task task2 = new Task("analysis", 34); Task task3 = new Task("design", 65); Task task4 = new Task("implement", 23); Task task5 = new Task("test", 65); Task task6 = new Task("maintain", 32); ArrayList<TaskItem> subTask = new ArrayList<>(); subTask.add(task1); subTask.add(task2); subTask.add(task3); subTask.add(task4); subTask.add(task5); subTask.add(task6); Project project = new Project("quan li diem", subTask); // tinh tong thoi gian du an System.out.println("total time: " +project.getTime()); // tinh tong thoi gian du an sau khi bo task: maintain project.removeTask(task6); System.out.println("total time after remove maintain task: " +project.getTime()); } }
Kết quả:
total time: 269.0 total time after remove maintain task: 237.0
Okay, Done!
Thanks các bạn đã theo dõi. Xem thêm các ví dụ khác về design pattern tại: https://stackjava.com/category/design-pattern
References: