设计模式学习笔记:组合模式(Composite)

努力才会收获成功,不努力只能永远羡慕别人。

一、组合模式简介

组合模式是设计模式中结构型模式的一种。它表示了一种将相似对象组合成树状结构的“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

二、组合模式的作用

组合模式的目的是:让客户端不再区分操作的是组合对象还是叶子对象,而是以一个统一的方式来操作。实现这个目标的关键之处,是设计一个抽象的组件类,让它可以代表组合对象和叶子对象。这样客户端就不用区分到底是组合对象还是叶子对象了,只需要全部当成组件对象进行统一的操作就可以了。

  1. 统一元素与部分整体,简化处理代码。
  2. 将元素内部结构同处理程序解耦,从而一致的对待元素与部分整体。

三、组合模式的应用

  1. 在对象与部分整体之间,想要通过统一的方式对其进行处理,模糊处理其差异的时候可以选用组合模式。
  2. 当客户端忽视结构层次,无差异的看待元素与部分整体,不关心元素和部分整体之间的层次结构,想要实现对统一接口编程的时候。
  3. 对象组合的变化是动态的,而客户端想要一致的处理对象的时候。

例:文件系统、企业结构都是组合模式的典型应用。

四、示例演示组合模式

结构图

组合模式-公司组织架构图

代码示例

Dept(部门抽象类)

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

/**
 * 部门抽象类
 *
 * @author ZhengNC
 * @date 2020/9/2 19:36
 */
public abstract class Dept {

    private List<Dept> deptList = new ArrayList<>();

    /**
     * 添加子部门
     *
     * @param dept
     */
    public void addDept(Dept dept){
        deptList.add(dept);
    }

    /**
     * 移除子部门
     *
     * @param dept
     */
    public void removeDept(Dept dept){
        deptList.remove(dept);
    }

    /**
     * 获取所有子部门
     *
     * @return
     */
    public List<Dept> getDeptList(){
        return deptList;
    }

    /**
     * 打印部门名称
     */
    public abstract void printName();
}

Company(公司)

/**
 * 公司
 *
 * @author ZhengNC
 * @date 2020/9/2 19:42
 */
public class Company extends Dept {
    @Override
    public void printName() {
        System.out.println("公司");
    }
}

HumanResourcesDept(人力资源部)

/**
 * 人力资源部
 *
 * @author ZhengNC
 * @date 2020/9/2 19:44
 */
public class HumanResourcesDept extends Dept {
    @Override
    public void printName() {
        System.out.println("人力资源部");
    }
}

MarketingDept(营销事业部)

/**
 * 营销事业部
 *
 * @author ZhengNC
 * @date 2020/9/2 19:46
 */
public class MarketingDept extends Dept {
    @Override
    public void printName() {
        System.out.println("营销事业部");
    }
}

OperationManagementDept(运营管理部)

/**
 * 运营管理部
 *
 * @author ZhengNC
 * @date 2020/9/2 19:49
 */
public class OperationManagementDept extends Dept {
    @Override
    public void printName() {
        System.out.println("运营管理部");
    }
}

MarketingOperationDept(营销运维部)

/**
 * 营销运维部
 *
 * @author ZhengNC
 * @date 2020/9/2 19:55
 */
public class MarketingOperationDept extends Dept {
    @Override
    public void printName() {
        System.out.println("营销运维部");
    }
}

BusinessSupportDept(业务支持部)

/**
 * 业务支持部
 *
 * @author ZhengNC
 * @date 2020/9/2 19:57
 */
public class BusinessSupportDept extends Dept {
    @Override
    public void printName() {
        System.out.println("业务支持部");
    }
}

MarketDept(营销市场部)

/**
 * 营销市场部
 *
 * @author ZhengNC
 * @date 2020/9/2 20:00
 */
public class MarketDept extends Dept {
    @Override
    public void printName() {
        System.out.println("营销市场部");
    }
}

测试代码

/**
 * 测试组合模式
 *
 * @author ZhengNC
 * @date 2020/9/2 20:01
 */
public class TestComposite {

    public static void main(String[] args) {
        Dept company = new Company();
        company.addDept(new HumanResourcesDept());
        Dept marketingDept = new MarketingDept();
        company.addDept(marketingDept);
        company.addDept(new OperationManagementDept());

        marketingDept.addDept(new MarketingOperationDept());
        marketingDept.addDept(new BusinessSupportDept());
        marketingDept.addDept(new MarketDept());

        printDept(company, 0);
    }

    public static void printDept(Dept dept, int level){
        if (dept != null){
            for (int i = 0; i < level; i++){
                System.out.print("\t");
            }
            dept.printName();
            if (dept.getDeptList() != null){
                int finalLevel = level + 1;
                dept.getDeptList().forEach(x -> printDept(x, finalLevel));
            }
        }
    }
}

输出结果:

公司
	人力资源部
	营销事业部
		营销运维部
		业务支持部
		营销市场部
	运营管理部
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值