Composite Pattern trong Java – Code ví dụ Composite Pattern

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.

Composite Pattern trong Java - Code ví dụ Composite Pattern

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:

https://en.wikipedia.org/wiki/Composite_pattern

stackjava.com