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

tech2022-08-12  145

文章目录

一、组合模式简介二、组合模式的作用三、组合模式的应用四、示例演示组合模式结构图代码示例测试代码

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

一、组合模式简介

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

二、组合模式的作用

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

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

三、组合模式的应用

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

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

四、示例演示组合模式

结构图

代码示例

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)); } } } }

输出结果:

公司 人力资源部 营销事业部 营销运维部 业务支持部 营销市场部 运营管理部
最新回复(0)