﻿<?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-总结，记录</title><link>http://www.blogjava.net/uhlanxie/</link><description /><language>zh-cn</language><lastBuildDate>Mon, 04 May 2026 13:25:38 GMT</lastBuildDate><pubDate>Mon, 04 May 2026 13:25:38 GMT</pubDate><ttl>60</ttl><item><title>设计模式: 创建型模式概要</title><link>http://www.blogjava.net/uhlanxie/archive/2007/09/01/141970.html</link><dc:creator>L.X</dc:creator><author>L.X</author><pubDate>Sat, 01 Sep 2007 10:33:00 GMT</pubDate><guid>http://www.blogjava.net/uhlanxie/archive/2007/09/01/141970.html</guid><wfw:comment>http://www.blogjava.net/uhlanxie/comments/141970.html</wfw:comment><comments>http://www.blogjava.net/uhlanxie/archive/2007/09/01/141970.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/uhlanxie/comments/commentRss/141970.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/uhlanxie/services/trackbacks/141970.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 模式运用的基本方法，步骤<br>5种创建者模式的运用条件，解决之道，Java中的运用<br>思维导图描述，呵呵&nbsp;&nbsp;<a href='http://www.blogjava.net/uhlanxie/archive/2007/09/01/141970.html'>阅读全文</a><img src ="http://www.blogjava.net/uhlanxie/aggbug/141970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/uhlanxie/" target="_blank">L.X</a> 2007-09-01 18:33 <a href="http://www.blogjava.net/uhlanxie/archive/2007/09/01/141970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Refactoring To Patterns： 观察者模式</title><link>http://www.blogjava.net/uhlanxie/archive/2007/07/10/129170.html</link><dc:creator>L.X</dc:creator><author>L.X</author><pubDate>Mon, 09 Jul 2007 16:11:00 GMT</pubDate><guid>http://www.blogjava.net/uhlanxie/archive/2007/07/10/129170.html</guid><wfw:comment>http://www.blogjava.net/uhlanxie/comments/129170.html</wfw:comment><comments>http://www.blogjava.net/uhlanxie/archive/2007/07/10/129170.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/uhlanxie/comments/commentRss/129170.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/uhlanxie/services/trackbacks/129170.html</trackback:ping><description><![CDATA[<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 src="http://www.blogjava.net/images/blogjava_net/uhlanxie/ObModel.JPG" alt="" height="294" 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: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; 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: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; 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 src="http://www.blogjava.net/images/blogjava_net/uhlanxie/initMap.JPG" alt="" height="274" 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: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; 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 src="http://www.blogjava.net/images/blogjava_net/uhlanxie/downToUpu.JPG" alt="">
<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: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<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: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; 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 src="http://www.blogjava.net/images/blogjava_net/uhlanxie/openClosePrincipleu.JPG" alt=""><br><br><br><span style="color: #1600b0;">5.观察者模式概况</span><br style="color: #1600b0;"><br><br><img src="http://www.blogjava.net/images/blogjava_net/uhlanxie/Observer.JPG" alt="">
<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>  <img src ="http://www.blogjava.net/uhlanxie/aggbug/129170.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/uhlanxie/" target="_blank">L.X</a> 2007-07-10 00:11 <a href="http://www.blogjava.net/uhlanxie/archive/2007/07/10/129170.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>