在學習關於JSF組件時涉及到了composite模式
二 自己整理的一些資料(見參考資料)
posite模式意在組成任意復雜度的整體
樹形結構中有葉子結點和非葉子結點(根結點是特例)
用戶界面通常由兩種基本類型的組件構造
但是在與復雜的組件層次結構打交道時
a
b
示例
基類shape 類有兩個派生類Circle和Square(相當於葉子結點或者是單個組件)
對於系統而言
程序
Shape
Public interface Shape {
Public void draw();
}
CompositeShape
[code]Public class CompositeShape implements Shape {
private Vector Comshape = new Vector();
public void add(Shape shape) {
Comshape
}
Public void draw() {
for( int i =
Shape shape = (Shape) comshape
Shape
}
}
}
示例
抽象類Equipment就是Component定義
package com
public abstract class Equipment {
private String name;
private double netPrice;
private double discountPrice;
public Equipment(String name) {
this
}
public abstract double netPrice();
public abstract double discountPrice();
}
Disk
package implEquip;
import com
public class Disk extends Equipment {
public Disk(String name) {
super(name);
// TODO Auto
}
//定義Disk實價為
public double netPrice() {
return
}
//定義了disk折扣價格是
public double discountPrice() {
return
}
}
CompsiteEquipment
package implEquip;
import java
import java
import java
import java
import com
public class CompositeEquipment extends Equipment {
private int i=
// 定義一個Vector 用來存放
private List equipment = new ArrayList();
public CompositeEquipment(String name) {
super(name);
// TODO Auto
}
public boolean add(Equipment equipment) {
this
return true;
}
public double netPrice() {
double netPrice=
Iterator iter=erator();
while(iter
netPrice+=((Equipment)iter
return netPrice;
}
public double discountPrice() {
double discountPrice=
Iterator iter=erator();
while(iter
discountPrice+=((Equipment)iter
return discountPrice;
}
// 注意這裡
// 上面dIsk 之所以沒有
public Iterator iter() {
return erator() ;
}
// 重載Iterator方法
public boolean hasNext() { return i<equipment
// 重載Iterator方法
public Object next(){
if(hasNext())
return equipment
else
throw new NoSuchElementException();
}
}
上面CompositeEquipment繼承了Equipment
我們再看看CompositeEquipment的兩個具體類:盤盒Chassis和箱子Cabinet
Cabinet
package implEquip;
public class Cabinet extends CompositeEquipment {
public Cabinet(String name) {
super(name);
// TODO Auto
}
public double netPrice() {
return
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 }
public double discountPrice() {
return .5+super.discountPrice();
}
}
至此我們完成了整個Composite模式的架構。tW.WIngwiT.cOM我們可以看看客戶端調用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="+Price());
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(組合) 板橋裡人 ;2002/04/27
網址:
2 《Mastering JavaServer Faces》中文版 (第一章 1.4)
3 《敏捷軟件開發:原則、模式與實踐》
4.《JSF實戰》
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27549.html