《设计模式》学习笔记--组合模式Composite

来源:互联网 发布:站长工具 网络测速 编辑:程序博客网 时间:2024/04/28 09:20

   

在总结这个模式的时候,发现很难找到一个系统低层的非常恰当的实例,能够完全表现出该模式的所有价值,所以这一节把主题作了一个改变。
 
1、核心意图:
    将对象组合成树形结构以表示部分-整体的层次结构,Composite模式使用户对单个对象和组合对象的使用具有一致性。
该模式的目标是抽象用户和组件之间的联系,使用户可以一致的使用各种类型的组件,包括原子组件和组合组件,从而避免在用户代码中插入很多的类型判断和分支语句,并且通过这种抽象,使得增加新类型的组件(包括原子组件和组合组件)非常方便。
 
2、实例讨论:
可能因为一直做Web型应用的缘故,很难找到一个自己使用过的、能够准确表现该模式完整效果的底层示例,后来为了找到一个这样的实例以便进行沟通和加深自己的理解,考虑到象Word这种文本处理工具是否采用了这种模式呢,比如以复制和粘贴为例,可以复制的组件包括元组件(如一个字符、一个表格、一个图片等等)和这些元组件的一个集合,这时就可以将这些组件构造成一个树形结构,以表示部分和整体的组件层次结构,如下结构图所示:
 
 
当我们拖动鼠标然后点击“复制”按钮后,如果我们选择的是一个字符就调用字符的复制操作,如果是一个表格/图片就调用表格/图片的复制操作,如果是一块包括文字和图片的组合就调用这个组合的复制操作,而不用加以类型的判断和分别处理,从而简化了复制用户的操作;并且通过这种结构的可扩展性,可以复制的对象类型可以很方便的进行新增和扩充,并且对复制用户没有影响。
(注:在这里通过Composite模式用树形结构实现,可能会带来层次结构很深的问题,因为本人并没有实际文本处理方面的经验,所以希望有这方面经验指点。)
 
3、动机简述:
在该模式的动机中,描述了图形对象的树形结构,包括抽象图形Graphic、图元Line/Text、和组合图形Picture,图元是最基本的图形,没有自元素;若干个图元对象可以组合成Picture组合图形,若干个组合图形还可以再组合成更大的Picture组合图形,依次递归;所有图形都可以进行绘制Draw操作,图元对象进行自己的Draw操作,组合图形调用所有所含图形的Draw操作,这样就使用户的使用具有一致性而更加简单和维护。
 
4、模式效果:
组合Composite模式有两个主要效果:
1)通过抽象用户和组件之间的联系,将组件表示成树形递归结构,使用户可以一致的使用各种类型的组件,包括原子组件和组合组件,从而避免在用户代码中插入很多的类型判断和分支语句;
2)通过这种组建类型抽象,使得增加新类型的组件(包括原子组件和组合组件)非常方便,无需对用户造成影响。
 
5、JSP代码示例:
JSP页面可以是简单的,所有内容都包含在自己的文件中;也可以是复杂的,通过组合其他页面内容来构造自己的内容,类结构图如下:
 
 
一个JSP组合页面实例如下:
组件结构图如下:
 
 
代码清单如下(topBanner.jsp、newPart.jsp等原子页面省略):
main.jsp,表示主页面
 
<%@ page contentType="text/html;charset=GBK"%>

<jsp:include page="/topBanner.jsp" />
<table width="780" cellpadding="0" cellspacing="0" border="0" align="center" bgcolor="#FFFFFF">
  
<tr>
    
<td width="30%" valign="top" align="center">
      
<jsp:include page="/menu.jsp" />
    
</td>
    
<td width="70%" valign="top" align="center">
      
<jsp:include page="/news.jsp" />
    
</td>
  
</tr>
</table>
<jsp:include page="/foot.jsp" />
 
news.jsp,表示新闻汇总页面
 
<%@ page contentType="text/html;charset=GBK"%>

<table width="100%" cellpadding="0" cellspacing="0" border="0" align="center">
  
<tr>
    
<td width="50%" align="center" bgcolor="#FFFFFF">
      
<jsp:include page="/newPart1.jsp" />
    
</td>
    
<td width="50%" align="center" bgcolor="#FFFFFF">
      
<jsp:include page="/newPart2.jsp" />
    
</td>
  
</tr>
  
<tr>
    
<td align="center" bgcolor="#FFFFFF">
      
<jsp:include page="/newPart3.jsp" />
    
</td>
    
<td align="center" bgcolor="#FFFFFF">
      
<jsp:include page="/newPart4.jsp" />
    
</td>
    
</td>
  
</tr>
</table>