简介:
组合模式:组合模式说白了就是可以看成树结构,一个层级结构,如:机构组织,文件文件夹,平常手风琴,权限结构,它里面包含了叶子节点(下面没有子节点了)和父级节点 (下面还有节点)
UML:
实例:
组合抽象
package com.sl.demo.component;
/**
* 组合抽象
* @author pengkun
*
*/
public abstract class Component {
private String name;
public Component(String name) {
super();
this.name = name;
}
public Component() {
super();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
protected abstract void add(Component component);
protected abstract void remove(Component component);
protected abstract void display(int depth);
}
具体实现
package com.sl.demo.component;
/**
* 叶子节点(下面没有子节点)
* @author pengkun
*
*/
public class Leaf extends Component {
public Leaf(String name) {
super(name);
}
public Leaf() {}
@Override
protected void add(Component component) {
System.out.println("没有子节点");
}
@Override
protected void remove(Component component) {
System.out.println("没有子节点");
}
@Override
protected void display(int depth) {
StringBuffer sb=new StringBuffer();
for (int i = 0; i < depth; i++) {
sb.append("☆");
}
System.out.println(sb.toString()+this.getName());
}
}
package com.sl.demo.component;
import java.util.ArrayList;
import java.util.List;
/**
* 有枝节点(下面还有子节点)
* @author pengkun
*
*/
public class Composite extends Component {
//持有一个或多个子节点
private List<Component> childs=new ArrayList<>();
public Composite(String name) {
super(name);
}
public Composite() {}
@Override
protected void add(Component component) {
childs.add(component);
}
@Override
protected void remove(Component component) {
childs.remove(component);
}
@Override
protected void display(int depth) {
StringBuffer sb=new StringBuffer();
for (int i = 0; i < depth; i++) {
sb.append("☆");
}
System.out.println(sb.toString()+this.getName());
//子节点
for (Component component : childs) {
component.display(depth+1);
}
}
}
测试:
@Test
public void test() {
Component root=new Composite("根节点");
Component leaf1=new Leaf("一级叶子节点");
Component component1=new Composite("一级父节点1");
Component component2=new Composite("一级父节点2");
root.add(leaf1);
root.add(component1);
root.add(component2);
Component leaf2=new Leaf("二级叶子节点1");
Component leaf3=new Leaf("二级叶子节点2");
Component leaf4=new Leaf("二级叶子节点3");
component1.add(leaf2);
component1.add(leaf3);
component1.add(leaf4);
root.display(0);
}
结果:
根节点
☆一级叶子节点
☆一级父节点1
☆☆二级叶子节点1
☆☆二级叶子节点2
☆☆二级叶子节点3
☆一级父节点2
需要组合模式场景
当你发现需求书体现部分与整体层次的机构是,以及你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就应该考虑用组合模式了。