﻿<?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-Youngsun's Java World</title><link>http://www.blogjava.net/youngsun/</link><description>徘徊于牛A和牛C之间</description><language>zh-cn</language><lastBuildDate>Sun, 21 Jun 2026 18:53:34 GMT</lastBuildDate><pubDate>Sun, 21 Jun 2026 18:53:34 GMT</pubDate><ttl>60</ttl><item><title>登陆成功后跳转到之前的页面</title><link>http://www.blogjava.net/youngsun/articles/225642.html</link><dc:creator>Hiro</dc:creator><author>Hiro</author><pubDate>Fri, 29 Aug 2008 10:57:00 GMT</pubDate><guid>http://www.blogjava.net/youngsun/articles/225642.html</guid><wfw:comment>http://www.blogjava.net/youngsun/comments/225642.html</wfw:comment><comments>http://www.blogjava.net/youngsun/articles/225642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youngsun/comments/commentRss/225642.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youngsun/services/trackbacks/225642.html</trackback:ping><description><![CDATA[假设 你现在没登陆的情况下访问A页面，提示你没登陆。并且把你重定向到B登陆页面，在你登陆成功后你想返回到A页面。你的意思是这样吧？ <br />
<br />
思路：在B登陆页面做处理.记录下进到B页面的父页面.就是从哪里来到B页面的地址。ComeUrl=lcase(trim(request.ServerVariables("HTTP_REFERER"))) <br />
这样就保存了进B页面的上个页面的地址了。然后登陆成功后让他返回 <br />
response.redirect ComeUrl<br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br />
&lt;c:if test="${UserLogin.isLogin}"&gt; //UserLogin.isLogin()返回true <br />
&lt;c:redirect url="&lt;%=request.getHeader("Referer")%&gt;"/&gt; <br />
&lt;/c:if&gt; <br />
<img src ="http://www.blogjava.net/youngsun/aggbug/225642.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youngsun/" target="_blank">Hiro</a> 2008-08-29 18:57 <a href="http://www.blogjava.net/youngsun/articles/225642.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用数据库连接池</title><link>http://www.blogjava.net/youngsun/articles/225443.html</link><dc:creator>Hiro</dc:creator><author>Hiro</author><pubDate>Thu, 28 Aug 2008 15:50:00 GMT</pubDate><guid>http://www.blogjava.net/youngsun/articles/225443.html</guid><wfw:comment>http://www.blogjava.net/youngsun/comments/225443.html</wfw:comment><comments>http://www.blogjava.net/youngsun/articles/225443.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youngsun/comments/commentRss/225443.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youngsun/services/trackbacks/225443.html</trackback:ping><description><![CDATA[<strong>
<p><strong>使用数据库连接池</strong></p>
<p>如果不能从JNDI获取数据源，那么下一个选择应该是在Spring里直接配置一个数据源池。虽然Spring没有提供一个数据源池，但Jakarta Commons Database Connection Pools（DBCP）项目（<a href="http://jakarta.apache.org/commons/dbcp">http://jakarta.apache.org/commons/dbcp</a>）提供了一个。为了把DBCP添加到程序，我们可以下载它并把JAR文件放到Ant的生成类路径里，或是把如下&lt;dependency&gt;添加到Maven 2 Project Object Model（POM）：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">dependency</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">groupId</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">commons-dbcp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">groupId</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">artifactId</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">commons-dbcp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">artifactId</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">version</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">1.2.1</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">version</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">dependency</span><span style="color: #0000ff">&gt;</span></div>
<p>&nbsp;</p>
<p>DBCP包含多个提供池功能的数据源，BasicDataSource是最常用的一个，因为在Spring里配置它很容易，而且它类似于Spring自己的DriveManagerDataSource（稍后会有所介绍）。</p>
<p>对于RaodRantz程序，我们会像下面这样配置BasicDataSource Bean：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="dataSource" </span><span style="color: #ff0000">class</span><span style="color: #0000ff">="org.apache.commons.dbcp.BasicDataSource"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="driverClassName" </span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="com.mysql.jdbc.Driver"</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="url"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="jdbc:mysql://localhost:3306/bank"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="username"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="root"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="password"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="123456"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="initialSize"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="5"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="maxActive"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="10"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span></div>
<p>前4个属性是配置BasicDataSource所必需的。driverClassName属性指定JDBC驱动类的完整修饰名称，在此我们把它配置为Hypersonic数据库的JDBC驱动。url属性用于设置数据库的完整JDBC URL。最后，username和password属性用于在连接到数据库时进行身份验证。</p>
<p>这4个基本属性定义了BasicDataSource的连接信息。另外，我们还可以使用其他一些属性来配置数据源池，表5.4列出了BasicDataSource中最有用的一些池配置属性。</p>
<p>表5.4&nbsp;BasicDataSource的池配置属性</p>
<p>
<table class="MsoNormalTable" style="border-right: medium none; border-top: medium none; margin: auto auto auto 5.4pt; border-left: medium none; width: 340pt; border-bottom: medium none; border-collapse: collapse; mso-border-top-alt: solid black .75pt; mso-border-bottom-alt: solid black .75pt; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid black; mso-border-insidev: .5pt solid black" cellspacing="0" cellpadding="0" width="453" border="1">
    <tbody>
        <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: black 1pt solid; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 110pt; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-top-alt: solid black .75pt; mso-border-bottom-alt: solid black .5pt; mso-border-right-alt: solid black .5pt" width="147">
            <p class="a0" style="margin: 2.5pt 0cm"><font size="1"><font face="Arial"><span style="font-family: 方正黑体简体; mso-ascii-font-family: Arial">池配置属性</span><span lang="EN-US"><o:p></o:p></span></font></font></p>
            </td>
            <td style="padding-right: 5.4pt; border-top: black 1pt solid; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 230pt; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; border-right-color: #ece9d8; mso-border-top-alt: solid black .75pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt" width="307">
            <p class="a0" style="margin: 2.5pt 0cm"><font size="1"><font face="Arial"><span style="font-family: 方正黑体简体; mso-ascii-font-family: Arial">指定的内容</span><span lang="EN-US"><o:p></o:p></span></font></font></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 1">
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 110pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-top-alt: solid black .5pt; mso-border-bottom-alt: solid black .5pt; mso-border-right-alt: solid black .5pt" width="147">
            <p class="a" style="margin: 2.5pt 0cm"><span lang="EN-US"><font size="1"><span style="font-size: 10pt">initialSize<o:p></o:p></span></font></span></p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 230pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; border-right-color: #ece9d8; mso-border-top-alt: solid black .5pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt" width="307">
            <p class="a" style="margin: 2.5pt 0cm"><font size="1"><span style="font-size: 10pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">池启动时创建的连接数量</span><span lang="EN-US"><o:p></o:p></span></span></font></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 2">
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 110pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-top-alt: solid black .5pt; mso-border-bottom-alt: solid black .5pt; mso-border-right-alt: solid black .5pt" width="147">
            <p class="a" style="margin: 2.5pt 0cm"><span lang="EN-US"><font size="1"><span style="font-size: 10pt">maxActive<o:p></o:p></span></font></span></p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 230pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; border-right-color: #ece9d8; mso-border-top-alt: solid black .5pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt" width="307">
            <p class="a" style="margin: 2.5pt 0cm"><font size="1"><span style="font-size: 10pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">同一时间可以从池分配的最多连接数量。设置为</span><span lang="EN-US">0</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时表示无限制。</span><span lang="EN-US"><o:p></o:p></span></span></font></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 3">
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 110pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-top-alt: solid black .5pt; mso-border-bottom-alt: solid black .5pt; mso-border-right-alt: solid black .5pt" width="147">
            <p class="a" style="margin: 2.5pt 0cm"><span lang="EN-US"><font size="1"><span style="font-size: 10pt">maxIdle<o:p></o:p></span></font></span></p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 230pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; border-right-color: #ece9d8; mso-border-top-alt: solid black .5pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt" width="307">
            <p class="a" style="margin: 2.5pt 0cm"><font size="1"><span style="font-size: 10pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">池里不会被释放的最多空闲连接数量。设置为</span><span lang="EN-US">0</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时表示无限制。</span><span lang="EN-US"><o:p></o:p></span></span></font></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 4">
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 110pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-top-alt: solid black .5pt; mso-border-bottom-alt: solid black .5pt; mso-border-right-alt: solid black .5pt" width="147">
            <p class="a" style="margin: 2.5pt 0cm"><span lang="EN-US"><font size="1"><span style="font-size: 10pt">maxOpenPreparedStatements<o:p></o:p></span></font></span></p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 230pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; border-right-color: #ece9d8; mso-border-top-alt: solid black .5pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt" width="307">
            <p class="a" style="margin: 2.5pt 0cm"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span style="font-size: 10pt">同一时间能够从语句池里分配的已备语句的最大数量。</span></span><span lang="EN-US"><br />
            </span><font size="1"><span style="font-size: 10pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置为</span><span lang="EN-US">0</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时表示无限制。</span><span lang="EN-US"><o:p></o:p></span></span></font></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 5">
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 110pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-top-alt: solid black .5pt; mso-border-bottom-alt: solid black .5pt; mso-border-right-alt: solid black .5pt" width="147">
            <p class="a" style="margin: 2.5pt 0cm"><span lang="EN-US"><font size="1"><span style="font-size: 10pt">maxWait<o:p></o:p></span></font></span></p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 230pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; border-right-color: #ece9d8; mso-border-top-alt: solid black .5pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt" width="307">
            <p class="a" style="margin: 2.5pt 0cm"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span style="font-size: 10pt">在抛出异常之前，池等待连接被回收的最长时间</span></span><span lang="EN-US"><br />
            </span><font size="1"><span style="font-size: 10pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（当没有可用连接时）。设置为</span><span lang="EN-US">-1</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示无限等待。</span><span lang="EN-US"><o:p></o:p></span></span></font></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 6">
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 110pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-top-alt: solid black .5pt; mso-border-bottom-alt: solid black .5pt; mso-border-right-alt: solid black .5pt" width="147">
            <p class="a" style="margin: 2.5pt 0cm"><span lang="EN-US"><font size="1"><span style="font-size: 10pt">minEvictableIdleTimeMillis<o:p></o:p></span></font></span></p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 230pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; border-right-color: #ece9d8; mso-border-top-alt: solid black .5pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt" width="307">
            <p class="a" style="margin: 2.5pt 0cm"><font size="1"><span style="font-size: 10pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">连接保持空闲而不被驱逐的最长时间。</span><span lang="EN-US"><o:p></o:p></span></span></font></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 7">
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 110pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-top-alt: solid black .5pt; mso-border-bottom-alt: solid black .5pt; mso-border-right-alt: solid black .5pt" width="147">
            <p class="a" style="margin: 2.5pt 0cm"><span lang="EN-US"><font size="1"><span style="font-size: 10pt">minIdle<o:p></o:p></span></font></span></p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 230pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; border-right-color: #ece9d8; mso-border-top-alt: solid black .5pt; mso-border-bottom-alt: solid black .5pt; mso-border-left-alt: solid black .5pt" width="307">
            <p class="a" style="margin: 2.5pt 0cm"><font size="1"><span style="font-size: 10pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在不新建连接的条件下，池中保持空闲的最少连接数。</span><span lang="EN-US"><o:p></o:p></span></span></font></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 8; mso-yfti-lastrow: yes">
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 110pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; mso-border-top-alt: solid black .5pt; mso-border-bottom-alt: solid black .75pt; mso-border-right-alt: solid black .5pt" width="147">
            <p class="a" style="margin: 2.5pt 0cm"><span lang="EN-US"><font size="1"><span style="font-size: 10pt">poolPreparedStatements<o:p></o:p></span></font></span></p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; border-left-color: #ece9d8; padding-bottom: 0cm; width: 230pt; border-top-color: #ece9d8; padding-top: 0cm; border-bottom: black 1pt solid; background-color: transparent; border-right-color: #ece9d8; mso-border-top-alt: solid black .5pt; mso-border-bottom-alt: solid black .75pt; mso-border-left-alt: solid black .5pt" width="307">
            <p class="a" style="margin: 2.5pt 0cm"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span style="font-size: 10pt">是否对已备语句进行池管理（布尔值）。</span></span><span lang="EN-US"><o:p></o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>在我们的范例里，池启动时有5个连接，在需要时可以新建连接，但最大连接数量为10。</p>
