上面CompositeEquipment繼續了Equipment,同時為自己里面的對象們提供了外部訪問的方法,重載了Iterator,Iterator是Java的Collection的一個接口,是Iterator模式的實現.
![]()
我們再看看CompositeEquipment的兩個具體類:盤盒Chassis和箱子Cabinet,箱子里面可以放很多東西,如底板,電源盒,硬盤盒等;盤盒里面可以放一些小設備,如硬盤 軟驅等。無疑這兩個都是屬于組合體性質的。
- Cabinet.java:
- package implEquip;
- public class Cabinet extends CompositeEquipment {
- public Cabinet(String name) {
- super(name);
- // TODO Auto-generated constructor stub
- }
- public double netPrice() {
- return 1.+super.netPrice();
- }
- public double discountPrice() {
- return .5+super.discountPrice();
- }
- }
Chassi.java:
- package implEquip;
- public class Chassis extends CompositeEquipment {
- public Chassis(String name) {
- super(name);
- // TODO Auto-generated constructor stub
- }
- public double netPrice() {
- return 1.+super.netPrice();
- }
- public double discountPrice() {
- return .5+super.discountPrice();
- }
- }
至此我們完成了整個Composite模式的架構。我們可以看看客戶端調用Composote代碼:
CompositeTest.java:
- package test;
- import implEquip.Cabinet;
- import implEquip.Chassis;
- import implEquip.Disk;
- public class CompositeTest {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Cabinet cabinet=new Cabinet("Tower");
- Chassis chassis=new Chassis("PC Chassis");
- // 將PC Chassis裝到Tower中 (將盤盒裝到箱子里)
- cabinet.add(chassis);
- // 將一個10GB的硬盤裝到 PC Chassis (將硬盤裝到盤盒里)
- chassis.add(new Disk("10 GB"));
- // 調用 netPrice()方法;
- System.out.println("netPrice="+cabinet.netPrice());
- System.out.println("discountPrice="+cabinet.discountPrice());
- }
- }
上面調用的方法netPrice()或discountPrice(),實際上Composite使用Iterator遍歷了整個樹形結構,尋找同樣包含這個方法的對象并實現調用執行.
控制臺輸出:
netPrice=3.0
discountPrice=1.5
三.JSF組件提供的實現非常接近Composite模式給出的一般性解決方案,不過(和Swing不同)這里的頂層和一般組件之間沒有明顯差異。
JSF提供了一個所有組件都要實現的UIComponent接口,UIComponentBase類為了方便組件開發者,定義了默認的行為。JSF有許多基本組件如UIForm和UIInput。另外可以創建自己的自定義組件。創建自定義組件時,必須要實現UIComponent接口或者繼續UIComponentBase類
JSF為使用默認組件提供了方便的標記庫。當頁面被應用的用戶提交時,FacesServlet 將根據這些標記所提供和搜集的信息實際建立一個組件樹(本人想法:具體建樹過程以及治理被封裝起來了,在治理和使用UI組件的原理應該同composite模式一致;實際是什么???能找到實現的代碼最好了)
第一層:form
第二層:label,outputtext,panel
第三層:command1 command2
UI組件是在服務器的視圖或者組件樹中進行治理,組件可以直接關系到JavaBean屬性的值(任何遵循了JavaBean命名約定的Java對象都可以為JSF組件命使用),在客戶端表現為Html語言(或者其他顯示語言)。JavaBean用來收集用戶輸入的數據,并在需要時重新封閉到頁面中。
四.參考資料: 1 設計模式之Composite(組合) 板橋里人 http://www.jdon.com 2002/04/27
網址:http://www.jdon.com/designpatterns/composite.htm
2 《Mastering JavaServer Faces》中文版 (第一章 1.4)
3 《靈敏軟件開發:原則、模式與實踐》
4.《JSF實戰》進入討論組討論。