Mẫu thiết kế - Mẫu phức hợp
Mẫu phức hợp được sử dụng khi chúng ta cần xử lý một nhóm đối tượng theo cách tương tự như một đối tượng duy nhất. Mẫu tổng hợp bao gồm các đối tượng dưới dạng cấu trúc cây để đại diện cho một phần cũng như toàn bộ hệ thống phân cấp. Loại mô hình thiết kế này thuộc mô hình cấu trúc vì mô hình này tạo ra một cấu trúc cây gồm các nhóm đối tượng.
Mẫu này tạo ra một lớp chứa nhóm các đối tượng của chính nó. Lớp này cung cấp các cách để sửa đổi nhóm các đối tượng giống nhau của nó.
Chúng tôi đang chứng minh việc sử dụng mô hình tổng hợp thông qua ví dụ sau, trong đó chúng tôi sẽ cho thấy hệ thống phân cấp nhân viên của một tổ chức.
Thực hiện
Chúng ta có một lớp Employee hoạt động như lớp diễn viên mẫu tổng hợp. CompositePatternDemo , lớp demo của chúng tôi sẽ sử dụng lớp Nhân viên để thêm hệ thống phân cấp cấp bộ phận và in tất cả nhân viên.
Bước 1
Tạo lớp Nhân viên có danh sách các đối tượng Nhân viên .
Employee.java
import java.util.ArrayList;
import java.util.List;
public class Employee {
private String name;
private String dept;
private int salary;
private List<Employee> subordinates;
// constructor
public Employee(String name,String dept, int sal) {
this.name = name;
this.dept = dept;
this.salary = sal;
subordinates = new ArrayList<Employee>();
}
public void add(Employee e) {
subordinates.add(e);
}
public void remove(Employee e) {
subordinates.remove(e);
}
public List<Employee> getSubordinates(){
return subordinates;
}
public String toString(){
return ("Employee :[ Name : " + name + ", dept : " + dept + ", salary :" + salary+" ]");
}
}
Bước 2
Sử dụng lớp Nhân viên để tạo và in hệ thống phân cấp nhân viên.
CompositePatternDemo.java
public class CompositePatternDemo {
public static void main(String[] args) {
Employee CEO = new Employee("John","CEO", 30000);
Employee headSales = new Employee("Robert","Head Sales", 20000);
Employee headMarketing = new Employee("Michel","Head Marketing", 20000);
Employee clerk1 = new Employee("Laura","Marketing", 10000);
Employee clerk2 = new Employee("Bob","Marketing", 10000);
Employee salesExecutive1 = new Employee("Richard","Sales", 10000);
Employee salesExecutive2 = new Employee("Rob","Sales", 10000);
CEO.add(headSales);
CEO.add(headMarketing);
headSales.add(salesExecutive1);
headSales.add(salesExecutive2);
headMarketing.add(clerk1);
headMarketing.add(clerk2);
//print all employees of the organization
System.out.println(CEO);
for (Employee headEmployee : CEO.getSubordinates()) {
System.out.println(headEmployee);
for (Employee employee : headEmployee.getSubordinates()) {
System.out.println(employee);
}
}
}
}
Bước 3
Xác minh kết quả đầu ra.
Employee :[ Name : John, dept : CEO, salary :30000 ]
Employee :[ Name : Robert, dept : Head Sales, salary :20000 ]
Employee :[ Name : Richard, dept : Sales, salary :10000 ]
Employee :[ Name : Rob, dept : Sales, salary :10000 ]
Employee :[ Name : Michel, dept : Head Marketing, salary :20000 ]
Employee :[ Name : Laura, dept : Marketing, salary :10000 ]
Employee :[ Name : Bob, dept : Marketing, salary :10000 ]