﻿<?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-lyl3333489</title><link>http://www.blogjava.net/lyl3333489/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 21 Apr 2026 17:38:57 GMT</lastBuildDate><pubDate>Tue, 21 Apr 2026 17:38:57 GMT</pubDate><ttl>60</ttl><item><title>骑警</title><link>http://www.blogjava.net/lyl3333489/archive/2007/07/20/131532.html</link><dc:creator>AAAAA</dc:creator><author>AAAAA</author><pubDate>Fri, 20 Jul 2007 09:28:00 GMT</pubDate><guid>http://www.blogjava.net/lyl3333489/archive/2007/07/20/131532.html</guid><wfw:comment>http://www.blogjava.net/lyl3333489/comments/131532.html</wfw:comment><comments>http://www.blogjava.net/lyl3333489/archive/2007/07/20/131532.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lyl3333489/comments/commentRss/131532.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lyl3333489/services/trackbacks/131532.html</trackback:ping><description><![CDATA[<img src="http://www.blogjava.net/images/blogjava_net/lyl3333489/1182662588047_1182662588047_r.jpg" border=0> <img src ="http://www.blogjava.net/lyl3333489/aggbug/131532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lyl3333489/" target="_blank">AAAAA</a> 2007-07-20 17:28 <a href="http://www.blogjava.net/lyl3333489/archive/2007/07/20/131532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>观察者模式</title><link>http://www.blogjava.net/lyl3333489/archive/2007/07/10/129272.html</link><dc:creator>AAAAA</dc:creator><author>AAAAA</author><pubDate>Tue, 10 Jul 2007 02:36:00 GMT</pubDate><guid>http://www.blogjava.net/lyl3333489/archive/2007/07/10/129272.html</guid><wfw:comment>http://www.blogjava.net/lyl3333489/comments/129272.html</wfw:comment><comments>http://www.blogjava.net/lyl3333489/archive/2007/07/10/129272.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lyl3333489/comments/commentRss/129272.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lyl3333489/services/trackbacks/129272.html</trackback:ping><description><![CDATA[<span style="COLOR: #049a0e">
<div class=posttitle><a class=singleposttitle id=viewpost1_TitleUrl href="http://www.blogjava.net/uhlanxie/archive/2007/07/10/129170.html"><u><font color=#333333>Refactoring To Patterns： 观察者模式</font></u></a> </div>
<span style="FONT-SIZE: 12pt; COLOR: #080000">&nbsp;&nbsp;&nbsp;<span style="COLOR: #1600b0"> 常听说这么一句话(大意是这样)：不必可以去套用设计模式，如果按照面向对象的基本原则编程，自然是优雅的设计，即使没有刻意使用模式，设计也会近乎于模式。开始感觉有一点玄，但在看了《</span></span><span style="COLOR: #1600b0">C#设计模式纵横谈》视频后，觉得有所收获</span><span style="FONT-SIZE: 12pt; COLOR: #1600b0">。下面，就参考</span><span style="COLOR: #1600b0">视频</span><span style="FONT-SIZE: 12pt; COLOR: #1d06c0"><span style="COLOR: #080000"><span style="COLOR: #1600b0">的内容，尝试着写这么一个过程：根据面向对象的一般原则对设计进行重构，逐渐演化出观察者模式。</span><br style="COLOR: #1600b0"><span style="COLOR: #1600b0">涉及的面向对象设计原则：<span style="COLOR: #049a0e">单一职责原则、封装变化、面向接口编程、依赖倒置原则、开闭原则。</span></span><br style="COLOR: #1600b0"><br><span style="COLOR: #1600b0">1.发布订阅模型： </span></span><br><br><img height=294 alt="" src="http://www.blogjava.net/images/blogjava_net/uhlanxie/ObModel.JPG" width=333><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; <br>假如有需求如下:<br><br>银行需要把帐户的如汇款、转账或取款等操作通知用户，途径包括手机短信、 email等。如图所式。<br><br>自然地，我们可以这样做：<br><br>
<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%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by
Actipro CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008080"></span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;ATM<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BankAccount&nbsp;bankAccount;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;process()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #000000">bankAccount...</span><br><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.sendEmail(userEmail);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.sendPhone(phoneNumber);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;sendEmail(String&nbsp;userEmail)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//<br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;sendMobile(String&nbsp;phoneNumber)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//<br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;}</span> <span style="COLOR: #000000"></span></div>
<br>ATM机的 process()方法在处理完业务逻辑后，由email和phone通知用户。<br><br><span style="COLOR: #1600b0">2.初步重构</span><br><br>好像有bad smells，恩，根据<span style="COLOR: #049a0e">单一职责原则</span>。新增Email类和Phone类，并把相关业务逻辑改到BankAccount类完成。于是我们的代码可以这样：<br><br>
<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%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by
Actipro CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;ATM<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;BankAccount&nbsp;bankAccount;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;process()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/dot.gif"></span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bankAccount.withDraw();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;<br>&nbsp;}<br><br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;BankAccount&nbsp;<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;Email&nbsp;email;<br>&nbsp;&nbsp;&nbsp;&nbsp;Mobile&nbsp;mobile;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;withDraw()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/Images/dot.gif"></span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;email.sendEmail(userEmail);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mobile.sendMobile(phoneNumber);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Email<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;sendEmail(String&nbsp;userEmail)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Mobile<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;sendMobile(String&nbsp;phoneNumber)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</span> <span style="COLOR: #000000"></span></div>
<br>下面是代码的UML图：<br><br><img height=274 alt="" src="http://www.blogjava.net/images/blogjava_net/uhlanxie/initMap.JPG" width=332><br><br><br><span style="COLOR: #1600b0">3.拥抱变化</span><br><br>这个解决方案有问题吗?可能没有问题。它实现了我们的需求：在帐户有操作变动的时候，通知Email和Mobile去发送信息给用户。但这样设计就足够了吗？可能足够了，可能还不够。<br>考虑如下两种情况：<br>1.在很长一段时间里，订阅方式很稳定，比如系统只通过邮件和手机短信进行信息订阅，那么这个实现没有太大问题；<br>2.在近一两年或更短的时间，更多的订阅方式将会源源不断地被加进来：比如可以登录官方网站等等，那这个实现就有问题：再看一下我们的UML图，类BankAccount依赖于Email和Mobile类！就是说，如果需要添加新的订阅方式ATM类的process()方法势必要重新设计！<br><br>于是我们的BankAccount类不得不变成：<br><br>
<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%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by
Actipro CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;&nbsp;BankAccount<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;Email&nbsp;email;<br>&nbsp;&nbsp;&nbsp;&nbsp;Mobile&nbsp;mobile;<br>&nbsp;&nbsp;&nbsp;&nbsp;Web&nbsp;web;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;withDraw()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//<br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;email.sendEmail(userEmail);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mobile.sendMobile(phoneNumber);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;web.sendWeb(webSite);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;<br>&nbsp;}</span></div>
<br>如果还有另一种方式，那么process()方法就又会需要加入：otherSubscribe.send...();等方法，另外如果订阅类的接口(这里指sendEmail等方法)发生变化，BankAccount的withDraw()方法也必须有相应的变化！这当然是种灾难。我们必须改变这种情况。<br>先解决遗留问题：第一种情况：订阅方式相对稳定的情况下呢？不改动会产生灾难吗？<br>个人认为：不会。比如某个系统信息只通过手机短信订阅，那就没有必要太在意这个问题。考虑周全一点不好吗，如果将来有类似需求呢？小心<span style="COLOR: red">过度设计</span>！为了将来可能出现需求而进行的预先设计并不太好。有需求，才有设计。<br><br>现在来看解决之道：<br><br>运用面向对象的思想，抽象出问题所在。BankAccount类依赖于 Email类和Mobile类，而Email和Mobile是具体的类，<span style="COLOR: red">ATM依赖于具体的类</span>了，而且还不止一个！回忆一下<span style="COLOR: #2000ff"><span style="COLOR: #049a0e">依赖倒置原则：具体应该依赖于抽象，底层模式应该依赖于高层模式</span>。</span>那怎么实现<span style="COLOR: #049a0e">依赖倒置原则</span>呢?面向对象编程中有一条总的原则：<span style="COLOR: #049a0e">封装变化</span>。如何实现<span style="COLOR: #049a0e">封装变化</span>？需要我们这样：<span style="COLOR: red"><span style="COLOR: #2000ff"><span style="COLOR: #049a0e">面向接口编程</span>。</span><br><br><span style="COLOR: #008420">回顾一下：我们在设计中实现类依赖了具体的类，违反了依赖倒置原则。为了遵循依赖倒置原则，我们采用面向接口编程的方法，从而实现了面向对象的一条总的原则：封装变化。</span></span><span style="COLOR: red"></span><br><span style="COLOR: red"><br><span style="COLOR: #1600b0">看代码：</span><br><br>
<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%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by
Actipro CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">interface</span><span style="COLOR: #000000">&nbsp;AccountObserver<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;upDate(UserAccount&nbsp;userAccount);<br>}<br><br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Email implements AccountObserver<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;upDate(UserAccount&nbsp;userAccount)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Mobile<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;upDate(UserAccount&nbsp;userAccount)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;BankAccount&nbsp;<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">AccountObserver</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;observer&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ArrayList</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">AccountObserver</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;withDraw()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//<br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(AccountObserver&nbsp;ao&nbsp;:&nbsp;observer)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ao.upDate(userAccount)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;addOberver(AccountObserver&nbsp;accountObserver)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;observer.add(accountObserver);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span></div>
<br></span>UML图：<br><br><img alt="" src="http://www.blogjava.net/images/blogjava_net/uhlanxie/downToUpu.JPG"> <br><br>现在，BankAccount依赖于interface AccountObserver。Email和Mobile实现AccountObserver接口。<span style="COLOR: #049a0e">通过遵循面向接口编程</span>遵循了<span style="COLOR: #049a0e">依赖倒置原则</span><span style="COLOR: red"><span style="COLOR: #049a0e">。</span><br><br></span><span style="COLOR: #1600b0">4.开闭原则</span><br><br>终于修改好了，我们解决了订阅者变化的问题。但如果发布者也倾向于变化呢？这就牵涉到面向对象里的另一个原则：<span style="COLOR: #049a0e">开闭原则</span>。<span style="COLOR: #049a0e">即：对扩展开放，对修改关闭。</span>具体怎么做呢？通过抽象类，从抽象类继承具体类。<br>看最终的代码(只写几个关键的方法，全貌可看最后的UML图)：<br><br>订阅： <br><br>
<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%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by
Actipro CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">interface</span><span style="COLOR: #000000">&nbsp;AccountObserver<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;upDate(UserAccount&nbsp;userAccount);<br>}<br><br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Email&nbsp;</span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000">&nbsp;AccountObserver<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;upDate(UserAccount&nbsp;userAccount)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Mobile&nbsp;</span><span style="COLOR: #0000ff">implements</span><span style="COLOR: #000000">&nbsp;AccountObserver<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;upDate(UserAccount&nbsp;userAccount)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}</span></div>
<br><br>发布：<br><br>
<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%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by
Actipro CodeHighlighter
(freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #0000ff"></span><span style="COLOR: #0000ff"></span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">abstract</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Subject<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">AccountObserver</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;observer&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ArrayList</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">AccountObserver</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;withDraw()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//<br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notify();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;notify(UserAccount&nbsp;userAccount)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(AccountObserver&nbsp;ao&nbsp;:&nbsp;observer)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ao.upDate(userAccount)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;addOberver(AccountObserver&nbsp;accountObserver)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;observer.add(accountObserver);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;deleteOberver(AccountObserver&nbsp;accountObserver)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;observer.remove(accountObserver);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>}<br><br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;BankAccount&nbsp;</span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000">&nbsp;Subject<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;withDraw()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//<br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(AccountObserver&nbsp;ao&nbsp;:&nbsp;observer)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ao.upDate(userAccount)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>}</span><br><span style="COLOR: #0000ff"></span><br><span style="COLOR: #000000"></span></div>
<br>看UML图：<br><br><img alt="" src="http://www.blogjava.net/images/blogjava_net/uhlanxie/openClosePrincipleu.JPG"><br><br><br><span style="COLOR: #1600b0">5.观察者模式概况</span><br style="COLOR: #1600b0"><br><br><img alt="" src="http://www.blogjava.net/images/blogjava_net/uhlanxie/Observer.JPG"> <br><br>这就是观察者模式了，对比一下官方的UML图，是不是一目了然了呢？<br>稍作说明(这里的依赖都是指广义的依赖)：<br>1.被观察者ConcreteSubject继承自Subject抽象类；<br>2.Subject抽象类依赖于观察者Observer抽象接口；<br>3.观察者ConcreteObserver实现Observer 接口；<br>4.观察者ConcreteObserver间接依赖于ConcreteSubject类。<br>如果要增加具体的观察者，只要再实现Obsever接口即可，而被观察方不需要做任何修改。而如果需要修改被观察者，只要从Subject抽象类继承即可。<br></span></span>
<img src ="http://www.blogjava.net/lyl3333489/aggbug/129272.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lyl3333489/" target="_blank">AAAAA</a> 2007-07-10 10:36 <a href="http://www.blogjava.net/lyl3333489/archive/2007/07/10/129272.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>收集的网址</title><link>http://www.blogjava.net/lyl3333489/archive/2007/07/10/129206.html</link><dc:creator>AAAAA</dc:creator><author>AAAAA</author><pubDate>Tue, 10 Jul 2007 01:05:00 GMT</pubDate><guid>http://www.blogjava.net/lyl3333489/archive/2007/07/10/129206.html</guid><wfw:comment>http://www.blogjava.net/lyl3333489/comments/129206.html</wfw:comment><comments>http://www.blogjava.net/lyl3333489/archive/2007/07/10/129206.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lyl3333489/comments/commentRss/129206.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lyl3333489/services/trackbacks/129206.html</trackback:ping><description><![CDATA[<p><a href="http://www.linuxfans.org/">http://www.linuxfans.org</a>&nbsp;&nbsp;&nbsp;<br><a href="http://www.otasuke.ne.jp/modules/xwords/index.php">http://www.otasuke.ne.jp/modules/xwords/index.php</a>&nbsp;&nbsp;&nbsp;<br><a href="http://jp.hjenglish.com/papers.aspx">http://jp.hjenglish.com/papers.aspx</a>&nbsp;&nbsp;&nbsp;<br><a href="http://www.21cnhr.gov.cn/">www.21cnhr.gov.cn</a>&nbsp;&nbsp;&nbsp;<br><a href="http://www.ytv.co.jp/conan/">http://www.ytv.co.jp/conan/</a>&nbsp;&nbsp;&nbsp;<br><a href="http://www13.tianya.cn/new/Publicforum/Content.asp?idWriter=3915484&amp;Key=228823315&amp;strItem=no04&amp;idArticle=483393&amp;flag=1">http://www13.tianya.cn/new/Publicforum/Content.asp?idWriter=3915484&amp;Key=228823315&amp;strItem=no04&amp;idArticle=483393&amp;flag=1</a>&nbsp;&nbsp;&nbsp;<br><a href="http://piano.stedu.net/">http://piano.stedu.net/</a>&nbsp;&nbsp;&nbsp;<br><a href="http://www.nhk.or.jp/">http://www.nhk.or.jp/</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;&lt;NHK&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.nhk.or.jp/r-news/">http://www.nhk.or.jp/r-news/</a>&nbsp;&nbsp;&nbsp;<br><a href="http://www.intel.com/software/cn/mcwebcast/#slide=1">http://www.intel.com/software/cn/mcwebcast/#slide=1</a>&nbsp;&nbsp;&nbsp; intel class&nbsp;&nbsp;&nbsp;<br><a href="http://www.yangmi.net/ky/Print.asp?ArticleID=13801">http://www.yangmi.net/ky/Print.asp?ArticleID=13801</a>&nbsp;&nbsp; ！！！&nbsp;&nbsp;&nbsp;<br><a href="http://bbs.i18.cn/index.asp">http://bbs.i18.cn/index.asp</a>&nbsp;&nbsp;&nbsp;&nbsp; 中国零售网&nbsp;&nbsp;&nbsp;<br><a href="http://www.fortunespace.net/forum/">http://www.fortunespace.net/forum/</a>&nbsp;&nbsp;&nbsp; 中国財富論壇&nbsp;&nbsp;&nbsp;<br><a href="http://www.yesky.com/SoftChannel/72357786515668992/20040129/1764106.shtml">http://www.yesky.com/SoftChannel/72357786515668992/20040129/1764106.shtml</a>&nbsp; 求和&nbsp;&nbsp;&nbsp;<br><a href="http://www.yesky.com/SoftChannel/72348968914255872/20050126/1905902.shtml">http://www.yesky.com/SoftChannel/72348968914255872/20050126/1905902.shtml</a> Excel ?用&nbsp;&nbsp;&nbsp;<br><a href="http://www.yesky.com/soft/office/excel-news/his/his_4.shtml">http://www.yesky.com/soft/office/excel-news/his/his_4.shtml</a>&nbsp; Excel&nbsp;&nbsp;&nbsp;<br><a href="http://www.4399.net/flash/1602_2.htm?800">http://www.4399.net/flash/1602_2.htm?800</a> golden&nbsp;&nbsp;&nbsp;<br><a href="http://edu.itbulo.com/200511/58025.htm">http://edu.itbulo.com/200511/58025.htm</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ITbulo&nbsp;&nbsp;&nbsp;<br><a href="http://202.103.49.240/jsjzs/excel/excelyy.htm">http://202.103.49.240/jsjzs/excel/excelyy.htm</a>&nbsp;&nbsp;&nbsp; Excel 排序&nbsp;&nbsp;&nbsp;<br><a href="http://192.168.1.23/use_wf/Dep_App">http://192.168.1.23/use_wf/Dep_App</a>&nbsp;&nbsp;&nbsp;&nbsp; WF&nbsp; WF&nbsp; WF&nbsp; WF&nbsp;&nbsp;&nbsp;<br><a href="http://www.yodian.com/">http://www.yodian.com</a>&nbsp;&nbsp; 有点&nbsp;&nbsp;&nbsp;<br><a href="http://www.dlsp.com.cn/">http://www.dlsp.com.cn</a>&nbsp;&nbsp; DLSP&nbsp;&nbsp;&nbsp;<br><a href="http://64.233.179.104/search?q=cache:QqZYnKlqqEwJ:members.at.infoseek.co.jp/skillup/yougo/yougo6.htm+EOB%E3%80%80Electronic&amp;hl=ja&amp;gl=jp&amp;ct=clnk&amp;cd=1&amp;lr=lang_ja">http://64.233.179.104/search?q=cache:QqZYnKlqqEwJ:members.at.infoseek.co.jp/skillup/yougo/yougo6.htm+EOB%E3%80%80Electronic&amp;hl=ja&amp;gl=jp&amp;ct=clnk&amp;cd=1&amp;lr=lang_ja</a>&nbsp;&nbsp;&nbsp;<br><a href="http://www.codesky.net/">http://www.codesky.net</a>&nbsp;&nbsp; CODE&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br><a href="http://www1.tianya.cn/new/TechForum/Content.asp?idWriter=3915484&amp;Key=840161655&amp;idItem=81&amp;idArticle=251915">http://www1.tianya.cn/new/TechForum/Content.asp?idWriter=3915484&amp;Key=840161655&amp;idItem=81&amp;idArticle=251915</a>&nbsp;&nbsp;&nbsp;<br><a href="http://www.chinacs.net/archives/8/2004/12/12/3188.html">http://www.chinacs.net/archives/8/2004/12/12/3188.html</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C#&nbsp;&nbsp;&nbsp;<br><a href="http://music.whnews.cn/playgame/flashshow.php?flashid=895">http://music.whnews.cn/playgame/flashshow.php?flashid=895</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SC&nbsp;&nbsp;&nbsp;<br><a href="http://www.tianya.cn/new/TechForum/Content.asp?idWriter=3915484&amp;Key=481775086&amp;idItem=81&amp;idArticle=562447">http://www.tianya.cn/new/TechForum/Content.asp?idWriter=3915484&amp;Key=481775086&amp;idItem=81&amp;idArticle=562447</a>&nbsp;&nbsp;&nbsp;<br><a href="http://192.168.1.211/TRIAL/upload/jinji/study/access/">http://192.168.1.211/TRIAL/upload/jinji/study/access/</a>&nbsp;&nbsp;&nbsp; ACCESS&nbsp;&nbsp;&nbsp;<br><a href="http://www.wswire.com/">http://www.wswire.com/</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; huaerjie dianxun&nbsp;&nbsp;&nbsp;<br><a href="http://infoseek.amikai.com/amitext/indexUTF8.jsp">http://infoseek.amikai.com/amitext/indexUTF8.jsp</a>&nbsp;&nbsp;&nbsp;<br><a href="http://www.51windows.net/pages/ado/?url=/pages/ado/mdmthaddnew.htm">http://www.51windows.net/pages/ado/?url=/pages/ado/mdmthaddnew.htm</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ADO&nbsp;&nbsp;&nbsp; ADO&nbsp;<br><a href="http://www.51windows.net/">http://www.51windows.net/</a><br>&nbsp;&nbsp;<br><a href="http://www.codechina.net/resource/sort.php/621/4">http://www.codechina.net/resource/sort.php/621/4</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Access VBA&nbsp; Code&nbsp;&nbsp;&nbsp;<br><a href="http://jakarta.apche.org/">http://jakarta.apche.org</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struts&nbsp;&nbsp;&nbsp;<br><a href="http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/csref/html/vcoricsharptutorials.asp">http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/csref/html/vcoricsharptutorials.asp</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MSDN c#&nbsp;&nbsp;&nbsp;<br><a href="http://www.daliancity.com.cn/job/index.php">http://www.daliancity.com.cn/job/index.php</a>&nbsp;&nbsp; &nbsp;&nbsp;DLZX&nbsp;<br><a href="http://www.cjsdu.com/">http://www.cjsdu.com/</a>&nbsp;&nbsp;&nbsp;DuiRiLunTan</p>
<p><br><a href="http://www.mutouyu.com/translation/">http://www.mutouyu.com/translation/</a>&nbsp;木頭魚翻訳</p>
<p><a href="http://www6.tianya.cn/new/techforum/Content.asp?idWriter=3915484&amp;Key=700727019&amp;idItem=81&amp;idArticle=574220">http://www6.tianya.cn/new/techforum/Content.asp?idWriter=3915484&amp;Key=700727019&amp;idItem=81&amp;idArticle=574220</a></p>
<p><a href="http://localhost:8080/solves4/pages/CM/AAA/CMAAA001R.jsp">http://localhost:8080/solves4/pages/CM/AAA/CMAAA001R.jsp</a> </p>
<p><a href="http://www.tianya.cn/new/techforum/Content.asp?idWriter=3915484&amp;Key=292720848&amp;idItem=81&amp;idArticle=568508">http://www.tianya.cn/new/techforum/Content.asp?idWriter=3915484&amp;Key=292720848&amp;idItem=81&amp;idArticle=568508</a></p>
<p><a href="http://www1.tianya.cn/new/techforum/Content.asp?idWriter=3915484&amp;Key=189209006&amp;idItem=81&amp;idArticle=573983">http://www1.tianya.cn/new/techforum/Content.asp?idWriter=3915484&amp;Key=189209006&amp;idItem=81&amp;idArticle=573983</a></p>
<p><a href="http://www2.tianya.cn/new/techforum/Content.asp?idWriter=3915484&amp;Key=677920263&amp;idItem=81&amp;idArticle=573828">http://www2.tianya.cn/new/techforum/Content.asp?idWriter=3915484&amp;Key=677920263&amp;idItem=81&amp;idArticle=573828</a><br>&nbsp;hua xian chuang guan</p>
<p><a href="http://www.4399.net/flash/4362_4.htm?1024">http://www.4399.net/flash/4362_4.htm?1024</a><br>&nbsp;pao tai TD</p>
<p><a href="http://www.excite.co.jp/world/chinese/">http://www.excite.co.jp/world/chinese/</a><br>&nbsp;onlineTranslate</p>
<p><a href="http://www.4399.net/flash/457_1.htm?800">http://www.4399.net/flash/457_1.htm?800</a><br>&nbsp;qiJi</p>
<p><a href="http://www.javaeye.com/">http://www.javaeye.com/</a><br>&nbsp;<br><a href="http://www.andykhan.com/jexcelapi/">http://www.andykhan.com/jexcelapi/</a><br>&nbsp;JXL(JAVA Excel API)</p>
<p><a href="http://www.uml.org.cn/sjms/200703274.asp">http://www.uml.org.cn/sjms/200703274.asp</a><br>&nbsp;設計モード</p>
<p><a href="http://www.okajax.com/">http://www.okajax.com/</a><br>&nbsp;Ajax 中国</p>
<p><a href="http://www.nicenic.com/domain/">http://www.nicenic.com/domain/</a><br>&nbsp;域名</p>
<p><br>域名最长的网站<br><a href="http://www.llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch.co.uk/">http://www.llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch.co.uk/</a><br><a href="http://www.111111111111111111111111111111111111111111111111111111111111.com/">http://www.111111111111111111111111111111111111111111111111111111111111.com/</a><br><a href="http://3.141592653589793238462643383279502884197169399375105820974944592.com/">http://3.141592653589793238462643383279502884197169399375105820974944592.com/</a><br><a href="http://www.thelongestdomainnameintheworldandthensomeandthensomemoreandmore.com/">http://www.thelongestdomainnameintheworldandthensomeandthensomemoreandmore.com/</a></p>
<p>几个不错的JAVA学习网站<br><a href="http://www.csdn.net/">http://www.csdn.net</a>(社区、文档、bolg、知识库)<br><a href="http://www.hibernate.org.cn/">http://www.hibernate.org.cn</a><br><a href="http://www.blogjava.net/">http://www.blogjava.net</a><br><a href="http://www.jdon.com/">http://www.jdon.com</a><br><a href="http://www.javafan.net/">http://www.javafan.net</a><br><a href="http://www.open-open.com/">http://www.open-open.com</a><br><a href="http://dev2dev.bea.com.cn/">http://dev2dev.bea.com.cn/</a><br><a href="http://www.javaresearch.org/">http://www.javaresearch.org/</a><br><a href="http://www.codechina.net/resource/">http://www.codechina.net/resource/</a><br><a href="http://gceclub.sun.com.cn/">http://gceclub.sun.com.cn</a><br><a href="http://www.javaeye.com/">http://www.javaeye.com</a><br><a href="http://www.chinaitlab.com/">http://WWW.chinaitlab.com</a>&nbsp; 中国IT試験室</p>
<p>您的Blog地址是:http://www.blogjava.net/lyl3333489/</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/lyl3333489/aggbug/129206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lyl3333489/" target="_blank">AAAAA</a> 2007-07-10 09:05 <a href="http://www.blogjava.net/lyl3333489/archive/2007/07/10/129206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>