Composite
處理樹狀、有階層的資料結構(part-whole hierarchies),讓使用者用相同的介面操作單獨(Leaf)和合成(Composite)的物件。
from: Composite Pattern Tutorial with Java Examples
Example
Component
public interface Employee {
public void add(Employee employee);
public void remove(Employee employee);
public Employee getChild(int i);
public String getName();
public double getSalary();
public void print();
}
Composite
public class Manager implements Employee {
private String name;
private double salary;
public Manager(String name, double salary) {
this.name = name;
this.salary = salary;
}
// sub-tree
List<Employee> employees = new ArrayList<Employee>();
public void add(Employee employee) {
employees.add(employee);
}
public Employee getChild(int i) {
return employees.get(i);
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public void print() {
System.out.println("-------------");
System.out.println("Name ="+getName());
System.out.println("Salary ="+getSalary());
System.out.println("-------------");
Iterator<Employee> employeeIterator = employees.iterator();
while(employeeIterator.hasNext()) {
Employee employee = employeeIterator.next();
employee.print();
}
}
public void remove(Employee employee) {
employees.remove(employee);
}
}
Leaf
public class Developer implements Employee {
private String name;
private double salary;
public Developer(String name,double salary){
this.name = name;
this.salary = salary;
}
public void add(Employee employee) {
//this is leaf node so this method is not applicable to this class.
}
public Employee getChild(int i) {
//this is leaf node so this method is not applicable to this class.
return null;
}
public String getName() {
return name;
}
public double getSalary() {
return salary;
}
public void print() {
System.out.println("-------------");
System.out.println("Name ="+getName());
System.out.println("Salary ="+getSalary());
System.out.println("-------------");
}
public void remove(Employee employee) {
//this is leaf node so this method is not applicable to this class.
}
}
Usage
//
// generalManager
// / \
// emp3 manager1
// / \
// emp1 emp2
//
public class CompositeDesignPatternMain {
public static void main(String[] args) {
Employee emp1 = new Developer("John", 10000);
Employee emp2 = new Developer("David", 15000);
Employee manager1 = new Manager("Daniel",25000);
manager1.add(emp1);
manager1.add(emp2);
Employee emp3 = new Developer("Michael", 20000);
Manager generalManager=new Manager("Mark", 50000);
generalManager.add(emp3);
generalManager.add(manager1);
generalManager.print();
}
}