一.介绍
组合模式(Composite Pattern)属于结构型模式。组合模式又叫作部分整体模式,它是一种将对象组合成树状层次结构的模式,用来表示整体-部分的关系,使用户对单个对象和组合对象具有一致的访问性。组合模式有透明方式和安全方式两种实现方式
二.UML类图
1.透明方式
- 抽象节点中定义了规范,客户端无需区别叶子节点和树枝节点,使用方便
- 叶子节点本来无add、remove、getChild方法,但是因为抽象中定义了规范,所以必须实现它们,会带来一些安全性问题
2.安全方式
- 客户端需要区别叶子节点和树枝节点,使用不方便
- 叶子节点无add、remove、getChild方法,不存在安全性问题
三.具体代码
业务代码
//抽象节点
public abstract class Component {
abstract void add(Component component);
abstract void remove(Component component);
abstract Component getChild(int i);
abstract void operation();
}
//叶子节点
class Leaf extends Component{
private String name;
public Leaf(String name) {
this.name = name;
}
@Override
void add(Component component) {}
@Override
void remove(Component component) {}
@Override
Component getChild(int i) {
return null;
}
@Override
void operation() {
System.out.print(name);
}
}
//树枝节点
class Composite extends Component{
private ArrayList<Component> children = new ArrayList<>();
@Override
void add(Component component) {
children.add(component);
}
@Override
void remove(Component component) {
children.remove(component);
}
@Override
Component getChild(int i) {
return children.get(i);
}
@Override
void operation() {
children.forEach(Component::operation);
}
}
客户端
public class Client {
public static void main(String[] args) {
Component level1 = new Composite();
level1.add(new Leaf("1"));
level1.add(new Leaf("2"));
Component level2 = new Composite();
level2.add(new Leaf("2.1"));
level1.add(level2);
level1.operation();
}
}
四.使用场景
- 需要表示一个对象整体与部分的层次结构
- 要求对用户隐藏组合对象与单个对象的不同,用户可以使用统一的接口操作组合结构中的所有对象
- 组织机构树
- 文件/文件夹
五.优点
- 简化了客户端代码(客户端一致地处理单个对象和组合对象)
- 符合开闭原则(新增具体实现类不需要更改源代码)
到此这篇关于Java结构型模式中的组合模式详解的文章就介绍到这了,更多相关Java组合模式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!