設(shè)計(jì)模式-組合模式
- 組合模式詳解
-
組合模式在android中的實(shí)際運(yùn)用
11_1-11-7[01_45_32][20180802-202841-4].jpg
-
1.組合模式詳解
1.概念
將對(duì)象以屬性結(jié)構(gòu)組織起來,以達(dá)成“部分-整體”的層次結(jié)構(gòu)哺壶,使得客戶端對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性
樹的結(jié)構(gòu)(二叉樹精偿,平衡二叉樹)-->組合設(shè)計(jì)模式
2.使用場景
1.需要表示一個(gè)對(duì)象整體或部分層次。他有整體和層次的區(qū)分击费,又讓客戶端使用一致
2.讓客戶端能夠忽略不同對(duì)象層次的變化拢蛋。客戶端只需要對(duì)抽象的結(jié)構(gòu)編程蔫巩,而不需要關(guān)心每一個(gè)對(duì)象層次的細(xì)節(jié)
3.UML結(jié)構(gòu)圖分析
圖谆棱;
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
組合設(shè)計(jì)模式包含了四個(gè)部分,Client圆仔,Component抽象組件(它有葉子組件和組成組件)
Component:最重要部分:是一個(gè)接口垃瞧,也可以管理所有的子對(duì)象,如果要遞歸坪郭,使用Component即可
Leaf: 葉子節(jié)點(diǎn)沒有子節(jié)點(diǎn)
Composite:樹枝節(jié)點(diǎn)个从,定義了子部件的一些部分行為,實(shí)現(xiàn)了抽象構(gòu)建Component的方法
Client通過Component控制Leaf和Composite
4.實(shí)際代碼分析
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();
}
}
三個(gè)方法組合方法:add嗦锐、remove嫌松、getChild
抽象方法watch()留給子類實(shí)現(xiàn)
2.實(shí)現(xiàn)類 (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("組合模式","這是一個(gè)叫"+getName()+"文件夾奕污,包含"+mFileList.size()+"個(gè)文件萎羔,分別是"+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("組合模式","這是一個(gè)叫"+getName()+"的文本文件");
}
}
3.調(diào)用
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("某個(gè)文件夾名稱"):
folder.add(txA);
folder.add(txB);
folder.add(txc);
folder.watch();
folder.getChild(1).watch();
}
屬性結(jié)構(gòu)中碳默,不管是Folder贾陷,還是TextFile,它們都是抽象File的節(jié)點(diǎn)嘱根,我們只關(guān)心File的改變髓废,把File封裝好,來進(jìn)行選擇儿子。
總結(jié): 整體到部分的組合模式瓦哎。
5.組合模式的優(yōu)點(diǎn)
1.高層模塊調(diào)用簡單,只需要調(diào)用高層的api柔逼,而不需要訪問所有組成部分
2.節(jié)點(diǎn)自由增加(剛才兩個(gè)子類蒋譬,可以更多)
缺點(diǎn):控制樹枝構(gòu)建的類型就不太容易了,定義好類型之后愉适,想改變的話不好整犯助,繼承方法增加新的方法比較麻煩
2.組合模式在android中的實(shí)際運(yùn)用
1.Android中View的結(jié)構(gòu)是樹形結(jié)構(gòu)的
ViewGroup
11_1-11-7[01_45_32][20180802-202841-4].jpg
11-8_11章結(jié)束[00_00_31][20180802-205510-5].jpg
11-8_11章結(jié)束[00_01_15][20180802-205604-6].jpg
11-8_11章結(jié)束[00_02_42][20180802-205617-7].jpg
11-8_11章結(jié)束[00_03_07][20180802-205623-8].jpg