8.结构型-组合模式

1.组合模式介绍
a.组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系。
b.组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
c.这种类型的设计模式属于结构型模式。
d.组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象

2.原理类图
在这里插入图片描述

a. Component :这是组合中对象声明接口,在适当情况下,实现所有类共有的接口默认行为,用于访问和管理Component 子部件, Component 可以是抽象类或者接口
b.Leaf : 在组合中表示叶子节点,叶子节点没有子节点
c.Composite :非叶子节点, 用于存储子部件, 在 Component 接口中实现 子部件的相关操作,比如增加(add), 删除。

package com.zjc.designmode.composite;


import java.util.ArrayList;
import java.util.List;


/**
* @author : zoujc
* @date : 2020/11/10
* @description : 组合模式
*/
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;
    }


    @Override
    public String toString(){
        return ("Employee :[ Name : "+ name
                +", dept : "+ dept + ", salary :"
                + salary+" ]");
    }
}
package com.zjc.designmode.composite;


/**
* @author : zoujc
* @date : 2020/11/10
* @description :
*/
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);
            }
        }
    }
}

3.HaspMap使用了组合模式
Map就是个抽象的构建(类似于Component)
HashMap是一个中间的构建(Composite),实现/继承了相关方法
Node是HaspMap的内部类,类似于Leaf的叶子结点,这里就没有put,putAll

4.组合模式注意事项
a.简化客户端操作。客户端只需要面对一致的对象而不用考虑整体部分或者节点叶子的问题。
b.具有较强的扩展性。当我们要更改组合对象时,我们只需要调整内部的层次关系,客户端不用做出任何改动.
c.方便创建出复杂的层次结构。客户端不用理会组合里面的组成细节,容易添加节点或者叶子从而创建出复杂的树形结构
d.需要遍历组织机构,或者处理的对象具有树形结构时, 非常适合使用组合模式.
e.要求较高的抽象性,如果节点和叶子有很多差异性的话,比如很多方法和属性都不一样,不适合使用组合模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值