</strong>
<img src ="http://www.blogjava.net/youngsun/aggbug/225443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youngsun/" target="_blank">Hiro</a> 2008-08-28 23:50 <a href="http://www.blogjava.net/youngsun/articles/225443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDBC驱动汇总</title><link>http://www.blogjava.net/youngsun/articles/225148.html</link><dc:creator>Hiro</dc:creator><author>Hiro</author><pubDate>Wed, 27 Aug 2008 13:41:00 GMT</pubDate><guid>http://www.blogjava.net/youngsun/articles/225148.html</guid><wfw:comment>http://www.blogjava.net/youngsun/comments/225148.html</wfw:comment><comments>http://www.blogjava.net/youngsun/articles/225148.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youngsun/comments/commentRss/225148.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youngsun/services/trackbacks/225148.html</trackback:ping><description><![CDATA[<p><strong>Microsoft SQL Server (6.5, 7, 2000 and 2005) and Sybase (10, 11, 12).</strong><span style="font-size: 10pt">&nbsp;&nbsp;<br />
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <br />
JDBC Name: jTDS <br />
Home Page: http://jtds.sourceforge.net/ <br />
JDBC Ver: 1.0.2 <br />
Download: http://sourceforge.net/project/showfiles.php?group_id=33291 <br />
Conn Code: <br />
&nbsp;&nbsp; Class.forName("net.sourceforge.jtds.jdbc.Driver "); <br />
&nbsp;&nbsp; Connection con = DriverManager.getConnection("jdbc:jtds:sqlserver://host:port/database","user","password"); <br />
or <br />
&nbsp;&nbsp; Connection con = DriverManager.getConnection("jdbc:jtds:sybase://host:port/database","user","password"); <br />
<br />
</span><strong>Microsoft SQL Server 2000 <br />
</strong><span style="font-size: 10pt">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <br />
JDBC Name: SQL Server 2000 Driver for JDBC <br />
Home Page: http://www.microsoft.com/china/sql/ <br />
JDBC Ver: (SQL Server 2000 Driver for JDBC) <br />
Download: http://www.microsoft.com/china/sql/downloads/2000/jdbc.asp <br />
Conn Code: <br />
&nbsp;&nbsp; Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");&nbsp;&nbsp;<br />
&nbsp;&nbsp; Connection conn = DriverManager.getConnection ("jdbc:microsoft:sqlserver://server1:1433","user","password"); <br />
<br />
</span><strong>Oracle <br />
</strong><span style="font-size: 10pt">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <br />
JDBC Name: Connector/J&nbsp;&nbsp;<br />
Home Page: http://www.oracle.com/technology/software/tech/java/ <br />
JDBC Ver: (based on Oracle) <br />
Download: http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/ <br />
Conn Code: <br />
&nbsp;&nbsp; Class.forName("oracle.jdbc.driver.OracleDriver"); <br />
&nbsp;&nbsp; Connection con = DriverManager.getConnection("jdbc:oracle:thin:@host:port:databse","user","password"); <br />
<br />
</span><strong>MySQL <br />
</strong><span style="font-size: 10pt">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <br />
JDBC Name: Connector/J <br />
Home Page: http://dev.mysql.com/ <br />
JDBC Ver: 3.1 <br />
Download: http://dev.mysql.com/downloads/ <br />
Conn Code: <br />
&nbsp;&nbsp; Class.forName("com.mysql.jdbc.Driver"); <br />
&nbsp;&nbsp; Connection con = DriverManager.getConnection("jdbc:mysql://host:port/database","user","password"); <br />
<br />
</span><strong>Sybase <br />
</strong><span style="font-size: 10pt">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <br />
JDBC Name: jConnect&nbsp;&nbsp;<br />
Home Page: http://www.sybase.com.cn/cn/content/SDN/ <br />
JDBC Ver: 4.5/5.5 <br />
Download: http://www.sybase.com/detail_list?id=13&amp;morenavId=8668&amp;multi=true&amp;SR=Y&amp;show=1265 <br />
Conn Code: <br />
Class.forName("com.sybase.jdbc2.jdbc.SybDriver").newInstance(); <br />
DriverManager.getConnection("jdbc:sybase:Tds:IP:2638?ServiceName="+database,"user","password"); <br />
<br />
</span><strong>Postgresql <br />
</strong><span style="font-size: 10pt">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <br />
JDBC Name: PostgreSQL JDBC <br />
Home Page: http://jdbc.postgresql.org/ <br />
JDBC Ver: 8.0 Build 310 <br />
Download: http://jdbc.postgresql.org/download.html <br />
Conn Code: <br />
&nbsp;&nbsp; Class.forName("org.postgresql.Driver");&nbsp;&nbsp;<br />
&nbsp;&nbsp; Connection con = DriverManager.getConnection("jdbc:postgresql://host:port/database","user","password"); <br />
<br />
</span><strong>IBM Informix <br />
</strong><span style="font-size: 10pt">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <br />
JDBC Name: Informix JDBC Driver (IBM Informix JDBC V3.0) <br />
Home Page: http://www-306.ibm.com/software/data/informix/ <br />
JDBC Ver: 3.0.JC1 <br />
Download: http://www14.software.ibm.com/webapp/download/search.jsp?go=y&amp;rs=ifxjdbc <br />
Conn Code: <br />
&nbsp;&nbsp; Class.forName("com.informix.jdbc.IfxDriver").newInstance();&nbsp;&nbsp;<br />
&nbsp;&nbsp; Connection conn= DriverManager.getConnection("jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;user=testuser;password=testpassword";); <br />
<br />
</span><strong>IBM DB2 <br />
</strong><span style="font-size: 10pt">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <br />
JDBC Name: DB2 JDBC Universal Driver <br />
Home Page: http://www-306.ibm.com/software/data/db2/udb/&nbsp;&nbsp;<br />
JDBC Ver:&nbsp;&nbsp;<br />
Download: http://www-128.ibm.com/developerworks/db2/downloads/jcc/ <br />
Conn Code: <br />
&nbsp;&nbsp; Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();&nbsp;&nbsp;<br />
&nbsp;&nbsp; Connection conn= DriverManager.getConnection("jdbc:db2://localhost:5000/sample",user,password);&nbsp;&nbsp;<br />
<br />
</span><strong>IBM AS400主机在用的JDBC语法 <br />
</strong><span style="font-size: 10pt">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <br />
&nbsp;&nbsp;有装V4R4以上版本的Client Access Express <br />
&nbsp;&nbsp;可以在C:"Program Files"IBM"Client Access"jt400"lib <br />
&nbsp;&nbsp;找到 driver 档案 jt400.zip，并更改扩展名成为 jt400.jar <br />
Conn Code: <br />
&nbsp;&nbsp; java.sql.DriverManager.registerDriver (new com.ibm.as400.access.AS400JDBCDriver ()); <br />
&nbsp;&nbsp; Class.forName("com.ibm.as400.access.AS400JDBCConnection"); <br />
&nbsp;&nbsp; con = DriverManager.getConnection("jdbc:as400://IP","user","password");&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp; Db Name: Ms Access or Ms Foxpro <br />
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <br />
Conn Code: <br />
&nbsp;&nbsp; step 1: 配置 odbc (例如：myDb) <br />
&nbsp;&nbsp; step 2:&nbsp;&nbsp;<br />
&nbsp;&nbsp; String dbURL = "jdbc:odbc:myDb"; <br />
&nbsp;&nbsp; Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); <br />
　Connection conn = DriverManager.getConnection(dbURL);&nbsp;&nbsp;<br />
or <br />
&nbsp;&nbsp; String dbURL = "jdbc:odbc:driver={MicrosoftAccessDriver(*.mdb)};DBQ=dabaseName.mdb"; <br />
&nbsp;&nbsp; Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); <br />
　Connection conn = DriverManager.getConnection(dbURL); </span></p>
<img src ="http://www.blogjava.net/youngsun/aggbug/225148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youngsun/" target="_blank">Hiro</a> 2008-08-27 21:41 <a href="http://www.blogjava.net/youngsun/articles/225148.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Struts的Token机制解决表单重复提交</title><link>http://www.blogjava.net/youngsun/articles/209615.html</link><dc:creator>Hiro</dc:creator><author>Hiro</author><pubDate>Fri, 20 Jun 2008 15:21:00 GMT</pubDate><guid>http://www.blogjava.net/youngsun/articles/209615.html</guid><wfw:comment>http://www.blogjava.net/youngsun/comments/209615.html</wfw:comment><comments>http://www.blogjava.net/youngsun/articles/209615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youngsun/comments/commentRss/209615.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youngsun/services/trackbacks/209615.html</trackback:ping><description><![CDATA[Struts的Token（令牌）机制能够很好的解决表单重复提交的问题，基本原理是：<a class="channel_keylink" href="http://server.chinaitlab.com/" target="_blank">服务器</a>端在处理到达的请求之前，会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较，看是否匹配。在处理完该请求后，且在答复发送给客户端之前，将会产生一个新的令牌，该令牌除传给客户端以外，也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话，客户端传过来的令牌就和<a class="channel_keylink" href="http://server.chinaitlab.com/" target="_blank">服务器</a>端的令牌不一致，从而有效地防止了重复提交的发生。<br />
　　<br />
　　这时其实也就是两点，第一：你需要在请求中有这个令牌值，请求中的令牌值如何保存，其实就和我们平时在页面中保存一些信息是一样的，通过隐藏字段来保存，保存的形式如： 〈input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉，这个value是TokenProcessor类中的generateToken()获得的，是根据当前用户的session id和当前时间的long值来计算的。第二：在客户端提交后，我们要根据判断在请求中包含的值是否和服务器的令牌一致，因为服务器每次提交都会生成新的Token，所以，如果是重复提交，客户端的Token值和服务器端的Token值就会不一致。下面就以在数据库中插入一条数据来说明如何防止重复提交。<br />
　　<br />
　　在Action中的add方法中，我们需要将Token值明确的要求保存在页面中，只需增加一条语句：saveToken(request);，如下所示：<br />
　　<br />
　　public ActionForward add(ActionMapping mapping, ActionForm form,<br />
　　<br />
　　HttpServletRequest request, HttpServletResponse response)<br />
　　<br />
　　//前面的处理省略<br />
　　<br />
　　saveToken(request);<br />
　　<br />
　　return mapping.findForward("add");<br />
　　<br />
　　}在Action的insert方法中，我们根据表单中的Token值与服务器端的Token值比较，如下所示：<br />
　　<br />
　　public ActionForward insert(ActionMapping mapping, ActionForm form,<br />
　　<br />
　　HttpServletRequest request, HttpServletResponse response)<br />
　　<br />
　　if (isTokenValid(request, true)) {<br />
　　<br />
　　// 表单不是重复提交<br />
　　<br />
　　//这里是保存数据的代码<br />
　　<br />
　　} else {<br />
　　<br />
　　//表单重复提交<br />
　　<br />
　　saveToken(request);<br />
　　<br />
　　//其它的处理代码<br />
　　<br />
　　}<br />
　　<br />
　　}<br />
　　<br />
　　其实使用起来很简单，举个最简单、最需要使用这个的例子：<br />
　　<br />
　　一般控制重复提交主要是用在对数据库操作的控制上，比如插入、更新、删除等，由于更新、删除一般都是通过id来操作（例如：updateXXXById, removeXXXById），所以这类操作控制的意义不是很大（不排除个别现象），重复提交的控制也就主要是在插入时的控制了。<br />
　　<br />
　　先说一下，我们目前所做项目的情况：<br />
　　<br />
　　目前的项目是用Struts＋Spring＋Ibatis，页面用jstl，Struts复杂View层，Spring在Service层提供事务控制，Ibatis是用来代替JDBC，所有页面的访问都不是直接访问jsp，而是访问Structs的Action，再由Action来Forward到一个Jsp，所有针对数据库的操作，比如取数据或修改数据，都是在Action里面完成，所有的Action一般都继承BaseDispatchAction，这个是自己建立的类，目的是为所有的Action做一些统一的控制，在Struts层，对于一个功能，我们一般分为两个Action，一个Action里的功能是不需要调用Struts的验证功能的（常见的方法名称有add,edit,remove,view,list），另一个是需要调用Struts的验证功能的（常见的方法名称有insert,update）。<br />
　　<br />
　　就拿论坛发贴来说吧，论坛发贴首先需要跳转到一个页面，你可以填写帖子的主题和内容，填写完后，单击&#8220;提交&#8221;，贴子就发表了，所以这里经过两个步骤：<br />
　　<br />
　　1、转到一个新增的页面，在Action里我们一般称为add，例如：<br />
　　<br />
　　public ActionForward add(ActionMapping mapping, ActionForm form,<br />
　　<br />
　　HttpServletRequest request, HttpServletResponse response)<br />
　　<br />
　　throws Exception {<br />
　　<br />
　　//这一句是输出调试信息，表示代码执行到这一段了<br />
　　<br />
　　log.debug(":: action - subject add");<br />
　　<br />
　　//your code here<br />
　　<br />
　　//这里保存Token值<br />
　　<br />
　　saveToken(request);<br />
　　<br />
　　//跳转到add页面，在Structs-config.xml里面定义，例如，跳转到subjectAdd.jsp<br />
　　<br />
　　return mapping.findForward("add");<br />
　　<br />
　　}<br />
　　<br />
　　2、在填写标题和内容后，选择 提交 ，会提交到insert方法，在insert方法里判断，是否重复提交了。<br />
　　<br />
　　public ActionForward insert(ActionMapping mapping, ActionForm form,<br />
　　<br />
　　HttpServletRequest request, HttpServletResponse response){<br />
　　<br />
　　if (isTokenValid(request, true)) {<br />
　　<br />
　　// 表单不是重复提交<br />
　　<br />
　　//这里是保存数据的代码<br />
　　<br />
　　} else {<br />
　　<br />
　　//表单重复提交<br />
　　<br />
　　saveToken(request);<br />
　　<br />
　　//其它的处理代码<br />
　　<br />
　　}<br />
　　<br />
　　}<br />
　　<br />
　　下面更详细一点（注意，下面所有的代码使用全角括号）：<br />
　　<br />
　　1、你想发贴时，点击&#8220;我要发贴&#8221;链接的代码可以里这样的：<br />
　　<br />
　　〈html:link action="subject.do?method=add"〉我要发贴〈/html:link〉<br />
　　<br />
　　subject.do 和 method 这些在struct-config.xml如何定义我就不说了，点击链接后，会执行subject.do的add方法，代码如上面说的，跳转到subjectAdd.jsp页面。页面的代码大概如下：<br />
　　<br />
　　〈html:form action="subjectForm.do?method=insert"〉<br />
　　<br />
　　〈html:text property="title" /〉<br />
　　<br />
　　〈html:textarea property="content" /〉<br />
　　<br />
　　〈html:submit property="发表" /〉<br />
　　<br />
　　〈html:reset property="重填" /〉<br />
　　<br />
　　〈html:form〉<br />
　　<br />
　　如果你在add方法里加了&#8220;saveToken(request);&#8221;这一句，那在subjectAdd.jsp生成的页面上，会多一个隐藏字段，类似于这样〈input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="6aa35341f25184fd996c4c918255c3ae"〉，<br />
　　<br />
　　2、点击发表后，表单提交到subjectForm.do里的insert方法后，你在insert方法里要将表单的数据插入到数据库中，如果没有进行重复提交的控制，那么每点击一次浏览器的刷新按钮，都会在数据库中插入一条相同的记录，增加下面的代码，你就可以控制用户的重复提交了。<br />
　　<br />
　　if (isTokenValid(request, true)) {<br />
　　<br />
　　// 表单不是重复提交<br />
　　<br />
　　//这里是保存数据的代码<br />
　　<br />
　　} else {<br />
　　<br />
　　//表单重复提交<br />
　　<br />
　　saveToken(request);<br />
　　<br />
　　//其它的处理代码<br />
　　<br />
　　}<br />
　　<br />
　　注意，你必须在add方法里使用了saveToken(request)，你才能在insert里判断，否则，你每次保存操作都是重复提交。<br />
　　<br />
　　记住一点，Struts在你每次访问Action的时候，都会产生一个令牌，保存在你的Session里面，如果你在Action里的函数里面，使用了saveToken(request);，那么这个令牌也会保存在这个Action所Forward到的jsp所生成的静态页面里。<br />
　　<br />
　　如果你在你Action的方法里使用了isTokenValid，那么Struts会将你从你的request里面去获取这个令牌值，然后和Session里的令牌值做比较，如果两者相等，就不是重复提交，如果不相等，就是重复提交了。<br />
　　<br />
　　由于我们项目的所有Action都是继承自BaseDispatchAction这个类，所以我们基本上都是在这个类里面做了表单重复提交的控制，默认是控制add方法和insert方法，如果需要控制其它的方法，就自己手动写上面这些代码，否则是不需要手写的，控制的代码如下：<br />
　　<br />
　　public abstract class BaseDispatchAction extends BaseAction {<br />
　　<br />
　　protected ActionForward perform(ActionMapping mapping, ActionForm form,<br />
　　<br />
　　HttpServletRequest request, HttpServletResponse response)<br />
　　<br />
　　throws Exception {<br />
　　<br />
　　String parameter = mapping.getParameter();<br />
　　<br />
　　String name = request.getParameter(parameter);<br />
　　<br />
　　if (null == name) { //如果没有指定 method ，则默认为 list<br />
　　<br />
　　name = "list";<br />
　　<br />
　　}<br />
　　<br />
　　if ("add".equals(name)) {<br />
　　<br />
　　if ("add".equals(name)) {<br />
　　<br />
　　saveToken(request);<br />
　　<br />
　　}<br />
　　<br />
　　} else if ("insert".equals(name)) {<br />
　　<br />
　　if (!isTokenValid(request, true)) {<br />
　　<br />
　　resetToken(request);<br />
　　<br />
　　saveError(request, new ActionMessage("error.repeatSubmit"));<br />
　　<br />
　　log.error("重复提交！");<br />
　　<br />
　　return mapping.findForward("error");<br />
　　<br />
　　}<br />
　　<br />
　　}<br />
　　<br />
　　return dispatchMethod2(mapping, form, request, response, name);<br />
　　<br />
　　}<br />
　　<br />
　　} 
<img src ="http://www.blogjava.net/youngsun/aggbug/209615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youngsun/" target="_blank">Hiro</a> 2008-06-20 23:21 <a href="http://www.blogjava.net/youngsun/articles/209615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JNDI</title><link>http://www.blogjava.net/youngsun/articles/208456.html</link><dc:creator>Hiro</dc:creator><author>Hiro</author><pubDate>Mon, 16 Jun 2008 15:24:00 GMT</pubDate><guid>http://www.blogjava.net/youngsun/articles/208456.html</guid><wfw:comment>http://www.blogjava.net/youngsun/comments/208456.html</wfw:comment><comments>http://www.blogjava.net/youngsun/articles/208456.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youngsun/comments/commentRss/208456.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youngsun/services/trackbacks/208456.html</trackback:ping><description><![CDATA[JNDI(Java&nbsp;Naming&nbsp;and&nbsp;Directory&nbsp;Interface)是一个应用程序设计的API，为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口，类似JDBC都是构建在抽象层上。 <br />
JNDI可访问的现有的目录及服务有： <br />
DNS、XNam&nbsp;、Novell目录服务、LDAP(Lightweight&nbsp;Directory&nbsp;Access&nbsp;Protocol&nbsp;轻型目录访问协议)、&nbsp;CORBA对象服务、文件系统、Windows&nbsp;XP/2000/NT/Me/9x的注册表、RMI、DSML&nbsp;v1&amp;v2、NIS。 <br />
JNDI优点： <br />
包含了大量的命名和目录服务，使用通用接口来访问不同种类的服务； <br />
可以同时连接到多个命名或目录服务上； <br />
建立起逻辑关联，允许把名称同Java对象或资源关联起来，而不必指导对象或资源的物理ID。 <br />
JNDI程序包： <br />
javax.naming：命名操作； <br />
javax.naming.directory：目录操作； <br />
javax.naming.event：在命名目录服务器中请求事件通知； <br />
javax.naming.ldap：提供LDAP支持； <br />
javax.naming.spi：允许动态插入不同实现。 <br />
利用JNDI的命名与服务功能来满足企业级APIs对命名与服务的访问，诸如EJBs、JMS、JDBC&nbsp;2.0以及IIOP上的RMI通过JNDI来使用CORBA的命名服务。 <br />
JNDI与JDBC： <br />
JNDI提供了一种统一的方式，可以用在网络上查找和访问服务。通过指定一个资源名称，该名称对应于数据库或命名服务中的一个纪录，同时返回数据库连接建立所必须的信息。 <br />
代码示例： <br />
try{ <br />
Context&nbsp;cntxt&nbsp;=&nbsp;new&nbsp;InitialContext(); <br />
DataSource&nbsp;ds&nbsp;=&nbsp;(DataSource)&nbsp;cntxt.lookup("jdbc/dpt"); <br />
} <br />
catch(NamingException&nbsp;ne){ <br />
... <br />
} <br />
JNDI与JMS： <br />
消息通信是软件组件或应用程序用来通信的一种方法。JMS就是一种允许应用程序创建、发送、接收、和读取消息的JAVA技术。 <br />
代码示例： <br />
try{ <br />
Properties&nbsp;env&nbsp;=&nbsp;new&nbsp;Properties(); <br />
InitialContext&nbsp;inictxt&nbsp;=&nbsp;new&nbsp;InitialContext(env); <br />
TopicConnectionFactory&nbsp;connFactory&nbsp;=&nbsp;(TopicConnectionFactory)&nbsp;inictxt.lookup("TTopicConnectionFactory"); <br />
... <br />
} <br />
catch(NamingException&nbsp;ne){ <br />
... <br />
} <br />
访问特定目录：举个例子，人是个对象，他有好几个属性，诸如这个人的姓名、电话号码、电子邮件地址、邮政编码等属性。通过getAttributes()方法 <br />
Attribute&nbsp;attr&nbsp;= <br />
&nbsp;&nbsp;&nbsp;&nbsp;directory.getAttributes(personName).get("email"); <br />
String&nbsp;email&nbsp;=&nbsp;(String)attr.get(); <br />
通过使用JNDI让客户使用对象的名称或属性来查找对象： <br />
foxes&nbsp;=&nbsp;directory.search("o=Wiz,c=US",&nbsp;"sn=Fox",&nbsp;controls); <br />
通过使用JNDI来查找诸如打印机、数据库这样的对象，查找打印机的例子： <br />
Printer&nbsp;printer&nbsp;=&nbsp;(Printer)namespace.lookup(printerName); <br />
printer.print(document); <br />
浏览命名空间： <br />
NamingEnumeration&nbsp;list&nbsp;=&nbsp;namespace.list("o=Widget,&nbsp;c=US"); <br />
while&nbsp;(list.hasMore())&nbsp;{ <br />
NameClassPair&nbsp;entry&nbsp;=&nbsp;(NameClassPair)list.next(); <br />
display(entry.getName(),&nbsp;entry.getClassName()); <br />
} <br />
</cc>
<table width="72%" bgcolor="#ffffff" border="0">
    <tbody>
        <tr>
            <td></td>
            <td align="left" width="97%">
            <table class="wr" cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td class="gray14"><cc>常用的JNDI操作： <br />
                        常用的JNDI操作： <br />
                        void&nbsp;bind(String&nbsp;sName,Object&nbsp;object);――绑定：把名称同对象关联的过程 <br />
                        void&nbsp;rebind(String&nbsp;sName,Object&nbsp;object);――重新绑定：用来把对象同一个已经存在的名称重新绑定 <br />
                        void&nbsp;unbind(String&nbsp;sName);――释放：用来把对象从目录中释放出来 <br />
                        void&nbsp;lookup(String&nbsp;sName,Object&nbsp;object);――查找：返回目录总的一个对象 <br />
                        void&nbsp;rename(String&nbsp;sOldName,String&nbsp;sNewName);――重命名：用来修改对象名称绑定的名称 <br />
                        NamingEnumeration&nbsp;listBinding(String&nbsp;sName);――清单：返回绑定在特定上下文中对象的清单列表 <br />
                        NamingEnumeration&nbsp;list(String&nbsp;sName); <br />
                        代码示例：重新得到了名称、类名和绑定对象。 <br />
                        NamingEnumeration&nbsp;namEnumList&nbsp;=&nbsp;ctxt.listBinding("cntxtName"); <br />
                        ... <br />
                        while&nbsp;(&nbsp;namEnumList.hasMore()&nbsp;)&nbsp;{ <br />
                        Binding&nbsp;bnd&nbsp;=&nbsp;(Binding)&nbsp;namEnumList.next(); <br />
                        String&nbsp;sObjName&nbsp;=&nbsp;bnd.getName(); <br />
                        String&nbsp;sClassName&nbsp;=&nbsp;bnd.getClassName(); <br />
                        SomeObject&nbsp;objLocal&nbsp;=&nbsp;(SomeObject)&nbsp;bnd.getObject(); <br />
                        }</cc> </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
