复合形式设计构成图片 (复合设计是什么)

结构设计模式:复合模式

复合设计,复合式装修设计

大家好! 我正在研究设计模式的理论方面。 所以,据我所知,我想用例子来描述它们。 我将解释另一种结构设计模式……

复合图案…

听起来怪怪的? 不..我猜..所以,正如它自己命名的那样,这种模式是基于组合的。

它通过定义的结构/层次结构表示一组对象。

实际上它是一个树结构。 复合材料可以有复合材料或叶子。

复合设计,复合式装修设计

例如,我们可以考虑一家公司。 我们有几个部门。 在每个部门下,我们都有一组员工。 这是一种等级制度。

在这里,我们从设计模式方面需要记住一些关键的事情。

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 的孩子。 上图中没有它。

如果我们为此绘制树层次结构,它将是这样的……

复合设计,复合式装修设计

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

再见…