【设计模式】(十四)--结构型模式--组合模式

【设计模式】(十四)–结构型模式–组合模式

组合模式定义

Compose objects into tree srtuctures to represent part-whole hierarchies . Composite lets clients treat individual objects and compositions of objects uniformly.

意思是:将对象组合成树形结构以表示“部分–整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
组合模式一般有3个元素

  • Component 抽象节点
  • Leaf 叶子结点
  • Composite 复合节点,该节点包括符合节点的子节点或者叶子节点的子节点

组合模式的优点

  • 1、高层模块调用简单。
  • 2、节点自由增加。

组合模式在使用时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。不易使用继承的方法来增加新的行为,不易控制树枝构建的类型。

组合模式的使用场景

需要描述对象的部分和整体的等级结构的场景,如树形菜单,文件、文件夹的管理。需要使用者忽略个体构建和组合构建的区别,平等对待所有的构件。

组合模式的简单实现

类图
在这里插入图片描述

实现

public class CompositePatternTest {
    public static void main(String[] args) {
        Employee CEO = new Employee("大少", "CEO", 30000);

        Employee technicalManager = new Employee("二少", "技术经理", 20000);

        Employee opsManager = new Employee("三少", "ops经理", 20000);

        Employee javaDevelop1 = new Employee("二少的小弟1", "Java开发", 10000);
        Employee javaDevelop2 = new Employee("二少的小弟2", "Java开发", 10000);

        Employee ops1 = new Employee("三少的小弟1", "ops开发", 10000);
        Employee ops2 = new Employee("三少的小弟1", "ops开发", 10000);

        CEO.add(technicalManager);
        CEO.add(opsManager);

        opsManager.add(javaDevelop1);
        opsManager.add(javaDevelop2);

        opsManager.add(ops1);
        opsManager.add(ops2);

        System.out.println(CEO);
        for (Employee headEmployee : CEO.getSubordinates()) {
            System.out.println(headEmployee);
            for (Employee employee : headEmployee.getSubordinates()) {
                System.out.println(employee);
            }
        }
    }
}
public class Employee {
    private String name;
    private String dept;
    private int salary;
    private List<Employee> subordinates;

    //构造函数
    public Employee(String name, String dept, int sal) {
        this.name = name;
        this.dept = dept;
        this.salary = sal;
        subordinates = new ArrayList<Employee>();
    }

    public void add(Employee e) {
        subordinates.add(e);
    }

    public void remove(Employee e) {
        subordinates.remove(e);
    }

    public List<Employee> getSubordinates() {
        return subordinates;
    }

    public String toString() {
        return ("【Employee】姓名 : " + name
                + ", dept : " + dept + ", salary :"
                + salary + " ");
    }
}

结果
在这里插入图片描述

原创文章 29 获赞 41 访问量 943

猜你喜欢

转载自blog.csdn.net/lovesunren/article/details/105872848