Java Composite Pattern(组合模式)

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

优点: 1、高层模块调用简单。 2、节点自由增加。
缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

关键代码:树枝内部组合该接口,并且含有内部属性 List,里面放 Component。

  1. 创建 Employee 类,该类带有 Employee 对象的列表。
/**
 * 1. 创建 Employee 类,该类带有 Employee 对象的列表。
 * @author mazaiting
 */
public class Employee {
    /**姓名*/
    private String name;
    /**职位*/
    private String dept;
    /**工资*/
    private int salary;
    private List<Employee> subordinates;
    public Employee(String name, String dept, int salary) {
        this.name = name;
        this.dept = dept;
        this.salary = salary;
        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;
    }

    @Override
    public String toString() {
        return "Employee [name=" + name + ", dept=" + dept + ", salary="
                + salary + "]";
    }
    
}
  1. 使用 Employee 类来创建和打印员工的层次结构。
/**
 * 2. 使用 Employee 类来创建和打印员工的层次结构。
 * @author mazaiting
 */
public class Client {
    public static void main(String[] args) {
        Employee CEO = new Employee("John", "CEO", 30000);

        Employee headSales = new Employee("Robert", "Head Sales", 20000);

        Employee headMarketing = new Employee("Michel", "Head Marketing", 20000);

        Employee clerk1 = new Employee("Laura", "Marketing", 10000);
        Employee clerk2 = new Employee("Bob", "Marketing", 10000);

        Employee salesExecutive1 = new Employee("Richard", "Sales", 10000);
        Employee salesExecutive2 = new Employee("Rob", "Sales", 10000);

        CEO.add(headSales);
        CEO.add(headMarketing);

        headSales.add(salesExecutive1);
        headSales.add(salesExecutive2);

        headMarketing.add(clerk1);
        headMarketing.add(clerk2);

        // 打印该组织的所有员工
        System.out.println(CEO);
        for (Employee headEmployee : CEO.getSubordinates()) {
            System.out.println(headEmployee);
            for (Employee employee : headEmployee.getSubordinates()) {
                System.out.println(employee);
            }
        }
    }
}

  1. 打印结果
Employee [name=John, dept=CEO, salary=30000]
Employee [name=Robert, dept=Head Sales, salary=20000]
Employee [name=Richard, dept=Sales, salary=10000]
Employee [name=Rob, dept=Sales, salary=10000]
Employee [name=Michel, dept=Head Marketing, salary=20000]
Employee [name=Laura, dept=Marketing, salary=10000]
Employee [name=Bob, dept=Marketing, salary=10000]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 9,406评论 1 15
  • 1 场景问题# 1.1 商品类别树## 考虑这样一个实际的应用:管理商品类别树。 在实现跟商品有关的应用系统的时候...
    七寸知架构阅读 11,314评论 10 59
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,600评论 18 399
  • <1>适配器模式 何为适配器模式?适配器模式将一个类的接口适配成用户所期待的。一个适配器通常允许因为接口不兼容而不...
    _onePiece阅读 20,547评论 26 135
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,183评论 19 139

友情链接更多精彩内容