定义
组合模式又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。
组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
优缺点
优点:
- 高层模块调用简单。
- 节点自由增加。
缺点:
- 使得设计更加复杂,客户端需要花更多时间理清类之间的层次关系。
结构
- 抽象构件(Component):定义了访问及管理它的子构件的方法,如增加子构件、删除子构件、获取子构件等 。
- 容器构件(Composite):抽象构件的具体实现类。
- 叶子结构(Leaf):它在组合结构中表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为。。
实现
学校和学院的例子
Component
/**
* 抽象构件
*/
@Data
public abstract class Component {
private String name;
//构造器
public Component(String name) {
super();
this.name = name;
}
protected void add(Component component) {
System.out.println("add 默认实现");
}
protected void remove(Component component) {
System.out.println("remove 默认实现");
}
public abstract void print();
}
Composite
/**
* 容器构件
*/
public class Composite extends Component {
List<Component> componentList = new ArrayList<Component>();
public Composite(String name) {
super(name);
}
@Override
protected void add(Component component) {
componentList.add(component);
}
@Override
protected void remove(Component component) {
componentList.remove(component);
}
@Override
public void print() {
System.out.println("--------------" + getName() + "--------------");
for (Component component : componentList) {
component.print();
}
}
}
Leaf
因为是叶子,所以不需要重写add和remove方法。print也只需要打印自己的name就可以了。
/**
* 叶子
*/
public class Leaf extends Component {
public Leaf(String name) {
super(name);
}
@Override
public void print() {
System.out.println(getName());
}
}
Main(测试类)
/**
* 学校---学院
*/
public class Main {
public static void main(String[] args) {
//从大到小创建对象 学校
Component university = new Composite("清华大学");
//创建 学院
Component computerCollege = new Leaf("计算机学院");
Component engineercollege = new Leaf("信息工程学院");
//将学院加入到 学校
university.add(computerCollege);
university.add(engineercollege);
university.print();
//将学院移除
university.remove(computerCollege);
university.print();
}
}
------------结果-----------
--------------清华大学--------------
计算机学院
信息工程学院
--------------清华大学--------------
信息工程学院
PS:其实大家可能发现了,这种结构和HashMap有点相似。如果我们使用HashMap,就可以很简单的就能实现组合模式。
/**
* 学校---学院
*/
public class Main {
public static void main(String[] args) {
Map<String, Object> universityMap = new HashMap<>();
Map<Integer, String> collegeMap = new HashMap<>();
collegeMap.put(1, "计算机学院");
collegeMap.put(2, "信息工程学院");
universityMap.put("清华大学", collegeMap);
System.out.println(universityMap);
}
}
--------结果--------
{清华大学={1=计算机学院, 2=信息工程学院}}