设计模式-组合模式
- 组合模式详解
-
组合模式在android中的实际运用
11_1-11-7[01_45_32][20180802-202841-4].jpg
-
1.组合模式详解
1.概念
将对象以属性结构组织起来,以达成“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性
树的结构(二叉树,平衡二叉树)-->组合设计模式
2.使用场景
1.需要表示一个对象整体或部分层次。他有整体和层次的区分,又让客户端使用一致
2.让客户端能够忽略不同对象层次的变化。客户端只需要对抽象的结构编程,而不需要关心每一个对象层次的细节
3.UML结构图分析
图;
Component
+operation():void
+add(com:Component):void
+remove(com:Component):void
+getChild():int
client
Leaf Composite
+operation():void +operation():void
+add(com:Component):void
+remove(com:Component):void
+getChild(i:int):Component
组合设计模式包含了四个部分,Client,Component抽象组件(它有叶子组件和组成组件)
Component:最重要部分:是一个接口,也可以管理所有的子对象,如果要递归,使用Component即可
Leaf: 叶子节点没有子节点
Composite:树枝节点,定义了子部件的一些部分行为,实现了抽象构建Component的方法
Client通过Component控制Leaf和Composite
4.实际代码分析
1.抽象类
public abstract class File{ //可以定义接口,也可以是抽象方法
private String name;
private get/setName();
public abstract void watch();
public void add(File file){
throw new UnsupportedOperationException();
}
public void remove(File file){
throw new UnsupportedOperationException();
}
publci File getChild(int position){
throw new UnsupportedOperationException();
}
}
三个方法组合方法:add、remove、getChild
抽象方法watch()留给子类实现
2.实现类 (1.文件夹Folder 2.文本文件)
public class Folder extends File{
private List<File> mFileList;
public Folder(String name){
super(name);
mFileList = new ArrayList<>();
}
public void watch(){
StringBuffer fileName = new StringBuffer();
for(File file:mFileList){
fileName.append(file.getName()+";");
}
System.out.printf("组合模式","这是一个叫"+getName()+"文件夹,包含"+mFileList.size()+"个文件,分别是"+fileName)
}
public void add(File file){
mFileList.add(file);
}
public void remove(File file){
mFileList.add(file);
}
public File getChild(int position){
return mFileList.get(position);
}
}
public class TextFile extends File{
public TextFile(String name){
super(name);
}
public void watch(){
System.out.print("组合模式","这是一个叫"+getName()+"的文本文件");
}
}
3.调用
public static void main(String[] args){
TextFile txA = new TextFile("a.txt");
TextFile txB = new TextFile("b.txt");
TextFile txc = new TextFile("c.txt");
txA.watch();
Folder folder = new Folder("某个文件夹名称"):
folder.add(txA);
folder.add(txB);
folder.add(txc);
folder.watch();
folder.getChild(1).watch();
}
属性结构中,不管是Folder,还是TextFile,它们都是抽象File的节点,我们只关心File的改变,把File封装好,来进行选择。
总结: 整体到部分的组合模式。
5.组合模式的优点
1.高层模块调用简单,只需要调用高层的api,而不需要访问所有组成部分
2.节点自由增加(刚才两个子类,可以更多)
缺点:控制树枝构建的类型就不太容易了,定义好类型之后,想改变的话不好整,继承方法增加新的方法比较麻烦
2.组合模式在android中的实际运用
1.Android中View的结构是树形结构的
ViewGroup
11_1-11-7[01_45_32][20180802-202841-4].jpg 11-8_11章结束[00_00_31][20180802-205510-5].jpg 11-8_11章结束[00_01_15][20180802-205604-6].jpg 11-8_11章结束[00_02_42][20180802-205617-7].jpg 11-8_11章结束[00_03_07][20180802-205623-8].jpg
网友评论