组合模式
定义
组合模式又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
优点:
- 高层模块调用简单。
- 节点自由增加。
缺点:
在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。
实例
定义3个类,Component、Composite、Leaf类,Component是位于根节点的;Composite是子节点,但是同时也可以包含子节点;Leaf是子节点,不能包含子节点。
- Component
包含3个方法,添加子节点,移除子节点,显示节点下的所有节点信息。
public abstract class Component {
protected String name;
public Component(String name) {
this.name = name;
}
public abstract void addChild(Component component);
public abstract void removeChild(Component component);
public abstract void showAll();
}
- Composite
内部定义一个集合,用来添加、移除、遍历子节点用
public class Composite extends Component {
private List<Component> list = new ArrayList<>();
public Composite(String name) {
super(name);
}
@Override
public void addChild(Component component) {
list.add(component);
}
@Override
public void removeChild(Component component) {
list.remove(component);
}
@Override
public void showAll() {
System.out.println("Composite " + name);
for (Component c : list) {
c.showAll();
}
}
}
- Leaf
Leaf不能添加和移除子节点,所以对addChild和removeChild方法进行抛出异常处理。
public class Leaf extends Component {
public Leaf(String name) {
super(name);
}
@Override
public void addChild(Component component) {
throw new UnsupportedOperationException("叶子节点不能有子节点");
}
@Override
public void removeChild(Component component) {
throw new UnsupportedOperationException("叶子节点不能有子节点");
}
@Override
public void showAll() {
System.out.println("Leaf " + name);
}
}
- main入口的使用
public class MyClass {
public static void main(String[] args) {
Component root = new Composite("root");
Component subRoot = new Composite("sub root");
Component subRoot2 = new Composite("sub root2");
Component leaf = new Leaf("leaf");
Component leaf2 = new Leaf("leaf2");
Component leaf3 = new Leaf("leaf3");
Component leaf4 = new Leaf("leaf4");
subRoot.addChild(leaf2);
subRoot.addChild(leaf3);
subRoot2.addChild(leaf4);
root.addChild(leaf);
root.addChild(subRoot);
root.addChild(subRoot2);
root.showAll();
}
}
打印结果:
Composite root
Leaf leaf
Composite sub root
Leaf leaf2
Leaf leaf3
Composite sub root2
Leaf leaf4
在Android当中View和ViewGroup就是采用组合模式