定义:
组合模式也叫合成模式,有时又叫做部分-整体模式,主要是用来描述部分与整体的关系。对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。现在生活中有很多这样的例子,比如:公司的职级体系,文件的目录接口,包括我们的亲属关系等待,都可以用这种树形结构的设计模式来设计。
组合模式的角色:
- Component:抽象定义的基础组件,包含组合对象默认的方法和属性,叶子和树枝构件都继承于它。
- Leaf:叶子构件或者叫叶子对象,遍历的最小单位,也就是树形结构中最末端的部分
- Composite:树枝构件或者加树枝对象,它是组合模式的核心构件,它的作用是组合树枝节点和叶子节点形成一个树形结构。
简单实现:
/**
* 组合模式
* 抽象工具
* 基础构建
*/
public abstract class Component {
//职级
protected String rankName;
public Component(String rankName){
this.rankName = rankName;
}
//增加一个职级
protected abstract void add(Component component);
//减少一个职级
protected abstract void delete(Component component);
}
package com.compose;
import java.util.ArrayList;
import java.util.List;
/**
* 组合模式
* 核心构架
*/
public class Composite extends Component{
private List<Component> components = new ArrayList<>();
public Composite(String usrName) {
super(usrName);
}
@Override
protected void add(Component component) {
components.add(component);
}
@Override
protected void delete(Component component) {
components.remove(component);
}
//获取所有字节点
public List<Component> getChildren(){
return this.components;
}
}
/**
* 组合模式
* 叶子节点
*/
public class Leaf extends Component{
List<Component> components = new ArrayList<>();
public Leaf(String usrName) {
super(usrName);
}
@Override
protected void add(Component component) {
components.add(component);
}
@Override
protected void delete(Component component) {
components.remove(component);
}
}
/**
* 组合模式
*/
public class TestCompose {
public static void main(String[] args) {
Composite root = new Composite("经理");
root.add(new Leaf("助理"));
Composite composite1 = new Composite("副经理");
root.add(composite1);
Composite composite2 = new Composite("组长1");
composite1.add(composite2);
composite2.add( new Leaf("组员1"));
show(root);
}
public static void show(Composite root){
System.out.println("-------" + root.rankName);
for (Component c:root.getChildren()) {
if(c instanceof Leaf){
System.out.println("叶子节点----" + c.rankName);
}else {
show((Composite)c);
}
}
}
}
//打印结果
-------经理
----助理
-------副经理
-------组长1
----组员1
总结:
组合模式需要在特定的场景中使用,表示成树状结构,组合模式中所有节点都是 基础组件Component,这更有利于高层模块中的调用,无需关注它是单个对象还是整体组合,而且如果不是叶子节点都可以获取到它的子节点。同时,扩展节点十分方便,只需要知道它的父节点。
参考《设计模式之禅》秦小波著