结构设计模式:复合模式

大家好! 我正在研究设计模式的理论方面。 所以,据我所知,我想用例子来描述它们。 我将解释另一种结构设计模式……
复合图案…
听起来怪怪的? 不..我猜..所以,正如它自己命名的那样,这种模式是基于组合的。
它通过定义的结构/层次结构表示一组对象。
实际上它是一个树结构。 复合材料可以有复合材料或叶子。

例如,我们可以考虑一家公司。 我们有几个部门。 在每个部门下,我们都有一组员工。 这是一种等级制度。
在这里,我们从设计模式方面需要记住一些关键的事情。
3 个关键概念
- Component — 定义组合中对象的接口以及访问和管理其子组件的接口。
- Leaf — 定义组合中原始对象的行为。 它表示合成中的叶对象。
- Composite — 存储子组件并实现从组件接口派生的子组件并管理它们。
如果我在一个简单的 UML 图中显示它,它会是这样的……

如您所见,Composite 类包含 Component 对象。 所以,这就是我们看到构图的地方!
让我们以同一个公司的例子来证明这一点。
我们的组件类将是 Employee 接口。
员工
public interface Employee {
void showDetails();
}
离开将是以下课程...Developer/QA/Manager/CEO
CEO
public class CEO implements Employee {
private final String name;
private final String dept;
private final String job;
public CEO(String name, String dept, String job) {
this.name = name;
this.dept = dept;
this.job = job;
}
@Override
public void showDetails() {
System.out.println(this);
}
@Override
public String toString() {
return "CEO{" +
"name='" + name + '\'' +
", dept='" + dept + '\'' +
", job='" + job + '\'' +
'}';
}
}
Developer
import java.util.List;
public class Developer implements Employee {
private final String name;
private final String dept;
private final String job;
public Developer(String name, String dept, String job) {
this.name = name;
this.dept = dept;
this.job = job;
}
@Override
public void showDetails() {
System.out.println(this);
}
@Override
public String toString() {
return "Developer{" +
"name='" + name + '\'' +
", dept='" + dept + '\'' +
", job='" + job + '\'' +
'}';
}
}
Manager
public class Manager implements Employee {
private final String name;
private final String dept;
private final String job;
public Manager(String name, String dept, String job) {
this.name = name;
this.dept = dept;
this.job = job;
}
@Override
public void showDetails() {
System.out.println(this);
}
@Override
public String toString() {
return "Manager{" +
"name='" + name + '\'' +
", dept='" + dept + '\'' +
", job='" + job + '\'' +
'}';
}
}
QA
public class QA implements Employee {
private final String name;
private final String dept;
private final String job;
public QA(String name, String dept, String job) {
this.name = name;
this.dept = dept;
this.job = job;
}
@Override
public void showDetails() {
System.out.println(this);
}
@Override
public String toString() {
return "QA{" +
"name='" + name + '\'' +
", dept='" + dept + '\'' +
", job='" + job + '\'' +
'}';
}
}
现在我们需要一个包含我们员工的 Composite 类。
CompanyDirectory
public class CompanyDirectory implements Employee {
private final List<Employee> employees;
public CompanyDirectory() {
this.employees = new ArrayList<>();
}
@Override
public void showDetails() {
for (Employee employee : employees) {
employee.showDetails();
}
}
public void addEmployee(Employee employee) {
employees.add(employee);
}
public void removeEmployee(Employee employee) {
employees.remove(employee);
}
}
然后我将创建一个 Company 类,它又是一个 Composite 类型,并且还有一个 name 属性。
public class Company extends CompanyDirectory {
private final String name;
public Company(String name) {
this.name = name;
}
public void showCompanyName() {
System.out.println("Company: " + name);
}
}
课程设置现已完成! 是时候测试了!!! 让我们创建测试类...
CompositeDemo
public class CompositeDemo {
public static void main(String[] args) {
CEO ceo = new CEO("Andrew", "COM", "Chief Executive Officer");
Developer developer1 = new Developer("salitha", "ENG", "Software Engineer");
Developer developer2 = new Developer("Jhon", "ENG", "Senior Software Engineer");
QA qe1 = new QA("Tom", "ENG", "Quality Assurance Engineer");
QA qe2 = new QA("Jimmy", "ENG", "Quality Assurance Lead");
Manager manager = new Manager("Peter", "HR", "HR Manager");
Manager executive = new Manager("Derik", "HR", "Senior HR Executive");
CompanyDirectory engDepartment = new CompanyDirectory();
engDepartment.addEmployee(developer1);
engDepartment.addEmployee(developer2);
engDepartment.addEmployee(qe1);
engDepartment.addEmployee(qe2);
CompanyDirectory hrDepartment = new CompanyDirectory();
hrDepartment.addEmployee(manager);
hrDepartment.addEmployee(executive);
Company company = new Company("XYZ");
company.addEmployee(ceo);
company.addEmployee(engDepartment);
company.addEmployee(hrDepartment);
company.showCompanyName();
company.showDetails();
}
}
输出是这样的。。

IntelliJ IDE 为这些类提供了一个很好的表示。 你可以在下面看到它。

注意:CEO 也只是 Employee 的孩子。 上图中没有它。
如果我们为此绘制树层次结构,它将是这样的……

这都是关于复合模式的家伙!
再见…