一 Composite模式
將對象組合成樹形結構以表示“部分——整體”的階層。
Composite使得使用者對單個對象操作和組合對象的操作使用具有一致性。
這裡面涉及到單個對象和組合對象的操作問題。
將單個對象和組合對象一致的對待能使:客戶代碼一致簡單,
使用更加靈活多變,便於擴充新的組合對象,便於對象的管理等。
統一對待單個對象和組合對象,勢必要提供一些組合對象需要而單個對象不需要的操作或者屬性等管理手段,
這些手段對與單個對象或許根本不存在或者不適用,這樣勢必存在著一定風險隱患,造成不安全因素的存在。
但是單個對象和組合對象必然存在一些不同的地方,要將單個對象與組合對象一致對待,
是在安全性與透明性中選擇了透明性。如果選擇安全性,那麼單個對象與組合對象是要進行區別對待。
進行怎麼樣的區別對待呢,這個不確定性很多但是可以確定是組合對象存在著如何對子物件進行管理。
下面學習一下Android中View類階層。
二 Android中View管理
Adnroid中用於顯示的控制項的基類是View,很多基本的控制項Widget如:
ImageView,TextView等都是直接從view派生下來;另一些支援組合的控制項都是ViewGroup派生下來。
控制項類層次關係如:
所以在Android中View的所使用組合模式中對於單個對象和組合對象是部分區別對待的:
單個對象都是從View派生下來或者再繼續派生;組合對象都是從ViewGroup派生下來才能接收單個對象。
但是這個區別僅限於單個對象還是組合對象,但終究仍然都是View。所以是部分區別對待的。
下面簡單學習一下ViewGroup對於其子物件的管理。
三 ViewGroup對於子物件的管理
ViewGroup是一個抽象類別,用來管理下一層的Views包括基本控制項和群組控制項——控制項的容器。
常見從ViewGroup繼承下來的有:五大布局分別是:FrameLayout(架構布局),LinearLayout (線性布局),
AbsoluteLayout(絕對布局),RelativeLayout(相對布局),TableLayout(表格版面配置).以及 ListView,GridView等等。
ViewGroup對子類的管理看似比較簡單,使用了一個數組來管理。
ViewGroup類中有一個成員:private View[] mChildren;用來儲存其上所有的子物件;
初始大小為12超過遺棄重新申請,這可能就是利用Java記憶體管理的方便吧,不用主動去負責ViewGroup的子物件的銷毀。
在View中有一個成員:protected ViewParent mParent; 為每一個View都指定了其唯一Parent。
至於這樣區別對待的優點:滿足模式中所提到的安全性,畢竟單個對象和組合對象還是有區別的,
組合對象的操作更加複雜,需要管理其子物件:顯示內容和焦時間點事件處理派發等,而單個對象顯然不需要具備這些,
若不加區分存在潛在使用上的安全隱患和單個對象不必要的複雜性;至於還有其他什麼原因上的考慮就不得知了,期待達人解答。