﻿<?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>C++博客-Magic World-随笔分类-java</title><link>http://www.cppblog.com/Magic1224/category/6268.html</link><description>                                           Programing is fun</description><language>zh-cn</language><lastBuildDate>Tue, 16 Feb 2016 15:53:44 GMT</lastBuildDate><pubDate>Tue, 16 Feb 2016 15:53:44 GMT</pubDate><ttl>60</ttl><item><title>【转】设计模式-组合模式（Composite Pattern）</title><link>http://www.cppblog.com/Magic1224/archive/2016/02/14/212813.html</link><dc:creator>Magic</dc:creator><author>Magic</author><pubDate>Sun, 14 Feb 2016 06:36:00 GMT</pubDate><guid>http://www.cppblog.com/Magic1224/archive/2016/02/14/212813.html</guid><wfw:comment>http://www.cppblog.com/Magic1224/comments/212813.html</wfw:comment><comments>http://www.cppblog.com/Magic1224/archive/2016/02/14/212813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Magic1224/comments/commentRss/212813.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Magic1224/services/trackbacks/212813.html</trackback:ping><description><![CDATA[<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;"><strong style="margin: 0px; padding: 0px;">&nbsp; 1.概述</strong></p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="margin: 0px; padding: 0px; font-size: 10pt; line-height: 20px; font-family: 宋体;">组合模式有时候又叫做部分</span><span style="margin: 0px; padding: 0px; font-size: 10pt; line-height: 20px;">-</span><span style="margin: 0px; padding: 0px; font-size: 10pt; line-height: 20px; font-family: 宋体;">整体模式，它使我们树型结构的问题中，模糊了简单元素和复杂元素的概念，客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。</span></p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-size: 10pt; line-height: 20px;">&nbsp;&nbsp;&nbsp;<strong style="margin: 0px; padding: 0px;">&nbsp;&nbsp;组合模式（Composite Pattern）：将对象组合成树形结构以表示&#8216;部分-整体&#8217;的层次结构，组合模式使得用户对单个对象和组合对象的使用具有一致性。</strong></span></p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;"><span style="margin: 0px; padding: 0px; font-size: 10pt; line-height: 20px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;组合模式结构图如下：</span></p>
<p style="margin-top: 10px; margin-bottom: 10px; margin-left: 40px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;"></p>
<div align="center" style="margin: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;"><img height="353" alt="" src="http://images.cnblogs.com/cnblogs_com/peida/Composite/Composite.jpg" width="578" border="0" style="margin: 0px; padding: 0px; border: 0px; max-width: 1000px;" /></div>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;结构图说明：</p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（1）Component：组合中的对象声明接口，在适当情况下实现所有类共有的默认行为，声明一个接口用于访问和管理Component的子组件。在递归结构中定义一个接口，用于访问一个父部件，并在合适的情况下实现它。（可选）</p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（2）Leaf:在组合中表示叶节点，叶节点没有子节点，定义对象的基本行为。</p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（3）Composite：定义有子部件的那些部件的行为，存储子部件并在Component接口实现与子部件有关的操作。</p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（4）Client:通过Component接口操作组合部件的对象。</p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;组合模式基本代码：</p><div style="margin: 5px 0px 5px 40px; font-size: 12px !important;">
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">abstract</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Component<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;string&nbsp;name;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Component(string&nbsp;name)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.name&nbsp;=&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">abstract</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Add(Component&nbsp;c);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">abstract</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Remove(Component&nbsp;c);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">abstract</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Display(<span style="color: #0000FF; ">int</span>&nbsp;depth);<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div>
</div>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Composite:</p><div style="margin: 5px 0px 5px 40px; font-size: 12px !important;">
<span style="margin: 0px; padding: 0px; line-height: 1.5 !important;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Composite&nbsp;:&nbsp;Component<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;List&lt;Component&gt;&nbsp;children&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;List&lt;Component&gt;();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Composite(string&nbsp;name)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;base(name)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;override&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Add(Component&nbsp;c)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children.Add(c);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;override&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Remove(Component&nbsp;c)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children.Remove(c);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;override&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Display(<span style="color: #0000FF; ">int</span>&nbsp;depth)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(<span style="color: #0000FF; ">new</span>&nbsp;String('-',&nbsp;depth)&nbsp;+&nbsp;name);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(Component&nbsp;component&nbsp;in&nbsp;children)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;component.Display(depth&nbsp;+&nbsp;2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div></span>
</div>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Leaf:</p>
<div style="margin: 5px 0px 5px 40px; font-size: 12px !important;">
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Leaf&nbsp;:&nbsp;Component<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Leaf(string&nbsp;name)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;base(name)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;override&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Add(Component&nbsp;c)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("Cannot&nbsp;add&nbsp;to&nbsp;a&nbsp;leaf");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;override&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Remove(Component&nbsp;c)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("Cannot&nbsp;remove&nbsp;from&nbsp;a&nbsp;leaf");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;override&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Display(<span style="color: #0000FF; ">int</span>&nbsp;depth)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(<span style="color: #0000FF; ">new</span>&nbsp;String('-',&nbsp;depth)&nbsp;+&nbsp;name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><div style="margin: 5px 0px 0px;"><span style="color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">客户端：</span></div></div><div style="margin: 5px 0px 5px 40px; font-size: 12px !important;">
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Program<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Main(string[]&nbsp;args)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Composite&nbsp;root&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Composite("root");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.Add(<span style="color: #0000FF; ">new</span>&nbsp;Leaf("Leaf&nbsp;A"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.Add(<span style="color: #0000FF; ">new</span>&nbsp;Leaf("Leaf&nbsp;B"));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Composite&nbsp;comp&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Composite("Composite&nbsp;X");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comp.Add(<span style="color: #0000FF; ">new</span>&nbsp;Leaf("Leaf&nbsp;XA"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comp.Add(<span style="color: #0000FF; ">new</span>&nbsp;Leaf("Leaf&nbsp;XB"));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.Add(comp);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Composite&nbsp;comp2&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Composite("Composite&nbsp;XY");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comp2.Add(<span style="color: #0000FF; ">new</span>&nbsp;Leaf("Leaf&nbsp;XYA"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comp2.Add(<span style="color: #0000FF; ">new</span>&nbsp;Leaf("Leaf&nbsp;XYB"));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comp.Add(comp2);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.Add(<span style="color: #0000FF; ">new</span>&nbsp;Leaf("Leaf&nbsp;C"));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Leaf&nbsp;leaf&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Leaf("Leaf&nbsp;D");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.Add(leaf);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.Remove(leaf);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.Display(1);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Read();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div>
</div>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以看出，Composite类型的对象可以包含其它Component类型的对象。换而言之，Composite类型对象可以含有其它的树枝（Composite）类型或树叶（Leaf）类型的对象。</p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;组合模式的实现根据所实现接口的区别分为两种形式，分别称为安全模式和透明模式。组合模式可以不提供父对象的管理方法，但组合模式必须在合适的地方提供子对象的管理方法（诸如：add、remove等）。安全式的组合模式要求管理聚集的方法只出现在树枝构件类中，而不出现在树叶构件中。与安全式的组合模式不同的是，透明式的组合模式要求所有的具体构件类，不论树枝构件还是树叶构件，均符合一个固定的接口。</p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;<strong style="margin: 0px; padding: 0px;">&nbsp;透明模式：</strong>也就是说在Component中声明所有用来管理子对象的方法，其中包括Add、Remove等。这样实现Component接口的所有子类都具备了Add和Remove。这样做的好处就是叶节点和枝节点对于外界没有区别，它们具有完全一致的行为接口，但问题也很明显，因为Leaf类本身不具备Add(),Remove()方法的功能，所以实现他是没有意义的。</p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong style="margin: 0px; padding: 0px;">安全模式：</strong>就是在Component接口中不去声明Add和Remove方法，那么子类的Leaf也就不需要去实现它，而是在Composite声明所有用来管理子类对象的方法，这样就不会出现透明模式出现的问题，不过由于不够透明，所以叶节点和枝节点将不具有相同的接口，客户端调用需要做相应的判断，带来了不便。</p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong style="margin: 0px; padding: 0px;">2.实例（大话设计模式）</strong></p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大话设计模式中的公司管理系统的结构图如下：</p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;"></p>
<div align="center" style="margin: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;"><img height="235" alt="" src="http://images.cnblogs.com/cnblogs_com/peida/Composite/Commpany.jpg" width="581" border="0" style="margin: 0px; padding: 0px; border: 0px; max-width: 1000px;" /></div>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;具体实现代码如下：</p>
<div style="margin: 5px 0px 5px 40px; font-size: 12px !important;"><img id="Code_Closed_Image_072707" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" style="margin: 0px; padding: 0px; border: 0px; max-width: 1000px;" alt="" /><span id="Code_Closed_Text_072707" style="margin: 0px; border-color: gray; line-height: 1.5 !important;">CompanyComposite<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">abstract</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Company<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;string&nbsp;name;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Company(string&nbsp;name)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.name&nbsp;=&nbsp;name;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">abstract</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Add(Company&nbsp;c);<span style="color: #008000; ">//</span><span style="color: #008000; ">增加</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">abstract</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Remove(Company&nbsp;c);<span style="color: #008000; ">//</span><span style="color: #008000; ">移除</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">abstract</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Display(<span style="color: #0000FF; ">int</span>&nbsp;depth);<span style="color: #008000; ">//</span><span style="color: #008000; ">显示</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">abstract</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;LineOfDuty();<span style="color: #008000; ">//</span><span style="color: #008000; ">履行职责</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ConcreteCompany&nbsp;:&nbsp;Company<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;List&lt;Company&gt;&nbsp;children&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;List&lt;Company&gt;();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ConcreteCompany(string&nbsp;name)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;base(name)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;override&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Add(Company&nbsp;c)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children.Add(c);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;override&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Remove(Company&nbsp;c)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;children.Remove(c);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;override&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Display(<span style="color: #0000FF; ">int</span>&nbsp;depth)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(<span style="color: #0000FF; ">new</span>&nbsp;String('-',&nbsp;depth)&nbsp;+&nbsp;name);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(Company&nbsp;component&nbsp;in&nbsp;children)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;component.Display(depth&nbsp;+&nbsp;2);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">履行职责</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;override&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;LineOfDuty()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(Company&nbsp;component&nbsp;in&nbsp;children)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;component.LineOfDuty();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">人力资源部</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;HRDepartment&nbsp;:&nbsp;Company<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;HRDepartment(string&nbsp;name)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;base(name)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;override&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Add(Company&nbsp;c)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;override&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Remove(Company&nbsp;c)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;override&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Display(<span style="color: #0000FF; ">int</span>&nbsp;depth)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(<span style="color: #0000FF; ">new</span>&nbsp;String('-',&nbsp;depth)&nbsp;+&nbsp;name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;override&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;LineOfDuty()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("{0}&nbsp;员工招聘培训管理",&nbsp;name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">财务部</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;FinanceDepartment&nbsp;:&nbsp;Company<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;FinanceDepartment(string&nbsp;name)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;base(name)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;override&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Add(Company&nbsp;c)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;override&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Remove(Company&nbsp;c)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;override&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Display(<span style="color: #0000FF; ">int</span>&nbsp;depth)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(<span style="color: #0000FF; ">new</span>&nbsp;String('-',&nbsp;depth)&nbsp;+&nbsp;name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;override&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;LineOfDuty()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("{0}&nbsp;公司财务收支管理",&nbsp;name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}</div></span></div>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;客户端代码：</p>
<div style="margin: 5px 0px 5px 40px; font-size: 12px !important;"><img id="Code_Closed_Image_072807" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" style="margin: 0px; padding: 0px; border: 0px; max-width: 1000px;" alt="" /><span id="Code_Closed_Text_072807" style="margin: 0px; border-color: gray; line-height: 1.5 !important;">Code<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Program<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Main(string[]&nbsp;args)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConcreteCompany&nbsp;root&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConcreteCompany("北京总公司");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.Add(<span style="color: #0000FF; ">new</span>&nbsp;HRDepartment("总公司人力资源部"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.Add(<span style="color: #0000FF; ">new</span>&nbsp;FinanceDepartment("总公司财务部"));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConcreteCompany&nbsp;comp&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConcreteCompany("上海华东分公司");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comp.Add(<span style="color: #0000FF; ">new</span>&nbsp;HRDepartment("华东分公司人力资源部"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comp.Add(<span style="color: #0000FF; ">new</span>&nbsp;FinanceDepartment("华东分公司财务部"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.Add(comp);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConcreteCompany&nbsp;comp1&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConcreteCompany("南京办事处");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comp1.Add(<span style="color: #0000FF; ">new</span>&nbsp;HRDepartment("南京办事处人力资源部"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comp1.Add(<span style="color: #0000FF; ">new</span>&nbsp;FinanceDepartment("南京办事处财务部"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comp.Add(comp1);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConcreteCompany&nbsp;comp2&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ConcreteCompany("杭州办事处");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comp2.Add(<span style="color: #0000FF; ">new</span>&nbsp;HRDepartment("杭州办事处人力资源部"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comp2.Add(<span style="color: #0000FF; ">new</span>&nbsp;FinanceDepartment("杭州办事处财务部"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comp.Add(comp2);<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("\n结构图：");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.Display(1);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("\n职责：");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root.LineOfDuty();<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Read();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div></span></div>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在.NET中，一个典型的组合模式实例就是.NET的控件，如Button，TextBox和Label等，这些控件都是继承自Control类，该类自身包含ControlCollection的集合Controls，控件和子控件的逻辑关系如下图：</p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;</p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;"></p>
<div align="center" style="margin: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;"><img height="199" alt="" src="http://images.cnblogs.com/cnblogs_com/peida/Composite/Control.jpg" width="301" border="0" style="margin: 0px; padding: 0px; border: 0px; max-width: 1000px;" /></div>
<span style="color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong style="margin: 0px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">3.总结</strong>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;"></p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong style="margin: 0px; padding: 0px;">何时采用组合模式：</strong></p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.需求重要体现部分与整体的层次结构时</p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.你希望用户忽略组合对象与单个对象的不同，用户将统一地使用组合结构中的所有对象。</p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;<strong style="margin: 0px; padding: 0px;">&nbsp;使用效果：</strong></p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1．Composite模式采用树形结构来实现普遍存在的对象容器，从而将&#8220;一对多&#8221;的关系转化&#8220;一对一&#8221;的关系，使得客户代码可以一致地处理对象和对象容器，无需关心处理的是单个的对象，还是组合的对象容器。<br style="margin: 0px; padding: 0px;" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2．将&#8220;客户代码与复杂的对象容器结构&#8221;解耦是Composite模式的核心思想，解耦之后，客户代码将与纯粹的抽象接口&#8212;&#8212;而非对象容器的复内部实现结构&#8212;&#8212;发生依赖关系，从而更能&#8220;应对变化&#8221;。<br style="margin: 0px; padding: 0px;" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3．Composite模式中，是将&#8220;Add和Remove等和对象容器相关的方法&#8221;定义在&#8220;表示抽象对象的Component类&#8221;中，还是将其定义在&#8220;表示对象容器的Composite类&#8221;中，是一个关乎&#8220;透明性&#8221;和&#8220;安全性&#8221;的两难问题，需要仔细权衡。这里有可能违背面向对象的&#8220;单一职责原则&#8221;，但是对于这种特殊结构，这又是必须付出的代价。ASP.NET控件的实现在这方面为我们提供了一个很好的示范。<br style="margin: 0px; padding: 0px;" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4．Composite模式在具体实现中，可以让父对象中的子对象反向追溯；如果父对象有频繁的遍历需求，可使用缓存技巧来改善效率。<br style="margin: 0px; padding: 0px;" />
</p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;参考资料：</p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大化设计模式</p>
<p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://terrylee.cnblogs.com/archive/2006/03/11/347919.html" style="margin: 0px; padding: 0px; text-decoration: none; color: #000000; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #333333;">http://terrylee.cnblogs.com/archive/2006/03/11/347919.html<br /><br />原帖地址：<br /></a></p><div>http://www.cnblogs.com/peida/archive/2008/09/09/1284686.html</div><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; color: #333333; font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 13.3333px; line-height: 24px; background-color: #ffffff;"><a href="http://terrylee.cnblogs.com/archive/2006/03/11/347919.html" style="margin: 0px; padding: 0px; text-decoration: none; color: #000000; border-bottom-width: 1px; border-bottom-style: dotted; border-bottom-color: #333333;"><br /></a></p><img src ="http://www.cppblog.com/Magic1224/aggbug/212813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Magic1224/" target="_blank">Magic</a> 2016-02-14 14:36 <a href="http://www.cppblog.com/Magic1224/archive/2016/02/14/212813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Java的内存泄漏</title><link>http://www.cppblog.com/Magic1224/archive/2008/03/03/43603.html</link><dc:creator>Magic</dc:creator><author>Magic</author><pubDate>Mon, 03 Mar 2008 07:25:00 GMT</pubDate><guid>http://www.cppblog.com/Magic1224/archive/2008/03/03/43603.html</guid><wfw:comment>http://www.cppblog.com/Magic1224/comments/43603.html</wfw:comment><comments>http://www.cppblog.com/Magic1224/archive/2008/03/03/43603.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Magic1224/comments/commentRss/43603.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Magic1224/services/trackbacks/43603.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Java 的一个重要优点就是通过垃圾收集器(Garbage Collection，GC)自动管理内存的回收，程序员不需要通过调用函数来释放内存。因此，很多程序员认为Java不存在内存泄漏问题，或者认为即使有内存泄漏也不是程序的责任，而是GC或JVM的问题。其实，这种想法是不正确的，因为Java也存在内存泄露，但它的表现与C++不同。&nbsp;&nbsp;<a href='http://www.cppblog.com/Magic1224/archive/2008/03/03/43603.html'>阅读全文</a><img src ="http://www.cppblog.com/Magic1224/aggbug/43603.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Magic1224/" target="_blank">Magic</a> 2008-03-03 15:25 <a href="http://www.cppblog.com/Magic1224/archive/2008/03/03/43603.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]C++与Java比较</title><link>http://www.cppblog.com/Magic1224/archive/2008/02/27/43319.html</link><dc:creator>Magic</dc:creator><author>Magic</author><pubDate>Wed, 27 Feb 2008 01:35:00 GMT</pubDate><guid>http://www.cppblog.com/Magic1224/archive/2008/02/27/43319.html</guid><wfw:comment>http://www.cppblog.com/Magic1224/comments/43319.html</wfw:comment><comments>http://www.cppblog.com/Magic1224/archive/2008/02/27/43319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Magic1224/comments/commentRss/43319.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Magic1224/services/trackbacks/43319.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: “作为一名C++程序员，我们早已掌握了面向对象程序设计的基本概念，而且Java的语法无疑是非常熟悉的。事实上，Java本来就是从C++衍生出来的。”<br>　　然而，C++和Java之间仍存在一些显著的差异。可以这样说，这些差异代表着技术的极大进步。一旦我们弄清楚了这些差异，就会理解为什么说Java是一种优秀的程序设计语言。本附录将引导大家认识用于区分Java和C++的一些重要特征。&nbsp;&nbsp;<a href='http://www.cppblog.com/Magic1224/archive/2008/02/27/43319.html'>阅读全文</a><img src ="http://www.cppblog.com/Magic1224/aggbug/43319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Magic1224/" target="_blank">Magic</a> 2008-02-27 09:35 <a href="http://www.cppblog.com/Magic1224/archive/2008/02/27/43319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>