﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-SkyWinder-随笔分类-设计模式</title><link>http://www.blogjava.net/SkyWinder/category/13913.html</link><description>Just try to find my memorize...</description><language>zh-cn</language><lastBuildDate>Thu, 30 Aug 2007 05:12:01 GMT</lastBuildDate><pubDate>Thu, 30 Aug 2007 05:12:01 GMT</pubDate><ttl>60</ttl><item><title>Composite组合模式</title><link>http://www.blogjava.net/SkyWinder/archive/2007/08/30/141191.html</link><dc:creator>枫中玎玲</dc:creator><author>枫中玎玲</author><pubDate>Thu, 30 Aug 2007 02:14:00 GMT</pubDate><guid>http://www.blogjava.net/SkyWinder/archive/2007/08/30/141191.html</guid><wfw:comment>http://www.blogjava.net/SkyWinder/comments/141191.html</wfw:comment><comments>http://www.blogjava.net/SkyWinder/archive/2007/08/30/141191.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/SkyWinder/comments/commentRss/141191.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/SkyWinder/services/trackbacks/141191.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;组合模式:将对象以树形结构组织起来,以达成&#8220;部分－整体&#8221; 的层次结构，使得客户端对单个对象和组合对象的使用具有一致性.<br>适用环境：
<p class=MsoNormal align=left><span lang=EN-US style="FONT-FAMILY: Wingdings">u<span Times New Roman?; font-style: font-variant: font-weight: font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;?>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>你想表示对象的部分<span lang=EN-US>-整体层次结构。</span></span></p>
<p class=MsoNormal align=left><span lang=EN-US style="FONT-FAMILY: Wingdings">u<span Times New Roman?; font-style: font-variant: font-weight: font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;?>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>你希望用户忽略组合对象与单个对象的不同，用户将统一地使用组合结构中的所有对象。<br><br>Composite好处:<br>1.使客户端调用简单，客户端可以一致的使用组合结构或其中单个对象，用户就不必关系自己处理的是单个对象还是整个组合结构，这就简化了客户端代码。<br>2.更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。<br><br></span></p>
<p class=MsoNormal><span style="FONT-FAMILY: 宋体">组合模式的组成</span></p>
<p class=MsoNormal><span lang=EN-US style="FONT-FAMILY: 'Comic Sans MS'"><span New Roman?; font-style: font-variant: font-weight: font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;? font-family: ?Times>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></strong></strong></span></span><span>抽象构件角色</span><span lang=EN-US Comic Sans MS?;?>Component</span><span>：它为组合中的对象声明接口，也可以为共有接口实现缺省行为。</span><span lang=EN-US Comic Sans MS?;?><o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style="FONT-FAMILY: 'Comic Sans MS'"><span New Roman?; font-style: font-variant: font-weight: font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;? font-family: ?Times>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></strong></span></span><span>树叶构件角色</span><span lang=EN-US Comic Sans MS?;?>Leaf</span><span>：在组合中表示叶节点对象</span><span lang=EN-US Comic Sans MS?;?>——</span><span>没有子节点，实现抽象构件角色声明的接口。</span><span lang=EN-US Comic Sans MS?;?><o:p></o:p></span></p>
<p class=MsoNormal><span lang=EN-US style="FONT-FAMILY: 'Comic Sans MS'"><span New Roman?; font-style: font-variant: font-weight: font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;? font-family: ?Times>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong></strong></span></span><span>树枝构件角色</span><span lang=EN-US Comic Sans MS?;?>Composite</span><span>：在组合中表示分支节点对象</span><span lang=EN-US Comic Sans MS?;?>——</span><span>有子节点，实现抽象构件角色声明的接口；存储子部件。</span><span lang=EN-US Comic Sans MS?;?><o:p></o:p></span></p>
<p class=MsoNormal><span style="FONT-FAMILY: 宋体">下图为组合模式的类图表示。<br><strong><img height=168 alt=comp1.bmp src="http://www.blogjava.net/images/blogjava_net/flying/comp1.bmp" width=322 border=0><br></strong><span lang=EN-US Comic Sans MS?;?><span font-family: 宋体;?>安全性与透明性<br></span></span></p>
<p class=MsoNormal><span style="FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp;组合模式中必须提供对子对象的管理方法，不然无法完成对子对象的添加删除等等操作，也就失去了灵活性和扩展性。但是管理方法是在</span><span lang=EN-US Comic Sans MS?;?>Component</span><span>中就声明还是在</span><span lang=EN-US Comic Sans MS?;?>Composite</span><span>中声明呢？</span><span lang=EN-US Comic Sans MS?;?><o:p></o:p></span></p>
<p class=MsoNormal><span style="FONT-FAMILY: 宋体">&nbsp;&nbsp;&nbsp;一种方式是在</span><span lang=EN-US Comic Sans MS?;?>Component</span><span>里面声明所有的用来管理子类对象的方法，以达到</span><span lang=EN-US Comic Sans MS?;?>Component</span><span>接口的最大化（如下图所示）。目的就是为了使客户看来在接口层次上树叶和分支没有区别</span><span lang=EN-US Comic Sans MS?;?>——</span><span>透明性。但树叶是不存在子类的，因此</span><span lang=EN-US Comic Sans MS?;?>Component</span><span>声明的一些方法对于树叶来说是不适用的。这样也就带来了一些安全性问题。</span><br>&nbsp;&nbsp; <span>另一种方式就是只在</span><span lang=EN-US Comic Sans MS?;?>Composite</span><span>里面声明所有的用来管理子类对象的方法（如下图所示）。这样就避免了上一种方式的安全性问题，但是由于叶子和分支有不同的接口，所以又失去了透明性。<br>&nbsp;&nbsp;《设计模式》一书认为：在这一模式中，相对于安全性，我们比较强调透明性。对于第一种方式中叶子节点内不需要的方法可以使用空处理或者异常报告的方式来解决。<br>如何使用Composite?</span></p>
</span>
<img src ="http://www.blogjava.net/SkyWinder/aggbug/141191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/SkyWinder/" target="_blank">枫中玎玲</a> 2007-08-30 10:14 <a href="http://www.blogjava.net/SkyWinder/archive/2007/08/30/141191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>