科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Composite模式及其在JSF中的应用

Composite模式及其在JSF中的应用

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

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

作者:中国IT实验室 来源:中国IT实验室 2007年8月26日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

上面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实战》
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章