标签:
组合设计模式在日常生活中比较常见,在数据结构中就是我们的树结构。
常见的有:
1. 多级树形菜单
2. 文件和文件夹目录
将对象组合成树形结构以表示“部分-整体”的层次结构,使得对象和组合对象的使用具有一致性。
Component: 抽象根节点,为组合中的对象声明接口。在适当的情况下,实现所有类共有接口的缺省行为。
Composite:定义有子结点的那些枝干节点的行为,存储子结点,在Component接口中实现与子结点有关的操作。
Leaf: 在组合中表示叶子节点对象,叶子节点没有子结点,在组合中定义节点对象的行为。
Client:通过Component接口操纵组合节点的对象。
public abstract class Component {
protected String name;
public Component(String name) {
this.name = name;
}
/**
* 具体的逻辑方法由子类实现
*/
public abstract void doSomething();
}
抽象根节点里面主要有一个抽象方法doSomething()。具体的方法由子类去实现。
public class Compsite extends Component {
private List<Component> components = new ArrayList<>();
public Compsite(String name) {
super(name);
}
@Override
public void doSomething() {
System.out.println(name);
if (null != components) {
for (Component component : components) {
component.doSomething();
}
}
}
/**
* 添加子节点
*
* @param child
*/
public void addChild(Component child) {
components.add(child);
}
/**
* 移除子结点
*
* @param child
*/
public void removeChild(Component child) {
components.remove(child);
}
/**
* 获取子结点对应下标
* @param index
* @return
*/
public Component getChildren(int index) {
return components.get(index);
}
}
在具体的枝干节点里面,有一个存储节点的容器,用来存储子结点,在doSomething()方法里面,首先打印出当前节点的名称,接着遍历所有的子结点,调用其doSomething方法。
同时里面还有操作子结点集合的增删改查方法。
public class Leaf extends Component {
public Leaf(String name) {
super(name);
}
@Override
public void doSomething() {
System.out.println(name);
}
}
叶子节点里面没有存储子结点的容器,当然也没有对子结点容器的增删改查方法。在doSomething方法里面直接打印出了当前叶子节点的名称。
public class Client {
public static void main(String[] args) {
//构造一个根节点
Compsite root = new Compsite("Root");
//构造两个枝干节点
Compsite branch1 = new Compsite("Branch1");
Compsite branch2 = new Compsite("Branch2");
//构造两个叶子节点
Leaf leaf1 = new Leaf("Leaf1");
Leaf leaf2 = new Leaf("Leaf2");
// 将两个叶子添加至枝干节点中
branch1.addChild(leaf1);
branch2.addChild(leaf2);
//将枝干节点添加至根节点中
root.addChild(branch1);
root.addChild(branch2);
root.doSomething();
}
}
在Android源码中,一个典型的例子就是View和ViewGroup的嵌套组合。
在上述所展示的视图层级树种,视图控件TextView、Buttong等继承自View,ViewGroup容器也继承自View。ViewGroup同时也包含其他View。但是TextView等视图控件不能包含其它控件。
ViewGroup相对于View多了对视图操作的方法。类似于上面枝干节点比叶子节点多了子结点操作的方法。
为什么ViewGroup比View多了视图操作等方法?
因为ViewGroup实现了ViewParent和ViewManager接口上,ViewManager接口定义了addView,removeView等对子视图操作的方法。
由于我们的重点是View和ViewGroup组合模式的了解,这里对里面的详细细节做过多的分析 ,同上面的继承关系就能看出它们之间的组合关系。
组合设计模式在Android开发中并不多见,我们这里做了解。
标签:
原文地址:http://blog.csdn.net/u010649376/article/details/51340032