瞎扯
说到View与ViewGroup,必讲的就是android中用到的一个非常重要的设计模式.
组合模式,
这点很形象.也很巧妙.
组合模式是什么
不扯别的,
就是把一个事物,分成2个体系,
一个是自身和各种子类实现,
一个是容器体系.也是其子类
举些例子:
1.文件,文件夹
2.树枝,树叶
3.物体,盒子.
细说:
1.文件,文件夹都是数据,但是文件夹可以装各种各样的文件.还可以装文件夹
2.树枝和树叶,这个其实不好解释.但确实可看成组合模式.
3.物体,盒子.盒子就是用来装物体的,而盒子也属于物体.盒子也可以单独存在.
这个是不是就比较好理解了.
常见的组合模式结构图

如果看上面的,不好理解.
那么代码怎么来表达呢.
public class Test {
public class Wood {
public String name() {
return "木头";
}
public void printName() {
String name = name();
Log.i("name", name);
}
}
public class Tree extends Wood {
private List<Wood> childs = new ArrayList<>();
public void add(Wood wood) {
childs.add(wood);
}
public void remove(Wood wood) {
childs.remove(wood);
}
public String name() {
return "树枝";
}
public void printChildName() {
printName();
int size = getChilds().size();
for (int i = 0; i < size; i++) {
Wood wood = getChilds().get(i);
if (wood instanceof Tree) {
((Tree) wood).printChildName();
} else {
wood.printName();
}
}
}
}
public class Leaf extends Wood {
public String name() {
return "树叶";
}
}
}
test
public void test() {
//第一组
Tree tree = new Tree();
for (int i = 0; i < 3; i++) {
tree.add(new Leaf());
}
//第二组
Tree tree1 = new Tree();
for (int i = 0; i < 4; i++) {
tree1.add(new Leaf());
}
//总和
Tree treeGroup = new Tree();
treeGroup.add(tree);
treeGroup.add(tree1);
}
把上面的换成View,ViewGroup
public void test(Context context) {
//第一组
ViewGroup tree = new LinearLayout(context);
for (int i = 0; i < 4; i++) {
tree.addView(new View(context));
}
//第二组
ViewGroup tree1 = new LinearLayout(context);
for (int i = 0; i < 3; i++) {
tree1.addView(new View(context));
}
//总和
LinearLayout treeGroup = new LinearLayout(context);
treeGroup.addView(tree);
treeGroup.addView(tree1);
}
是不是一个意思.
总结:
View,ViewGroup.这么设计是非常符合OOP设计的.
View多种多样.但是有了ViewGroup.才能变化多端,各种组合.显示复杂的页面.
如果没有ViewGroup.想一想,每个复杂的页面都需要单独的View去完成.多不和谐.
组合的魅力在于.ViewGroup也是View的子类.也就是说它自己也是View.
所以.ViewGroup
可以无限嵌套,添加.这样就有了无限种可能.
就如新的框架Flutter说的.万物皆Widget
就这样吧
您的喜欢与回复是我最大的动力-_-
交流群:493180098
网友评论