“组合模式”也被称为“部分整体模式”该模式属于结构型模式的一种。
讲解该模式之前先带大家熟悉一下“树形结构”。相信大家对“树形结构”不会太陌生,如果你刚好不太了解的话可以想一下大树,一颗树它分别有树根、树枝、树叶,正好树形结构中也有根节点、子节点(非叶子节点)、叶子节点。
组合模式就运用了树形结构,该模式的核心思想是:将多个对象组合成树形结构,以此结构来表示“整体-部分”之间的层次关系。
UML类图讲解:
1、Component:组合模式中的“根节点”,可以是接口、抽象类、普通类,该类中定义了其子类的所有共性内容,并且该类中还存在着用于访问和管理它子部件的方法。
2、Leaf:组合中的叶子节点,也就是最末端的节点,该节点下不会再有子节点。
3、Composite:非叶子节点,它的作用是存储子部件,并且在Composite中实现了对子部件的相关操作。
案例:某公司老板需要开发一个人员和部门管理系统,要求是可以灵活的新增、删除、展示部门以及部门下的员工。此时我们就可以通过组合模式来实现。
组织构成 => 对应Component角色
public abstract class OrganizationComponent {
// 名称
private String name;
// 描述
private String describe;
/**
* 显示方法
* 该方法不论是子节点还是叶子节点都需要,所以将其设计成抽象方法让子类自行实现。
*/
public abstract void show();
/**
* 新增方法
* 因为叶子节点不需要该方法,所以将该方法写成一个空实现方法,这样叶子节点继承该类时就不会被迫实现不需要的方法了。
*/
public void add(OrganizationComponent component) {
throw new UnsupportedOperationException();
}
/**
* 删除方法
* 同add()方法一样设计为空实现。
*/
public void remove(OrganizationComponent component) {
throw new UnsupportedOperationException();
}
... get()、set()、有参构造方法
}
公司 => 对应Composite角色
public class Company extends OrganizationComponent {
// components的作用就是,管理公司下的部门,也就是公司下的子节点。
private List<OrganizationComponent> components = new ArrayList<>();
... 有参构造方法
/**
* 重写添加方法
*/
@Override
public void add(OrganizationComponent component) {
this.components.add(component);
}
/**
* 重写删除方法
*/
@Override
public void remove(OrganizationComponent component) {
this.components.remove(component);
}
/**
* 实现显示方法
*/
@Override
public void show() {
// 打印公司名称
System.out.println("======" + "名称:" + this.getName() + " 描述:" + this.getDescribe() + "======");
// 打印公司下的子节点
for (OrganizationComponent component : components) {
component.show();
}
}
}
部门 => 对应Composite角色
public class Department extends OrganizationComponent {
// components的作用就是,管理部门下的员工,也就是部门下的子节点。
private List<OrganizationComponent> components = new ArrayList<>();
... 有参构造方法
/**
* 重写添加方法
*/
@Override
public void add(OrganizationComponent component) {
this.components.add(component);
}
/**
* 重写删除方法
*/
@Override
public void remove(OrganizationComponent component) {
this.components.remove(component);
}
/**
* 实现显示方法
*/
@Override
public void show() {
// 打印部门名称
System.out.println("======" + "名称:" + this.getName() + " 描述:" + this.getDescribe() + "======");
// 打印部门下的子节点
for (OrganizationComponent component : components) {
component.show();
}
}
}
员工 => 对应的是Leaf角色
public class Workers extends OrganizationComponent {
... 有参构造方法 /**
* 实现显示方法
*/
@Override
public void show() {
System.out.println("名称:" + this.getName() + " 描述:" + this.getDescribe());
}}
客户端测试类
public class Client {
public static void main(String[] args) { // 公司 OrganizationComponent company = new Company("小菜鸟公司", "从不加加班的公司");
// 部门 OrganizationComponent department = new Department("研发部", "一个神奇的部门");
// 公司下添加部门 company.add(department); // 员工 department.add(new Workers("大牛", "上班摸摸鱼"));
department.add(new Workers("小菜鸟一号", "天天CRUD"));
// 输出 company.show(); }}
执行结果
图片:执行结果图
1、使用组合模式可以让用户可以使用统一的方式处理整个树形结构的个别对象和组合对象,从而简化客户端的操作。
2、组合模式具有较强的扩展性,当我们想要更改组合对象时,只需要调整内部的层次关系即可,客户端不需要作出任何改动。
3、客户端不用考虑组合中的细节,通过添加节点和叶子就可以创建出复杂的树形结构。
4、当需要处理的对象是树形结构时可以考虑使用组合模式。
5、节点和叶子节点存在很大差异的情况下不建议使用组合模式。
今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。