国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Composite模式及其在JSF中的應用

2019-11-17 04:38:20
字體:
來源:轉載
供稿:網友
一 學習背景

   在學習關于JSF組件時涉及到了composite模式,于是就查看一些資料,以下是自己對這種模式的理解。

二  自己整理的一些資料(見參考資料)

1.composite模式意在組成任意復雜度的整體--部分組件層次結構,同時將單個組件或復合組件視為統一的接口。樹形組織結構就是其中一種表現形式。

樹形結構中有葉子結點和非葉子結點(根結點是特例),非葉子結點可以添加,刪除(add(),delete())子結點,獲取子結點(getChild()),葉子結點沒有;此外樹結構的所有節點還有共同的操作(Operator()).
用戶界面通常由兩種基本類型的組件構造:基本組件和容器組件,容器組件可以在其內部嵌套任意數目的組件,而基本組件則不行。使用這兩種組件類型,開發者可以建立更強大的組件,進而創建多姿多彩的用戶界面。
但是在與復雜的組件層次結構打交道時,必須在容器組件和基本組件之間進行區分,比較麻煩,composite提供了一種解決方案。適用它的情況:
a. 要表現“部分-整體”的層次結構時
b. 希望在事件組件層次中,同等對待復合組件與單個組件。

2. 通過下面的示例來理解
示例1: 
基類shape 類有兩個派生類Circle和Square(相當于葉子結點或者是單個組件),第三個派生類CompositeShape是個組合體(相當于非葉子結點或者是容器組件),它持有一個含有多個shape實例的列表,當調用CompositeShape中的draw()時,它就把這個方法委托給列表中的每一個實例。
 
對于系統而言,一個CompositeShape實例就像是一個獨立的shape,可以把它傳給使用shape的方法或者對象。實際上,它只是一組shape實例的PRoxy.
程序:
  1. Shape.java:
  2. Public interface Shape {
  3.     Public void draw();
  4. }
  5. CompositeShape.java:
  6. [code]Public class CompositeShape implements Shape {
  7.   private Vector Comshape = new Vector();
  8.   public void add(Shape shape) {
  9.     Comshape.add(shape);
  10.   }
  11.   Public void draw() {
  12.     for( int i = 0; i < comshape.size(); i ++ ) {
  13.        Shape shape = (Shape) comshape.elementAt(i);
  14.        Shape.draw();
  15.     }
  16.   }
  17. }

示例2: 
抽象類Equipment就是Component定義,代表著組合體類的對象們,Equipment中定義幾個共同的方法。
  1. package com.interf;
  2. public abstract class Equipment {
  3.     private String name;
  4.     private double netPrice;
  5.     private double discountPrice;
  6.     
  7.     public Equipment(String name) {
  8.         this.name = name;
  9.     }
  10.     public abstract double netPrice();
  11.     public abstract double discountPrice();
  12. }
Disk是組合體內的一個對象,或稱一個部件,這個部件是個單獨元素( Primitive)。
Disk.java:
  1. package implEquip;
  2. import com.interf.Equipment;
  3. public class Disk extends Equipment {
  4.     public Disk(String name) {
  5.         super(name);
  6.         // TODO Auto-generated constrUCtor stub
  7.     }
  8.     
  9.     //定義Disk實價為1
  10.     public double netPrice() {
  11.         return 1.; 
  12.     }
  13.     //定義了disk折扣價格是0.5 對折。
  14.     public double discountPrice() { 
  15.         return .5; 
  16.     }    
  17. }
