Article directory
What is composite mode
The Composite pattern is a structural design pattern that aims to treat container and content as the same thing even if the container and content are consistent. Both the content and the container can be placed in the container to form a recursive structure.
example
Construct the company's organizational structure tree
Node node
package StructuralPattern.CompositeMode;
import java.util.List;
/**
* Node节点
*/
public interface Node {
/**
* 增加一个子节点
* @param node
* @return
*/
Node add(Node node);
/**
* 获取所有子节点
* @return
*/
List<Node> listChildren();
/**
* 打印结构
* @return
*/
String print();
}
Organization
has content name and container list
package StructuralPattern.CompositeMode;
import java.util.ArrayList;
import java.util.List;
/**
* 组织
*/
public class Organization implements Node {
private String name;
private List<Node> list;
/**
* 层次
*/
private int floor;
public Organization(String name,int floor) {
list = new ArrayList<>();
this.name = name;
this.floor = floor;
}
@Override
public Node add(Node node) {
list.add(node);
return this;
}
@Override
public List<Node> listChildren() {
return list;
}
@Override
public String print() {
StringBuilder res = new StringBuilder();
res.append(" ".repeat(Math.max(0, floor)));
res.append("organization: ").append(name).append('\n');
list.forEach(l->{
res.append(l.print());
});
return res.toString();
}
}
Department
package StructuralPattern.CompositeMode;
import java.util.ArrayList;
import java.util.List;
/**
* 部门
*/
public class Department implements Node{
private String name;
private List<Node> list;
/**
* 层次
*/
private int floor;
public Department(String name,int floor){
list = new ArrayList<>();
this.name = name;
this.floor = floor;
}
@Override
public Node add(Node node) {
list.add(node);
return this;
}
@Override
public List<Node> listChildren() {
return list;
}
@Override
public String print() {
StringBuilder res = new StringBuilder();
res.append(" ".repeat(Math.max(0, floor)));
res.append("department: ").append(name).append('\n');
list.forEach(l->{
res.append(l.print());
});
return res.toString();
}
}
Employee
package StructuralPattern.CompositeMode;
import java.util.ArrayList;
import java.util.List;
/**
* 员工
*/
public class Employee implements Node{
private String name;
private List<Node> list;
/**
* 层次
*/
private int floor;
public Employee(String name,int floor){
list = new ArrayList<>();
this.name = name;
this.floor = floor;
}
@Override
public Node add(Node node) {
throw new UnsupportedOperationException();
}
@Override
public List<Node> listChildren() {
return list;
}
@Override
public String print() {
StringBuilder res = new StringBuilder();
res.append(" ".repeat(Math.max(0, floor)));
res.append("Employee: ").append(name).append('\n');
return res.toString();
}
}
Main
package StructuralPattern.CompositeMode;
/**
* Main
*/
public class Main {
public static void main(String[] args) {
Node company = new Organization("xxx有限公司",0);
Department depart1 = new Department("信息部",1);
Department depart2 = new Department("研发部",1);
Department depart3 = new Department("软件开发部",2);
depart3.add(new Employee("five",3))
.add(new Employee("six",3));
depart2.add(new Employee("four",2)).add(depart3);
depart1.add(new Employee("one",1))
.add(new Employee("two",1))
.add(new Employee("three",1));
company.add(depart1).add(depart2);
System.out.println(company.print());
}
}
result
Summarize
The Composite mode makes content objects and container objects consistent, thereby forming a unified tree structure and handling them in a consistent manner.