Composite模式及其在JSF中的应用

文章作者 100test 发表时间 2007:03:26 18:01:55
来源 100Test.Com百考试题网


一 学习背景

在学习关于JSF组件时涉及到了composite模式,于是就查看一些资料,以下是自己对这种模式的理解。

二 自己整理的一些资料(见参考资料)

1.composite模式意在组成任意复杂度的整体--部分组件层次结构,同时将单个组件或复合组件视为统一的接口。树形组织结构就是其中一种表现形式。

树形结构中有叶子结点和非叶子结点(根结点是特例),非叶子结点可以添加,删除(add(),0delete())子结点,获取子结点(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. public Equipment(String name) {
  7. this.name = name.
  8. }
  9. public abstract double netPrice().
  10. public abstract double discountPrice().
  11. }
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. //定义Disk实价为1
  9. public double netPrice() {
  10. return 1..
  11. }
  12. //定义了disk折扣价格是0.5 对折。
  13. public double discountPrice() {
  14. return .5.
  15. }
  16. }
还有一种可能是,一个部件也是一个组合体,就是说这个部件下面还有儿子,这是树形结构中通常的情况,应该比较容易理解。现在我们先要定义这个组合体:
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. private int i=0.
  9. // 定义一个Vector 用来存放儿子
  10. private List equipment = new ArrayList().
  11. public CompositeEquipment(String name) {
  12. super(name).
  13. // TODO Auto-generated constructor stub
  14. }
  15. public boolean add(Equipment equipment) {
  16. this.equipment.add(equipment).
  17. return true.
  18. }
  19. public double netPrice() {
  20. double netPrice=0..
  21. Iterator iter=equipment.iterator().
  22. while(iter.hasNext())
  23. netPrice =((Equipment)iter.next()).netPrice().
  24. return netPrice.
  25. }
  26. public double discountPrice() {
  27. double discountPrice=0..
  28. Iterator iter=equipment.iterator().
  29. while(iter.hasNext())
  30. discountPrice =((Equipment)iter.next()).discountPrice().
  31. return discountPrice.
  32. }
  33. // 注意这里,这里就提供用于访问自己组合体内的部件方法。
  34. // 上面dIsk 之所以没有,是因为Disk是个单独(Primitive)的元素.
  35. public Iterator iter() {
  36. return equipment.iterator() .
  37. }
  38. // 重载Iterator方法
  39. public boolean hasNext() { return i// 重载Iterator方法
  40. public Object next(){
  41. if(hasNext())
  42. return equipment.get(i ).
  43. else
  44. throw new NoSuchElementException().
  45. }
  46. }


相关文章


JAVA中浅复制与深复制
在Struts2中实现文件上传
Composite模式及其在JSF中的应用
KVM的执行引擎--栈和帧、指令集
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