Composite pattern helps when objects have root and leaf relationships, if root and all levels of leaf all implement same method, we can only talk to the root to get the final result which we want, and leave the handling between root and all levels of leaf.
Like when we count the population of whole country, we should sum all state populations, each state population we should sum all district populations, in the end we can get final entire country's population.
//Interface
public interface ICount {
int getCount();
}
//District
public class District implements ICount {
public District(String name, int population) {
this.name = name;
this.population = population;
}
@Override
public int getCount() {
System.out.println(name + " population is: " + population);
return population;
}
}
//State
public class State implements ICount {
private String name;
private List<District> children;
public State(String name) {
District v1 = new District("District 1", (int) (Math.random() * 1000));
District v2 = new District("District 2", (int) (Math.random() * 1500));
List<District> children = new ArrayList<>();
children.add(v1);
children.add(v2);
this.name = name;
this.children = children;
}
@Override
public int getCount() {
int sum = this.children.stream().mapToInt(child -> child.getCount()).sum();
System.out.println(name + " population is: " + sum);
return sum;
}
}
//Country
public class China implements ICount {
private List<State> children;
public China() {
State beiJing = new State("BeiJing");
State tianJin = new State("TianJin");
State shangHai = new State("ShangHai");
List<State> children = new ArrayList<>();
children.add(beiJing);
children.add(tianJin);
children.add(shangHai);
this.children = children;
}
@Override
public int getCount() {
int sum = this.children.stream().mapToInt(child -> child.getCount()).sum();
System.out.println("China population is: " + sum);
return sum;
}
}
Test class we just use China instance to get count result, the details of each leaf unit how do they get population we don't need to know.
public class Test {
public static void main(String[] args) {
China china = new China();
china.getCount();
}
}