JNDI主要提供应用程序所需要资源上命名与目录服务.在Java&nbsp;EE环境中,JNDI扮演了一个很重要的角色,它提供了一个接口让用户在不知道资源所在位置的情形下,取得该资源服务.&nbsp;就好比网络磁盘驱动器的功能一样。如果有人事先将另一台机器上的磁盘驱动器接到用户的机器上,用户在使用的时候根本就分辨不出现在的驱动器是存在本端,还是在另一端的机器上,用户只需取得资源来用,根本就不知道资源在什么地方。&nbsp;JNDI这个接口基本上是LDAP,LDAP全名为Lightweight&nbsp;Directory&nbsp;Access&nbsp;Protocol.</cc> <br />
<br />
JNDI是Java平台的一个标准扩展，提供了一组接口、类和关于命名空间的概念。如同其它很多Java技术一样，JDNI是provider-based的技术，暴露了一个API和一个服务供应接口（SPI）。这意味着任何基于名字的技术都能通过JNDI而提供服务，只要JNDI支持这项技术。JNDI目前所支持的技术包括LDAP、CORBA&nbsp;Common&nbsp;Object&nbsp;Service（COS）名字服务、RMI、NDS、DNS、Windows注册表等等。很多J2EE技术，包括EJB都依靠JNDI来组织和定位实体。&nbsp; <br />
JDNI通过绑定的概念将对象和名称联系起来。在一个文件系统中，文件名被绑定给文件。在DNS中，一个IP地址绑定一个URL。在目录服务中，一个对象名被绑定给一个对象实体。&nbsp; <br />
JNDI中的一组绑定作为上下文来引用。每个上下文暴露的一组操作是一致的。例如，每个上下文提供了一个查找操作，返回指定名字的相应对象。每个上下文都提供了绑定和撤除绑定名字到某个对象的操作。JNDI使用通用的方式来暴露命名空间，即使用分层上下文以及使用相同命名语法的子上下文。&nbsp; <br />
jndi的用途：&nbsp; <br />
1。你可以用jndi来得到object类的属性&nbsp; <br />
如：Attribute&nbsp;attr&nbsp;=directory.getAttributes(personName).get("email");&nbsp; <br />
String&nbsp;email&nbsp;=&nbsp;(String)attr.get();&nbsp; <br />
2。你可以用jndi来搜索对象&nbsp; <br />
如：foxes&nbsp;=&nbsp;directory.search("o=Wiz,c=US",&nbsp;"sn=Fox",&nbsp;controls);&nbsp; <br />
查找谁的名字叫Fox在wiz部门的员工？&nbsp; <br />
3。你可以用jndi通过naming/directory服务查询像printers和databases的对象&nbsp; <br />
如：查询&nbsp;Printer&nbsp; <br />
Printer&nbsp;printer&nbsp;=&nbsp;(Printer)namespace.lookup(printerName);&nbsp; <br />
printer.print(document);&nbsp; <br />
4。你可以用jndi列表出命名空间的特殊级别的内容&nbsp; <br />
如：&nbsp; <br />
NamingEnumeration&nbsp;list&nbsp;=&nbsp;namespace.list("o=Widget,&nbsp;c=US");&nbsp; <br />
while&nbsp;(list.hasMore())&nbsp;{&nbsp; <br />
NameClassPair&nbsp;entry&nbsp;=&nbsp;(NameClassPair)list.next();&nbsp; <br />
display(entry.getName(),&nbsp;entry.getClassName());</cc> <br />
<br />
<table width="72%" bgcolor="#ffffff" border="0">
    <tbody>
        <tr>
            <td align="left" width="97%">
            <table class="wr" cellspacing="0" cellpadding="0" border="0">
                <tbody>
                    <tr>
                        <td class="gray14">和多数java服务一样，SUN对JNDI也只提供接口，使用JNDI只需要用到JNDI接口而不必关心具体实现： <br />
                        <br />
                        private&nbsp;static&nbsp;Object&nbsp;jndiLookup()&nbsp;throws&nbsp;Exception&nbsp;{ <br />
                        &nbsp;InitialContext&nbsp;ctx&nbsp;=&nbsp;new&nbsp;InitialContext(); <br />
                        &nbsp;return&nbsp;ctx.lookup("java:comp/env/systemStartTime"); <br />
                        } <br />
                        <br />
                        上述代码在J2EE服务器环境下工作得很好，但是在main()中就会报一个NoInitialContextException，许多文章会说你创建InitialContext的时候还要传一个Hashtable或者Properties，像这样： <br />
                        <br />
                        Hashtable&nbsp;env&nbsp;=&nbsp;new&nbsp;Hashtable(); <br />
                        env.put(Context.INITIAL_CONTEXT_FACTORY,&nbsp;"weblogic.jndi.WLInitialContextFactory"); <br />
                        env.put(Context.PROVIDER_URL,"t3://localhost:7001"); <br />
                        InitialContext&nbsp;ctx&nbsp;=&nbsp;new&nbsp;InitialContext(env); <br />
                        <br />
                        这个在WebLogic环境下是对的，但是换到JBoss呢？再用JBoss的例子？ <br />
                        <br />
                        其实之所以有NoInitialContextException是因为无法从System.properties中获得必要的JNDI参数，在服务器环境下，服务器启动时就把这些参数放到System.properties中了，于是直接new&nbsp;InitialContext()就搞定了，不要搞env那么麻烦，搞了env你的代码还无法移植，弄不好管理员设置服务器用的不是标准端口还照样抛异常。 <br />
                        <br />
                        但是在单机环境下，可没有JNDI服务在运行，那就手动启动一个JNDI服务。我在JDK&nbsp;5的rt.jar中一共找到了4种SUN自带的JNDI实现： <br />
                        <br />
                        LDAP，CORBA，RMI，DNS。 <br />
                        <br />
                        这4种JNDI要正常运行还需要底层的相应服务。一般我们没有LDAP或CORBA服务器，也就无法启动这两种JNDI服务，DNS用于查域名的，以后再研究，唯一可以在main()中启动的就是基于RMI的JNDI服务。 <br />
                        <br />
                        现在我们就在main()中启动基于RMI的JNDI服务并且绑一个Date对象到JNDI上： <br />
                        <br />
                        LocateRegistry.createRegistry(1099); <br />
                        System.setProperty(Context.INITIAL_CONTEXT_FACTORY,&nbsp;"com.sun.jndi.rmi.registry.RegistryContextFactory"); <br />
                        System.setProperty(Context.PROVIDER_URL,&nbsp;"rmi://localhost:1099"); <br />
                        InitialContext&nbsp;ctx&nbsp;=&nbsp;new&nbsp;InitialContext(); <br />
                        class&nbsp;RemoteDate&nbsp;extends&nbsp;Date&nbsp;implements&nbsp;Remote&nbsp;{}; <br />
                        ctx.bind("java:comp/env/systemStartTime",&nbsp;new&nbsp;RemoteDate()); <br />
                        ctx.close(); <br />
                        <br />
                        注意，我直接把JNDI的相关参数放入了System.properties中，这样，后面的代码如果要查JNDI，直接new&nbsp;InitialContext()就可以了，否则，你又得写Hashtable&nbsp;env&nbsp;=&nbsp;... <br />
                        <br />
                        在RMI中绑JNDI的限制是，绑定的对象必须是Remote类型，所以就自己扩展一个。 <br />
                        <br />
                        其实JNDI还有两个Context.SECURITY_PRINCIPAL和Context.SECURITY_CREDENTIAL，如果访问JNDI需要用户名和口令，这两个也要提供，不过一般用不上。 <br />
                        <br />
                        在后面的代码中查询就简单了： <br />
                        <br />
                        InitialContext&nbsp;ctx&nbsp;=&nbsp;new&nbsp;InitialContext(); <br />
                        Date&nbsp;startTime&nbsp;=&nbsp;(Date)&nbsp;ctx.lookup("java:comp/env/systemStartTime"); <br />
                        <br />
                        在SUN的JNDI&nbsp;tutorial中的例子用的com.sun.jndi.fscontext.RefFSContextFactory类，但是我死活在JDK&nbsp;5中没有找到这个类，也就是NoClassDefFoundError，他也不说用的哪个扩展包，我也懒得找了。</cc> </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
        <tr>
            <td height="17"></td>
        </tr>
    </tbody>
</table>
<br />
JNDI是J2EE中一个很重要的标准，通常我们是在J2EE编程中用到，Tomcat中提供了在JSP和Servelt中直接使用JNDI的方法，主要是通过dbcp连接池，下面谈一下我在Tomcat5.5中配置和使用JNDI的方法。本文的对象是对j2ee编程有所了解的读者，或者已经看过了我的Blog：tomcat的基本配置说明&nbsp; <br />
&nbsp;一、先在自己应用程序WEB-INF目录下的web.xml添加以下语句： <br />
&nbsp;&lt;resource-ref&gt; <br />
&nbsp;&lt;descrtiption&gt;引用资源说明&lt;/descrtiption&gt; <br />
&nbsp;&lt;res-ref-name&gt;引用资源的JNDI名&lt;/res-ref-name&gt; <br />
&nbsp;&lt;res-type&gt;引用资源的类名&lt;/res-type&gt; <br />
&nbsp;&lt;res-auth&gt;管理者（Container）&lt;/res-auth&gt;&lt;!--Container－容器管理&nbsp;Application－Web应用管理--&gt; <br />
&lt;/resource-ref&gt; <br />
&nbsp;然后在tomcat目录/conf/server.xml文件里相应的&lt;Context&gt;元素，看我的Blog：tomcat的基本配置说明&nbsp; <br />
添加如下子元素： <br />
&lt;Resource&nbsp;name="引用资源的JNDI名"&nbsp;auth="Container"&nbsp;type="javax.sql.DataSource" <br />
&nbsp;driverClassName="com.pointbase.jdbc.jdbcUniversalDriver（自己的jdbc驱动）" <br />
&nbsp;url="jdbc:pointbase:server://localhost/acme（数据库连接url）" <br />
&nbsp;username="root（用户名）"&nbsp;password="root（密码）"&nbsp;maxActive="20（连接池dbcp的相关配置）"&nbsp;maxIdle="10"&nbsp;maxWait="10000"/&gt; <br />
&nbsp;注意，要把你的驱动拷到common/lib下，我用的是pointbase因此我拷的是pbclient44.jar到了common/lib下（对pointbase感兴趣的读者可以看我的另一篇文章pointbase数据库学习，里面也提到了我为什么是用pointbase数据库作为讲解）。 <br />
二、例子：以下是我的假设的项目ACMEWeb： <br />
&nbsp;在相应程序的web.xml里添加 <br />
&lt;web-app&nbsp;....&gt;&nbsp; <br />
&nbsp;..... <br />
&nbsp;&lt;resource-ref&gt; <br />
&nbsp;&lt;res-ref-name&gt;jdbc/AcmeDB&lt;/res-ref-name&gt; <br />
&nbsp;&lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt; <br />
&nbsp;&lt;res-auth&gt;Container&lt;/res-auth&gt; <br />
&nbsp;&lt;/resource-ref&gt; <br />
&lt;/web-app&gt; <br />
&nbsp;然后再server.xml里修改： <br />
&nbsp;&lt;Context&nbsp;path="/ACMEWeb"&nbsp;reloadable="true"&nbsp;docBase="E:\eclipseproject\ACMEWeb"&nbsp;workDir="E:\eclipseproject\ACMEWeb\work"&gt; <br />
&nbsp;&lt;Resource&nbsp;name="jdbc/AcmeDB"&nbsp;auth="Container"&nbsp;type="javax.sql.DataSource"&nbsp;driverClassName="com.pointbase.jdbc.jdbcUniversalDriver"&nbsp;url="jdbc:pointbase:server://localhost/acme"&nbsp;username="root"&nbsp;password="root"&nbsp;maxActive="20"&nbsp;maxIdle="10"&nbsp;maxWait="10000"/&gt; <br />
&lt;/Context&gt; <br />
&nbsp;建议你把上面的内容编写成为一个xml文件，拷到conf/Catalina/&lt;主机名&gt;/文件夹下，若有不懂的地方可以参考我的Blog：tomcat的基本配置说明&nbsp;和tomcat的文档。</cc> <br />
<img src ="http://www.blogjava.net/youngsun/aggbug/208456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youngsun/" target="_blank">Hiro</a> 2008-06-16 23:24 <a href="http://www.blogjava.net/youngsun/articles/208456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat中的jndi配置</title><link>http://www.blogjava.net/youngsun/articles/208454.html</link><dc:creator>Hiro</dc:creator><author>Hiro</author><pubDate>Mon, 16 Jun 2008 15:15:00 GMT</pubDate><guid>http://www.blogjava.net/youngsun/articles/208454.html</guid><wfw:comment>http://www.blogjava.net/youngsun/comments/208454.html</wfw:comment><comments>http://www.blogjava.net/youngsun/articles/208454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youngsun/comments/commentRss/208454.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youngsun/services/trackbacks/208454.html</trackback:ping><description><![CDATA[如果是tomcat5以下，则修改conf/server.xml文件，tomcat5及以上则修改／conf/Catalina/localhost目录中的一个xml文件。在&lt;/Host&gt;行之前插入如下的一段标签：&nbsp; <br />
<br />
(以oralce为例，假设你应用的上下文根是／test,jndi是jdbc/test)&nbsp; <br />
<br />
&lt;Context&nbsp;path="/test"&nbsp;docBase="E:\test"&nbsp;&gt;&nbsp; <br />
<br />
&lt;Resource&nbsp;name="jdbc/test"&nbsp;auth="Container"&nbsp;type="javax.sql.DataSource"/&gt;&nbsp; <br />
&lt;ResourceParams&nbsp;name="jdbc/test"&gt;&nbsp; <br />
&lt;parameter&gt;&nbsp; <br />
&lt;name&gt;username&lt;/name&gt;&nbsp; <br />
&lt;value&gt;system&lt;/value&gt;&nbsp; <br />
&lt;/parameter&gt;&nbsp; <br />
&lt;parameter&gt;&nbsp; <br />
&lt;name&gt;password&lt;/name&gt;&nbsp; <br />
&lt;value&gt;manager&lt;/value&gt;&nbsp; <br />
&lt;/parameter&gt;&nbsp; <br />
&lt;parameter&gt;&nbsp; <br />
&lt;name&gt;driverClassName&lt;/name&gt;&nbsp; <br />
&lt;value&gt;oracle.jdbc.driver.OracleDriver&lt;/value&gt;&nbsp; <br />
&lt;/parameter&gt;&nbsp; <br />
&lt;parameter&gt;&nbsp; <br />
&lt;name&gt;url&lt;/name&gt;&nbsp; <br />
&lt;value&gt;jdbc:oracle:thin:@192.168.0.27:1521:titan&lt;/value&gt;&nbsp; <br />
&lt;/parameter&gt;&nbsp; <br />
&lt;/ResourceParams&gt;&nbsp; <br />
&lt;/Context&gt;</cc> <br />
<br />
在Tomcat&nbsp;5.5\conf\Catalina\localhost\xxxxx.xml(xxxxx.xml为你自己的web的配置xml文件)&nbsp;中添加resource <br />
<br />
&nbsp;&lt;Resource&nbsp;name="MYSQL" <br />
&nbsp;type="javax.sql.DataSource" <br />
&nbsp;driverClassName="com.mysql.jdbc.Driver" <br />
&nbsp;password="********" <br />
&nbsp;maxIdle="2" <br />
&nbsp;maxWait="5000" <br />
&nbsp;username="root" <br />
&nbsp;url="jdbc:mysql://localhost:3306/jnestore" <br />
&nbsp;maxActive="10"/&gt; <br />
<br />
以上是tomcat&nbsp;5.5版本的配置,5.5版本只有这样陪才有效果,以前的版本可以按照paramter的方法添加; <br />
<br />
Resource&nbsp;一定要包含在&lt;Context&nbsp;......&gt;&nbsp;&lt;/Context&gt;&nbsp;之间 <br />
<br />
或者在web应用程序的context.xml中设置数据源链接，如下：<br />
&nbsp;&nbsp;在&lt;Context&gt;&lt;/Context&gt;节点中加入，<br />
&nbsp;&nbsp;&lt;ResourceLink<br />
&nbsp;&nbsp;&nbsp;name="jdbc/DBPool"&nbsp;<br />
&nbsp;&nbsp;&nbsp;type="javax.sql.DataSource"&nbsp;<br />
&nbsp;&nbsp;&nbsp;global="jdbc/DBPool"/&gt;<br />
&nbsp;&nbsp;&nbsp;属性说明：name，同第2步和第3步的属性name值，和子节点res-ref-name值；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type，同样取&#8221;javax.sql.DataSource&#8221;；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global，同name值。<br />
<br />
在你的web的路近下,WEB-INF中找到web.xml,添加资源映射&nbsp; <br />
<br />
&nbsp;&lt;resource-ref&gt; <br />
&nbsp;&lt;description&gt;connection&lt;/description&gt; <br />
&nbsp;&lt;res-ref-name&gt;MYSQL&lt;/res-ref-name&gt; <br />
&nbsp;&lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt; <br />
&nbsp;&lt;res-auth&gt;Container&lt;/res-auth&gt; <br />
&nbsp;&lt;/resource-ref&gt; <br />
<br />
把mysql的jdbc驱动.jar包放到tomcat的common/lib下去,也可以放到WEB-INF/lib下, <br />
<br />
重新启动tomcat. <br />
<br />
就可以用Context&nbsp;ctx&nbsp;=&nbsp;new&nbsp;InitialContext(); <br />
<br />
DataSource&nbsp;ds&nbsp;=&nbsp;(DataSource)&nbsp;ctx.lookup("java:comp/env/MYSQL"); <br />
<br />
Connection&nbsp;con&nbsp;=&nbsp;ds.getConnection();&nbsp;来连接数据库连接池</cc> 
<img src ="http://www.blogjava.net/youngsun/aggbug/208454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youngsun/" target="_blank">Hiro</a> 2008-06-16 23:15 <a href="http://www.blogjava.net/youngsun/articles/208454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Decorator装饰模式</title><link>http://www.blogjava.net/youngsun/articles/208156.html</link><dc:creator>Hiro</dc:creator><author>Hiro</author><pubDate>Sun, 15 Jun 2008 13:13:00 GMT</pubDate><guid>http://www.blogjava.net/youngsun/articles/208156.html</guid><wfw:comment>http://www.blogjava.net/youngsun/comments/208156.html</wfw:comment><comments>http://www.blogjava.net/youngsun/articles/208156.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youngsun/comments/commentRss/208156.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youngsun/services/trackbacks/208156.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Decorator装饰模式是一种结构型模式，它主要是解决：&#8220;过度地使用了继承来扩展对象的功能&#8221;，由于继承为类型引入的静态特质，使得这种扩展方式缺乏灵活性；并且随着子类的增多（扩展功能的增多），各种子类的组合（扩展功能的组合）会导致更多子类的膨胀（多继承）。继承为类型引入的静态特质的意思是说以继承的方式使某一类型要获得功能是在编译时。所谓静态，是指在编译时；动态，是指在运行时...&nbsp;&nbsp;<a href='http://www.blogjava.net/youngsun/articles/208156.html'>阅读全文</a><img src ="http://www.blogjava.net/youngsun/aggbug/208156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youngsun/" target="_blank">Hiro</a> 2008-06-15 21:13 <a href="http://www.blogjava.net/youngsun/articles/208156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Composite组合模式</title><link>http://www.blogjava.net/youngsun/articles/208155.html</link><dc:creator>Hiro</dc:creator><author>Hiro</author><pubDate>Sun, 15 Jun 2008 13:12:00 GMT</pubDate><guid>http://www.blogjava.net/youngsun/articles/208155.html</guid><wfw:comment>http://www.blogjava.net/youngsun/comments/208155.html</wfw:comment><comments>http://www.blogjava.net/youngsun/articles/208155.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youngsun/comments/commentRss/208155.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youngsun/services/trackbacks/208155.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; Composite<span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">组合模式主要是应对这样的问题：一类具有&#8220;容器特征&#8221;的对象——即他们在充当对象的同时，又是其他对象的容器的情况。在编写时我们常常会造成：客户代码过多地依赖于对象容器复杂的内部实现，对象容器内部实现结构（而非抽象接口）的变化将引起客户代码的频繁变化，带来了代码的维护性、扩展性的弊端。</span>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>GoF</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">《设计模式》中说到：将对象组合成树形结构以表示&#8220;部分</span><span lang="EN-US">-</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">整体&#8221;的层次结构。</span><span lang="EN-US">Composite</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">模式使得客户对单个对象和组合对象的使用具有一致性。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Composite</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">组合模式结构如下：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: center" align="center"><span lang="EN-US"><V:SHAPETYPE id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><V:STROKE joinstyle="miter"></V:STROKE><V:FORMULAS><V:F eqn="if lineDrawn pixelLineWidth 0"></V:F><V:F eqn="sum @0 1 0"></V:F><V:F eqn="sum 0 0 @1"></V:F><V:F eqn="prod @2 1 2"></V:F><V:F eqn="prod @3 21600 pixelWidth"></V:F><V:F eqn="prod @3 21600 pixelHeight"></V:F><V:F eqn="sum @0 0 1"></V:F><V:F eqn="prod @6 1 2"></V:F><V:F eqn="prod @7 21600 pixelWidth"></V:F><V:F eqn="sum @8 21600 0"></V:F><V:F eqn="prod @7 21600 pixelHeight"></V:F><V:F eqn="sum @10 21600 0"></V:F></V:FORMULAS><V:PATH o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></V:PATH><O:LOCK aspectratio="t" v:ext="edit"></O:LOCK></V:SHAPETYPE></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt" align="left"><span lang="EN-US"><span style="mso-tab-count: 1"><img height="262" alt="" src="http://www.cnblogs.com/images/cnblogs_com/kid-li/Composite.jpg" width="361" border="0" /><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">说道这，我觉得有一个编程中常见的场景，就是对于树的实现，很符合这个模式。下面我就用这个例子作一下。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">首先，我们先分析对于一棵树所包含的部分，树干、树枝、树叶，其中树干可以看成一个树枝（就是粗了点）。那么我们就应该有两种类实现</span><span lang="EN-US">Leaf</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">（树叶）和</span><span lang="EN-US">Limb</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">（树枝）。对于叶子节点和枝节点的不同在于枝节点有子树，而叶子节点没有子树。为了使单个对象和组合对象的使用具有一致性，我可以将叶子节点想象成没有子树的枝节点。这样我就可以得到一个抽象类，代码如下：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="color: blue; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">public</span><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"> <span style="color: blue">abstract</span> <span style="color: blue">class</span> AbstractClass<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">string</span> name;<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> ArrayList list;<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">abstract</span> <span style="color: blue">void</span> Add(AbstractClass item);<span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: green">//</span></span><span style="color: green; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">增加一个子节点<span lang="EN-US"><O:P></O:P></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">abstract</span> <span style="color: blue">void</span> Remove(AbstractClass item);<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span><span style="color: green">//</span></span><span style="color: green; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">去掉一个子节点<span lang="EN-US"><O:P></O:P></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">abstract</span> <span style="color: blue">string</span> Print();<span style="mso-tab-count: 6">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: green">//</span></span><span style="color: green; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">打印当前节点<span lang="EN-US"><O:P></O:P></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>}</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">然后，我在对叶子节点和枝节点作不同的实现：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">枝节点：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="color: blue; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">public</span><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"> <span style="color: blue">class</span> Limb:AbstractClass<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> Limb()<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>list = <span style="color: blue">new</span> ArrayList();<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><O:P>&nbsp;</O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">void</span> Add(AbstractClass item)<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>list.Add(item);<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><O:P>&nbsp;</O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">void</span> Remove(AbstractClass item)<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">if</span>(list.Contains(item))<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>list.Remove(item);<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">string</span> Print()<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Console.Write(name + <span style="color: purple">"\n"</span>);<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">if</span>(list.Count != 0)<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">for</span>(<span style="color: blue">int</span> i = 0;i&lt;list.Count;i++)<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 5">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Console.Write(<span style="color: purple">"(Parent is "</span> + name + <span style="color: purple">")"</span>);<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 5">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>((AbstractClass)list[i]).Print();<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">return</span> name;<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><O:P>&nbsp;</O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">叶子节点：<span lang="EN-US"><O:P></O:P></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">class</span> Leaf:AbstractClass<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> Leaf()<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>list = <span style="color: blue">null</span>;<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><O:P>&nbsp;</O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">void</span> Add(AbstractClass item)<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><O:P>&nbsp;</O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">void</span> Remove(AbstractClass item)<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">string</span> Print()<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Console.Write(name + <span style="color: purple">","</span>);<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">return</span> <span style="color: blue">this</span>.name;<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">对于叶子节点来说，不需要子节点，当然也就不需要添加和删除子节点的方法。<span lang="EN-US"><O:P></O:P></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">好，接下来，我们可以在客户程序中组建一棵树，来测试一下：<span lang="EN-US"><O:P></O:P></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">static</span> <span style="color: blue">void</span> <ST1:PLACE w:st="on">Main</ST1:PLACE>(<span style="color: blue">string</span>[] args)<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>AbstractClass Tree = <span style="color: blue">new</span> Limb();<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>GetTree(Tree);<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>PrintTree(Tree);<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Console.Read();<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><O:P>&nbsp;</O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: blue">void</span> GetTree(AbstractClass Tree)<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Tree.name = <span style="color: purple">"1"</span>;<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>AbstractClass leaf2 = <span style="color: blue">new</span> Leaf();<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>leaf2.name = <span style="color: purple">"2"</span>;<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Tree.Add(leaf2);<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>AbstractClass limb3 = <span style="color: blue">new</span> Limb();<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>limb3.name = <span style="color: purple">"3"</span>;<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Tree.Add(limb3);<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>AbstractClass leaf4 = <span style="color: blue">new</span> Leaf();<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>leaf4.name = <span style="color: purple">"4"</span>;<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>limb3.Add(leaf4);<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>AbstractClass leaf5 = <span style="color: blue">new</span> Leaf();<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>leaf5.name = <span style="color: purple">"5"</span>;<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>limb3.Add(leaf5);<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><O:P>&nbsp;</O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">static</span> <span style="color: blue">void</span> PrintTree(AbstractClass Tree)<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Tree.Print();<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">输出结果如下：<span lang="EN-US"><O:P></O:P></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">1<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">(Parent is 1)2,(Parent is 1)3<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">(Parent is 3)4,(Parent is 3)5,<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">在组织这个树时，的确能感觉到</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt">GoF</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-size: 10.5pt">《设计模式》中的那句话：</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">单个对象和组合对象的使用具有一致性。当然也的确感觉到一点矛盾：对于叶子节点来说，不需要</span><span lang="EN-US">ArrayList</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">和</span><span lang="EN-US">Add</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">（）</span><span lang="EN-US">Remove</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">（）应该不继承才对，当然如果在代码执行性能可以达到要求的情况下，简化一下编码实现复杂度也是挺好的一件事。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">最后在来说说</span><span lang="EN-US">Composite</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">组合模式的几个要点：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>1</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">、</span><span lang="EN-US">Composite</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">模式采用树形结构来实现普遍存在的对象容器，从而将&#8220;一对多&#8221;的关系转化为&#8220;一对一&#8221;的关系，使得客户代码可以一致的处理对象和对象容器，无需关心处理的是单个对象，还是组合的对象容器。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span lang="EN-US">2</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">、将&#8220;客户代码与复杂的对象容器结构&#8221;解耦是</span><span lang="EN-US">Composite</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">模式的核心思想，解耦之后，客户代码将与纯粹的对象接口——而非对象容器的复杂内部实现结构——发生依赖关系，从而更能&#8220;应对变化&#8221;。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span lang="EN-US">3</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">、</span><span lang="EN-US">Composite</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">模式中，是将&#8220;</span><span lang="EN-US">Add</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">和</span><span lang="EN-US">Remove</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的和对象容器相关的方法&#8221;定义在&#8220;表示抽象对象的</span><span lang="EN-US">Component</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">类&#8221;中，还是将其定义在&#8220;表示对象容器的</span><span lang="EN-US">Composite</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">类&#8221;中，是一个关乎&#8220;透明性&#8221;和&#8220;安全性&#8221;的两难问题，需要仔细权衡结构，这又是必须付出的代价。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span lang="EN-US">4</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">、</span><span lang="EN-US">Composite</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">模式在具体实现中，可以让父对象中的字对象反向追溯：如果父对象有频繁的遍历需求，可使用缓存技巧来改善效率</span></p>
Composite组合模式 
<img src ="http://www.blogjava.net/youngsun/aggbug/208155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youngsun/" target="_blank">Hiro</a> 2008-06-15 21:12 <a href="http://www.blogjava.net/youngsun/articles/208155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Bridge桥接模式</title><link>http://www.blogjava.net/youngsun/articles/208154.html</link><dc:creator>Hiro</dc:creator><author>Hiro</author><pubDate>Sun, 15 Jun 2008 13:11:00 GMT</pubDate><guid>http://www.blogjava.net/youngsun/articles/208154.html</guid><wfw:comment>http://www.blogjava.net/youngsun/comments/208154.html</wfw:comment><comments>http://www.blogjava.net/youngsun/articles/208154.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youngsun/comments/commentRss/208154.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youngsun/services/trackbacks/208154.html</trackback:ping><description><![CDATA[&nbsp;Bridge<span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">桥接模式是一种结构型模式，它主要应对的是：由于类型的固有罗辑，使得类型具有两个或两个以上的纬度变化。也就是要求抽象不应依赖于实现细节，实现细节应依赖于抽象。</span>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">《设计模式》中说到将抽象部分与实现部分分离，使他们可以独立的变化。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">举个例子更清楚些，好像我们平时玩的游戏中有</span><span lang="EN-US">PS</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">版的，但是不是大家都有</span><span lang="EN-US">PS</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">。这时我们等一段时间，一般会出</span><span lang="EN-US">PC</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">版的或其他版本。由于支持游戏的平台不一样，但是如果我们编写的游戏程序为了适应另一种平台就要全部重新编写的话岂不是很麻烦。再加上游戏本身的变动，一句众人皆知的话：&#8220;死定了</span><span lang="EN-US">&#8221;</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">现在我们来看看</span><span lang="EN-US">Bridge</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">桥接模式，看看它是如何解决类似问题的，首先我们看看</span><span lang="EN-US">Bridge</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">模式的结构。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US"><V:SHAPETYPE id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><V:STROKE joinstyle="miter"></V:STROKE><V:FORMULAS><V:F eqn="if lineDrawn pixelLineWidth 0"></V:F><V:F eqn="sum @0 1 0"></V:F><V:F eqn="sum 0 0 @1"></V:F><V:F eqn="prod @2 1 2"></V:F><V:F eqn="prod @3 21600 pixelWidth"></V:F><V:F eqn="prod @3 21600 pixelHeight"></V:F><V:F eqn="sum @0 0 1"></V:F><V:F eqn="prod @6 1 2"></V:F><V:F eqn="prod @7 21600 pixelWidth"></V:F><V:F eqn="sum @8 21600 0"></V:F><V:F eqn="prod @7 21600 pixelHeight"></V:F><V:F eqn="sum @10 21600 0"></V:F></V:FORMULAS><V:PATH o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></V:PATH><O:LOCK aspectratio="t" v:ext="edit"></O:LOCK></V:SHAPETYPE></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1"><img height="185" alt="" src="http://www.cnblogs.com/images/cnblogs_com/kid-li/Bridge1.jpg" width="553" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">实际上，我们要做到的是把变化的部分提出，对其抽象，使变化独立。那我们如何做呢？通过组合的方式将变化独立出去。将一个事物中的多个纬度变化分离。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">下面举一个场景来理解一下，还是用汽车举例，我现在要一辆车（</span><span lang="EN-US">BMW</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">或</span><span lang="EN-US">BORA</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">）在路（</span><span lang="EN-US">WaterRoad</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">或</span><span lang="EN-US">Cement</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">）上跑。现在有两个纬度的变化点：汽车和路。也就是上图中的</span><span lang="EN-US">AbstractChangePoint1</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">和</span><span lang="EN-US">AbstractChangePoint2</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">。</span><span lang="EN-US">AbstractChangePoint1</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">中包含有</span><span lang="EN-US">AbstractChangePoint2</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">对象成员。。代码实现如下：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="color: blue; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">abstract</span><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"> <span style="color: blue">class</span> <span style="color: teal">AbstractCar<O:P></O:P></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: teal">AbstractRoad</span> road;<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><O:P>&nbsp;</O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> AbstractCar(<span style="color: teal">AbstractRoad</span> road)<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">this</span>.road = road;<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><O:P>&nbsp;</O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">abstract</span> <span style="color: blue">string</span> Run();<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">abstract</span> <span style="color: blue">string</span> Stop();<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><O:P>&nbsp;</O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="color: blue">abstract</span> <span style="color: blue">class</span> <span style="color: teal">AbstractRoad<O:P></O:P></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">abstract</span> <span style="color: blue">string</span> GetRoadType();<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">以汽车为变化中心，用组装的方式将两个变化点结合起来。使路的变化和汽车隔离。下面来编写路的实现。<span lang="EN-US"><O:P></O:P></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="color: blue; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">class</span><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"> <span style="color: teal">WaterRoad</span>:<span style="color: teal">AbstractRoad<O:P></O:P></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">string</span> GetRoadType()<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">return</span> <span style="color: maroon">"It is WaterRoad"</span>;<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;</span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="color: blue; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">class</span><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"> <span style="color: teal">CementRoad</span>:<span style="color: teal">AbstractRoad<O:P></O:P></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">string</span> GetRoadType()<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">return</span> <span style="color: maroon">"It is Cement"</span>;<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">然后再来编写汽车的实现<span lang="EN-US"><O:P></O:P></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="color: blue; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">class</span><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"> <span style="color: teal">BMWCar</span>:<span style="color: teal">AbstractCar<O:P></O:P></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> BMWCar(<span style="color: teal">AbstractRoad</span> road)<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>: <span style="color: blue">base</span>(road)<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><O:P>&nbsp;</O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">string</span> Run()<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">return</span> <span style="color: maroon">"BMW is running"</span>;<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><O:P>&nbsp;</O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">string</span> Stop()<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">return</span> <span style="color: maroon">"BMW is stopped"</span>;<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;</span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="color: blue; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">class</span><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"> <span style="color: teal">BROACar</span>:<span style="color: teal">AbstractCar<O:P></O:P></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> BROACar(<span style="color: teal">AbstractRoad</span> road)<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>: <span style="color: blue">base</span>(road)<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><O:P>&nbsp;</O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">string</span> Run()<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">return</span> <span style="color: maroon">"BROA is running"</span>;<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><O:P>&nbsp;</O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">public</span> <span style="color: blue">override</span> <span style="color: blue">string</span> Stop()<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">return</span> <span style="color: maroon">"BROA is stopped"</span>;<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">然后我们在客户代码中调用这些类，首先，我想要这个场景是<span lang="EN-US">BMW</span>在<span lang="EN-US">WaterRoad</span>上跑，客户端代码如下：<span lang="EN-US"><O:P></O:P></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="color: blue; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">static</span><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"> <span style="color: blue">void</span> <ST1:PLACE w:st="on">Main</ST1:PLACE>(<span style="color: blue">string</span>[] args)<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: teal">AbstractCar</span> car = <span style="color: blue">new</span> <span style="color: teal">BMWCar</span>(<span style="color: blue">new</span> <span style="color: teal">WaterRoad</span>());<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: teal">Console</span>.WriteLine(car.road.GetRoadType());<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: teal">Console</span>.WriteLine(car.Run());<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: teal">Console</span>.WriteLine(car.Stop());<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: teal">Console</span>.Read();<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">实现结果如下：<span lang="EN-US"><O:P></O:P></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">It is WaterRoad<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">BMW is running<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">BMW is stopped<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">如果我现在要一辆<span lang="EN-US">BORA</span>在<span lang="EN-US">Cement</span>上跑，我们只要稍微修改一下<span lang="EN-US">car</span>的实例化就可以，代码如下：<span lang="EN-US"><O:P></O:P></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: 10.5pt; text-align: left; mso-layout-grid-align: none; mso-para-margin-left: 2.0gd; mso-char-indent-count: 1.0" align="left"><span lang="EN-US" style="color: blue; font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">static</span><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"> <span style="color: blue">void</span> <ST1:PLACE w:st="on">Main</ST1:PLACE>(<span style="color: blue">string</span>[] args)<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: teal">AbstractCar</span> car = <span style="color: blue">new</span> <span style="color: teal">BROACar</span>(<span style="color: blue">new</span> <span style="color: teal">CementRoad</span>());<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: teal">Console</span>.WriteLine(car.road.GetRoadType());<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: teal">Console</span>.WriteLine(car.Run());<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: teal">Console</span>.WriteLine(car.Stop());<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: teal">Console</span>.Read();<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span>}<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">实现结果如下：<span lang="EN-US"><O:P></O:P></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">It is Cement<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">BROA is running<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 18pt"><span lang="EN-US" style="font-family: 新宋体; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-no-proof: yes">BROA is stopped<O:P></O:P></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">最后我们再来说说</span><span lang="EN-US">Bridge</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">模式的要点：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span lang="EN-US"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>1</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">、</span><span lang="EN-US">Bridge</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">模式使用&#8220;对象间的组合关系&#8221;解耦了抽象和实现之间固有的绑定关系，使得抽象和实现可以沿着各自的纬度来变化。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span lang="EN-US">2</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">、所谓抽象和实现沿着各自纬度的变化，即&#8220;子类化&#8221;它们，得到各个子类之后，便可以任意组合它们。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span lang="EN-US">3</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">、</span><span lang="EN-US">Bridge</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">模式有时候类似于多继承方案，但是多继承方案往往违背单一职责原则（即一个类只有一个变化的原因），复用性比较差。</span><span lang="EN-US">Bridge</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">模式是比多继承方案更好的解决方法。</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span lang="EN-US">4</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">、</span><span lang="EN-US">Bridge</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">模式的应用一般在&#8220;两个非常强的变化纬度&#8221;，有时候即使有两个变化的纬度，但是某个方向的变化纬度并不剧烈——换言之两个变化不会导致纵横交错的结果，并不一定要使用</span><span lang="EN-US">Bridge</span><span style="font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">模式。</span></p>
<img src ="http://www.blogjava.net/youngsun/aggbug/208154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youngsun/" target="_blank">Hiro</a> 2008-06-15 21:11 <a href="http://www.blogjava.net/youngsun/articles/208154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Adapter适配器模式</title><link>http://www.blogjava.net/youngsun/articles/208153.html</link><dc:creator>Hiro</dc:creator><author>Hiro</author><pubDate>Sun, 15 Jun 2008 13:10:00 GMT</pubDate><guid>http://www.blogjava.net/youngsun/articles/208153.html</guid><wfw:comment>http://www.blogjava.net/youngsun/comments/208153.html</wfw:comment><comments>http://www.blogjava.net/youngsun/articles/208153.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/youngsun/comments/commentRss/208153.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/youngsun/services/trackbacks/208153.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;Adapter适配器模式是一种结构型模式，主要应对：由于应用环境的变化，常常需要将&#8220;一些现存的对象&#8221;放在新的环境中应用，但是，新环境要求的接口是现存对象所不满足的。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 《设计模式》中说道：将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的类可...&nbsp;&nbsp;<a href='http://www.blogjava.net/youngsun/articles/208153.html'>阅读全文</a><img src ="http://www.blogjava.net/youngsun/aggbug/208153.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/youngsun/" target="_blank">Hiro</a> 2008-06-15 21:10 <a href="http://www.blogjava.net/youngsun/articles/208153.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>