還有一種可能是,一個部件也是一個組合體,就是說這個部件下面還有'兒子',這是樹形結構中通常的情況,應該比較輕易理解。現在我們先要定義這個組合體:
CompsiteEquipment.java:
  1. package implEquip;
  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import java.util.NoSuchElementException;
  6. import com.interf.Equipment;
  7. public class CompositeEquipment extends Equipment {
  8.     
  9.     private int i=0; 
  10. //    定義一個Vector 用來存放'兒子'
  11.     private List equipment = new ArrayList();
  12.     
  13.     public CompositeEquipment(String name) {
  14.         super(name);
  15.         // TODO Auto-generated constructor stub
  16.     }
  17.     public boolean add(Equipment equipment) { 
  18.         this.equipment.add(equipment); 
  19.         return true; 
  20.     }
  21.     public double netPrice() {
  22.         double netPrice=0.;
  23.         Iterator iter=equipment.iterator();
  24.         while(iter.hasNext())
  25.           netPrice+=((Equipment)iter.next()).netPrice();
  26.         return netPrice;
  27.     }
  28.     public double discountPrice() {
  29.         double discountPrice=0.;
  30.         Iterator iter=equipment.iterator();
  31.         while(iter.hasNext())
  32.           discountPrice+=((Equipment)iter.next()).discountPrice();
  33.         return discountPrice;
  34.     }
  35. //    注重這里,這里就提供用于訪問自己組合體內的部件方法。
  36. //    上面dIsk 之所以沒有,是因為Disk是個單獨(Primitive)的元素.
  37.     public Iterator iter() {
  38.         return equipment.iterator() ;
  39.     }
  40. //    重載Iterator方法
  41.     public boolean hasNext() { return i<equipment.size(); }
  42. //    重載Iterator方法
  43.     public Object next(){
  44.     if(hasNext())
  45.         return equipment.get(i++);
  46.     else 
  47.         throw new NoSuchElementException();
  48.     }
  49. }


 進入討論組討論。
上面CompositeEquipment繼續了Equipment,同時為自己里面的對象們提供了外部訪問的方法,重載了Iterator,Iterator是Java的Collection的一個接口,是Iterator模式的實現.
我們再看看CompositeEquipment的兩個具體類:盤盒Chassis和箱子Cabinet,箱子里面可以放很多東西,如底板,電源盒,硬盤盒等;盤盒里面可以放一些小設備,如硬盤 軟驅等。無疑這兩個都是屬于組合體性質的。
  1. Cabinet.java:
  2. package implEquip;
  3. public class Cabinet extends CompositeEquipment {
  4.     public Cabinet(String name) {
  5.         super(name);
  6.         // TODO Auto-generated constructor stub
  7.     }    
  8.     public double netPrice() { 
  9.         return 1.+super.netPrice(); 
  10.     }
  11.     public double discountPrice() { 
  12.         return .5+super.discountPrice();
  13.     }
  14. }


Chassi.java:
  1. package implEquip;
  2. public class Chassis extends CompositeEquipment {
  3.     public Chassis(String name) {
  4.         super(name);
  5.         // TODO Auto-generated constructor stub
  6.     }
  7.     public double netPrice() { 
  8.         return 1.+super.netPrice(); 
  9.     }
  10.     public double discountPrice() { 
  11.         return .5+super.discountPrice();
  12.     }
  13. }

至此我們完成了整個Composite模式的架構。我們可以看看客戶端調用Composote代碼:

CompositeTest.java:
  1. package test;
  2. import implEquip.Cabinet;
  3. import implEquip.Chassis;
  4. import implEquip.Disk;
  5. public class CompositeTest {
  6.     /**
  7.      * @param args
  8.      */
  9.     public static void main(String[] args) {
  10.         // TODO Auto-generated method stub
  11.         Cabinet cabinet=new Cabinet("Tower");
  12.         Chassis chassis=new Chassis("PC Chassis");
  13. //        將PC Chassis裝到Tower中 (將盤盒裝到箱子里)
  14.         cabinet.add(chassis);
  15. //        將一個10GB的硬盤裝到 PC Chassis (將硬盤裝到盤盒里)
  16.         chassis.add(new Disk("10 GB"));
  17. //        調用 netPrice()方法;
  18.         System.out.println("netPrice="+cabinet.netPrice());
  19.         System.out.println("discountPrice="+cabinet.discountPrice());
  20.     }
  21. }

上面調用的方法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實戰》進入討論組討論。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 杭锦后旗| 姚安县| 琼中| 德昌县| 隆林| 莱西市| 赫章县| 西乌| 云浮市| 斗六市| 浦东新区| 蕲春县| 义马市| 资中县| 泗水县| 辽宁省| 兰州市| 长白| 渑池县| 墨玉县| 波密县| 望城县| 利辛县| 泸西县| 上饶市| 日土县| 垣曲县| 周宁县| 梓潼县| 孟连| 多伦县| 山东省| 巴彦淖尔市| 公主岭市| 宜春市| 万年县| 乌什县| 嵊州市| 陵川县| 江门市| 玉田县|