﻿<?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-Java for memory-随笔分类-Java</title><link>http://www.blogjava.net/Lanny/category/36204.html</link><description>memory is forever</description><language>zh-cn</language><lastBuildDate>Fri, 21 Aug 2009 09:57:27 GMT</lastBuildDate><pubDate>Fri, 21 Aug 2009 09:57:27 GMT</pubDate><ttl>60</ttl><item><title>Apache dblUtils 工具包的使用</title><link>http://www.blogjava.net/Lanny/archive/2009/08/20/291946.html</link><dc:creator>Lanny</dc:creator><author>Lanny</author><pubDate>Thu, 20 Aug 2009 06:26:00 GMT</pubDate><guid>http://www.blogjava.net/Lanny/archive/2009/08/20/291946.html</guid><wfw:comment>http://www.blogjava.net/Lanny/comments/291946.html</wfw:comment><comments>http://www.blogjava.net/Lanny/archive/2009/08/20/291946.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Lanny/comments/commentRss/291946.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Lanny/services/trackbacks/291946.html</trackback:ping><description><![CDATA[<span  style="font-family: Arial, sans-serifarial, Verdana, Helvetica; font-size: 12px; line-height: 18px; ">
<div class="blog_title" style="margin-bottom: 15px; "><strong style="font-weight: bold; ">关键字: commons-dbutils 工具包的使用</strong></div>
<div class="blog_content">commons-dbutils 是 Apache 组织提供的一个开源 JDBC 工具类库，能让我们更简单的使用 JDBC 。&nbsp;<br />
今天，在传智播客的课堂上，我们学习了 DBUtils 类库，知道了如何能够更方便地使用 JDBC 。以下是我的学习总结。&nbsp;<br />
<br />
<br />
--------------------------------------------------------------------------------&nbsp;<br />
1. API 介绍：&nbsp;<br />
&lt;1&gt; org.apache.commons.dbutils.DbUtils：提供如关闭连接、装载 JDBC 驱动程序等常规工作的工具类；&nbsp;<br />
&lt;2&gt; org.apache.commons.dbutils.QueryRunner：该类简单化了 SQL 查询，它与 ResultSetHandler 组合在一起使用可以完成大部分的数据库操作，能够大大减少编码量。&nbsp;<br />
&lt;3&gt; org.apache.commons.dbutils.ResultSetHandler：该接口用于处理 java.sql.ResultSet，将数据按要求转换为另一种形式。&nbsp;<br />
--------------------------------------------------------------------------------&nbsp;<br />
<br />
2. 工具类的方法及示例代码：&nbsp;<br />
&lt;1&gt; DBUtil 类的主要方法如下：&nbsp;<br />
a. public static void close(&#8230;) throws java.sql.SQLException：　DbUtils类提供了三个重载的关闭&nbsp;<br />
<br />
方法。这些方法检查所提供的参数是不是 NULL ，如果不是的话，它们就关闭 Connection、Statement 和 ResultSet。&nbsp;<br />
b. public static void closeQuietly(&#8230;): 这一类方法不仅能在 Connection、Statement 和ResultSet 为 NULL 情况下避免关闭，还能隐藏一些在程序中抛出的 SQLEeception。&nbsp;<br />
c. public static void commitAndCloseQuietly(Connection conn)： 用来提交连接，然后关闭连接，并&nbsp;<br />
<br />
且在关闭连接时不抛出 SQL 异常。&nbsp;<br />
d. public static boolean loadDriver(java.lang.String driverClassName)：这一方装载并注册 JDBC 驱动程序，如果成功就返回 true 。使用该方法，你不需要捕捉这个异常 ClassNotFoundException。&nbsp;<br />
<br />
<br />
--------------------------------------------------------------------------------&nbsp;<br />
&lt;2&gt; QueryRunner 类的构造方法及主要方法：&nbsp;<br />
a. 默认的构造方法:&nbsp;<br />
public QueryRunner(){}&nbsp;<br />
b. 需要一个 javax.sql.DataSource 来作参数的构造方法:&nbsp;<br />
public QueryRunner(DataSource ds) {&nbsp;<br />
this.ds = ds;&nbsp;<br />
}&nbsp;<br />
QueryRunner类的主要方法：&nbsp;<br />
c. public Object query(Connection conn, String sql, Object[] params, ResultSetHandler rsh)&nbsp;<br />
throws SQLException：执行一个查询操作，在这个查询中，对象数组中的每个元素值被用来作为查询语句的置换参数。该方法会自行处理 PreparedStatement 和 ResultSet 的创建和关闭。更重要的是参数 ResultSetHandler 会把从 ResultSet 中获得的数据转换成程序需要的数据格式。&nbsp;<br />
d. public Object query(String sql, Object[] params, ResultSetHandler rsh) throws SQLException：几乎与第一种方法一样；唯一的不同在于它不将数据库连接提供给方法，并且它是从提供给构造方法的数据源(DataSource) 或使用的setDataSource 方法中重新获得 Connection。&nbsp;<br />
e. public Object query(Connection conn, String sql, ResultSetHandler rsh) throws SQLException ：执行一个不需要置换参数的查询操作。&nbsp;<br />
f. public int update(Connection conn, String sql, Object[] params) throws SQLException：用来执行一个更新（插入、更新或删除）操作。&nbsp;<br />
g. public int update(Connection conn, String sql) throws SQLException：用来执行一个不需要置换&nbsp;<br />
<br />
参数的更新操作。&nbsp;<br />
<br />
<br />
--------------------------------------------------------------------------------&nbsp;<br />
&lt;3&gt; ResultSetHandler接口&nbsp;<br />
ResultSetHandler 接口提供了一个单独的方法：&nbsp;<br />
Object handle (java.sql.ResultSet .rs)。&nbsp;<br />
--------------------------------------------------------------------------------&nbsp;<br />
&lt;4&gt; ResultSetHandler 接口的实现类&nbsp;<br />
a. ArrayHandler：把结果集中的第一行数据转成对象数组。&nbsp;<br />
b. ArrayListHandler：把结果集中的每一行数据都转成一个对象数组，再存放到 List 中。&nbsp;<br />
c. BeanHandler：将结果集中的第一行数据封装到一个对应的 JavaBean 实例中。&nbsp;<br />
d. BeanListHandler：将结果集中的每一行数据都封装到一个对应的 JavaBean 实例中，存放到 List里。&nbsp;<br />
e. ColumnListHandler：将结果集中某一列的数据存放到 List 中。&nbsp;<br />
f. KeyedHandler：将结果集中的每一行数据都封装到一个 Map 里，然后再根据指定的key把每个 Map 再存放到一个 Map 里。&nbsp;<br />
g. MapHandler：将结果集中的第一行数据封装到一个 Map 里，key 是列名，value 就是对应的值。&nbsp;<br />
h. MapListHandler：将结果集中的每一行数据都封装到一个 Map 里，然后再存放到 List。&nbsp;<br />
i. ScalarHandler：将结果集中某一条记录的其中某一列的数据存成 Object。&nbsp;<br />
--------------------------------------------------------------------------------&nbsp;<br />
&lt;5&gt; 下面是简单对这几个工具类的测试代码：&nbsp;<br />
QueryRunner runner = null;&nbsp;<br />
runner = new QueryRunner();// 获得QueryRunner类的实例对象&nbsp;<br />
Connection conn = null;&nbsp;<br />
Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动&nbsp;<br />
conn = DriverManager.getConnection("jdbc:mysql://localhost:3309/bookstore",&nbsp;<br />
"root", "1230");// 与数据库建立连接&nbsp;<br />
String sql = "SELECT id, name, title, price, yr, description, saleAmount FROM books&nbsp;<br />
<br />
WHERE id = ?";// 准备 sql 语句&nbsp;<br />
List&lt;Book&gt; list = (List) runner.query(conn, sql, new Object[]{"201"}, new&nbsp;<br />
<br />
BeanListHandler(Book.class));// 运用 QueryRunner 的方法执行 sql 语句，并获取结果集，从这里可&nbsp;<br />
<br />
//以看出运用 commons-dbutils 类库的方便之处，避免了创建 ResultSet 对象来设置参数的麻烦。&nbsp;<br />
System.out.println(books.size()); //输出 books 的元素个数&nbsp;<br />
<br />
<br />
--------------------------------------------------------------------------------&nbsp;<br />
&lt;6&gt; 其它类和接口：&nbsp;<br />
a. org.apache.commons.dbutils.QueryLoader类：属性文件加载器，主要用于加载属性文件中的 SQL 到内存中。&nbsp;<br />
b. org.apache.commons.dbutils.wrappers.SqlNullCheckedResultSet类：该类是用来对sql语句执行完成&nbsp;<br />
<br />
之后的的数值进行null的替换。&nbsp;<br />
c. org.apache.commons.dbutils.wrappers.StringTrimmedResultSet类：去除ResultSet中字段的左右空格。&nbsp;<br />
d. org.apache.commons.dbutils.RowProcessor接口：提供了把结果集的行数据转换成其它格式的功能。它的实现类是org.apache.commons.dbutils.BasicRowProcessor类。&nbsp;</div>
</span>
<img src ="http://www.blogjava.net/Lanny/aggbug/291946.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Lanny/" target="_blank">Lanny</a> 2009-08-20 14:26 <a href="http://www.blogjava.net/Lanny/archive/2009/08/20/291946.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XFire配置步骤</title><link>http://www.blogjava.net/Lanny/archive/2008/12/10/245469.html</link><dc:creator>Lanny</dc:creator><author>Lanny</author><pubDate>Wed, 10 Dec 2008 04:57:00 GMT</pubDate><guid>http://www.blogjava.net/Lanny/archive/2008/12/10/245469.html</guid><wfw:comment>http://www.blogjava.net/Lanny/comments/245469.html</wfw:comment><comments>http://www.blogjava.net/Lanny/archive/2008/12/10/245469.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Lanny/comments/commentRss/245469.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Lanny/services/trackbacks/245469.html</trackback:ping><description><![CDATA[ <img src ="http://www.blogjava.net/Lanny/aggbug/245469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Lanny/" target="_blank">Lanny</a> 2008-12-10 12:57 <a href="http://www.blogjava.net/Lanny/archive/2008/12/10/245469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序设计模式之-----单实例模式</title><link>http://www.blogjava.net/Lanny/archive/2008/11/25/242482.html</link><dc:creator>Lanny</dc:creator><author>Lanny</author><pubDate>Tue, 25 Nov 2008 03:19:00 GMT</pubDate><guid>http://www.blogjava.net/Lanny/archive/2008/11/25/242482.html</guid><wfw:comment>http://www.blogjava.net/Lanny/comments/242482.html</wfw:comment><comments>http://www.blogjava.net/Lanny/archive/2008/11/25/242482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Lanny/comments/commentRss/242482.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Lanny/services/trackbacks/242482.html</trackback:ping><description><![CDATA[  <img src ="http://www.blogjava.net/Lanny/aggbug/242482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Lanny/" target="_blank">Lanny</a> 2008-11-25 11:19 <a href="http://www.blogjava.net/Lanny/archive/2008/11/25/242482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序设计模式之----Observer模式</title><link>http://www.blogjava.net/Lanny/archive/2008/11/25/242478.html</link><dc:creator>Lanny</dc:creator><author>Lanny</author><pubDate>Tue, 25 Nov 2008 03:02:00 GMT</pubDate><guid>http://www.blogjava.net/Lanny/archive/2008/11/25/242478.html</guid><wfw:comment>http://www.blogjava.net/Lanny/comments/242478.html</wfw:comment><comments>http://www.blogjava.net/Lanny/archive/2008/11/25/242478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Lanny/comments/commentRss/242478.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Lanny/services/trackbacks/242478.html</trackback:ping><description><![CDATA[<p><span style="font-family: Comic Sans MS"><span style="font-family: 黑体"><span style="font-family: 隶书"><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS">Observer模式也称为观察者模式，<br />
</span></span></span></span></span><span style="font-family: 微软雅黑"><br />
<span style="font-family: Comic Sans MS"><span style="font-family: 黑体"><span style="font-family: 隶书"><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS">观察者模式是java已经实现的模式,我们只要利用java.util.Obserable类和java.util.Observer接口就可以实现观察者模式</span></span></span></span></span></span></p>
<p><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS"><span style="font-family: 黑体"><span style="font-family: 隶书"><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS">实现过程:</span></span></span></span></span></span></p>
<p><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS"><span style="font-family: 黑体"><span style="font-family: 隶书"><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS">被观察者必须继承Observable,一旦事件被触发,调用notifyObservers通知观察者</span></span></span></span></span></span></p>
<p><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS"><span style="font-family: 黑体"><span style="font-family: 隶书"><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS">观察者必须实现Observer接口,实现update方法,完成事件处理</span></span></span></span></span></span></p>
<p><span style="font-family: Comic Sans MS"></span></p>
<p><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS"><span style="font-family: 黑体"><span style="font-family: 隶书"><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS">举个经典的例子....猫叫,老鼠跑.人惊醒....</span></span></span></span></span></span></p>
<p><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS"><span style="font-family: 黑体"><span style="font-family: 隶书"><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS">代码:</span></span></span></span></span></span><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS"><span style="font-family: 黑体"><span style="font-family: 隶书"><span style="font-family: 微软雅黑"><span style="font-family: Comic Sans MS"></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: #008080">&nbsp;1</span><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;javamodel.observer;<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Observable;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Observer;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img id="Codehighlighter1_86_146_Open_Image" onclick="this.style.display='none'; Codehighlighter1_86_146_Open_Text.style.display='none'; Codehighlighter1_86_146_Closed_Image.style.display='inline'; Codehighlighter1_86_146_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_86_146_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_86_146_Closed_Text.style.display='none'; Codehighlighter1_86_146_Open_Image.style.display='inline'; Codehighlighter1_86_146_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_86_146_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**&nbsp;*/</span><span id="Codehighlighter1_86_146_Open_Text"><span style="color: #008000">/**</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;猫叫，老鼠跑，主人被惊醒,用代码实现这个连锁反应&nbsp;。<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;Administrator<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />*<br />
</span><span style="color: #008080">10</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" /></span><span style="color: #008000">*/</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img id="Codehighlighter1_175_386_Open_Image" onclick="this.style.display='none'; Codehighlighter1_175_386_Open_Text.style.display='none'; Codehighlighter1_175_386_Closed_Image.style.display='inline'; Codehighlighter1_175_386_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_175_386_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_175_386_Closed_Text.style.display='none'; Codehighlighter1_175_386_Open_Image.style.display='inline'; Codehighlighter1_175_386_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TestObserver&nbsp;</span><span id="Codehighlighter1_175_386_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_175_386_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img id="Codehighlighter1_216_383_Open_Image" onclick="this.style.display='none'; Codehighlighter1_216_383_Open_Text.style.display='none'; Codehighlighter1_216_383_Closed_Image.style.display='inline'; Codehighlighter1_216_383_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_216_383_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_216_383_Closed_Text.style.display='none'; Codehighlighter1_216_383_Open_Image.style.display='inline'; Codehighlighter1_216_383_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)</span><span id="Codehighlighter1_216_383_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_216_383_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;Cat&nbsp;c</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Cat();<br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;Observer&nbsp;o1</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Mouse();<br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;Observer&nbsp;o2</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Man();<br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;c.addObserver(o1);<br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;Mouse&nbsp;oo1</span><span style="color: #000000">=</span><span style="color: #000000">(Mouse)o1;</span><span style="color: #008000">//</span><span style="color: #008000">向下转型</span><span style="color: #008000"><br />
</span><span style="color: #008080">20</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;oo1.addObserver(o2);<br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;c.CatSay();<br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img id="Codehighlighter1_417_538_Open_Image" onclick="this.style.display='none'; Codehighlighter1_417_538_Open_Text.style.display='none'; Codehighlighter1_417_538_Closed_Image.style.display='inline'; Codehighlighter1_417_538_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_417_538_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_417_538_Closed_Text.style.display='none'; Codehighlighter1_417_538_Open_Image.style.display='inline'; Codehighlighter1_417_538_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Cat&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Observable</span><span id="Codehighlighter1_417_538_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_417_538_Open_Text"><span style="color: #000000">{</span><span style="color: #008000">//</span><span style="color: #008000">猫被老鼠观察，猫是被观察者</span><span style="color: #008000"><br />
</span><span style="color: #008080">27</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img id="Codehighlighter1_455_536_Open_Image" onclick="this.style.display='none'; Codehighlighter1_455_536_Open_Text.style.display='none'; Codehighlighter1_455_536_Closed_Image.style.display='inline'; Codehighlighter1_455_536_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_455_536_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_455_536_Closed_Text.style.display='none'; Codehighlighter1_455_536_Open_Image.style.display='inline'; Codehighlighter1_455_536_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CatSay()</span><span id="Codehighlighter1_455_536_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_455_536_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">29</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">猫叫了</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">30</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.setChanged();<br />
</span><span style="color: #008080">31</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.notifyObservers();<br />
</span><span style="color: #008080">32</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">33</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">34</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">35</span><span style="color: #000000"><img id="Codehighlighter1_591_795_Open_Image" onclick="this.style.display='none'; Codehighlighter1_591_795_Open_Text.style.display='none'; Codehighlighter1_591_795_Closed_Image.style.display='inline'; Codehighlighter1_591_795_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_591_795_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_591_795_Closed_Text.style.display='none'; Codehighlighter1_591_795_Open_Image.style.display='inline'; Codehighlighter1_591_795_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Mouse&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;Observable&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Observer</span><span id="Codehighlighter1_591_795_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_591_795_Open_Text"><span style="color: #000000">{</span><span style="color: #008000">//</span><span style="color: #008000">老鼠观察猫，猫是观察者,对于人,老鼠是被观察者</span><span style="color: #008000"><br />
</span><span style="color: #008080">36</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
</span><span style="color: #008080">37</span><span style="color: #000000"><img id="Codehighlighter1_668_792_Open_Image" onclick="this.style.display='none'; Codehighlighter1_668_792_Open_Text.style.display='none'; Codehighlighter1_668_792_Closed_Image.style.display='inline'; Codehighlighter1_668_792_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_668_792_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_668_792_Closed_Text.style.display='none'; Codehighlighter1_668_792_Open_Image.style.display='inline'; Codehighlighter1_668_792_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></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(Observable&nbsp;arg0,&nbsp;Object&nbsp;arg1)&nbsp;</span><span id="Codehighlighter1_668_792_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_668_792_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">38</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000"><br />
</span><span style="color: #008080">39</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">猫叫了，老鼠跑了</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">40</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.setChanged();<br />
</span><span style="color: #008080">41</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.notifyObservers();<br />
</span><span style="color: #008080">42</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">43</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">44</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">45</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">46</span><span style="color: #000000"><img id="Codehighlighter1_827_970_Open_Image" onclick="this.style.display='none'; Codehighlighter1_827_970_Open_Text.style.display='none'; Codehighlighter1_827_970_Closed_Image.style.display='inline'; Codehighlighter1_827_970_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_827_970_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_827_970_Closed_Text.style.display='none'; Codehighlighter1_827_970_Open_Image.style.display='inline'; Codehighlighter1_827_970_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Man&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Observer</span><span id="Codehighlighter1_827_970_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_827_970_Open_Text"><span style="color: #000000">{</span><span style="color: #008000">//</span><span style="color: #008000">人观察老鼠,人是观察者</span><span style="color: #008000"><br />
</span><span style="color: #008080">47</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000"><br />
</span><span style="color: #008080">48</span><span style="color: #000000"><img id="Codehighlighter1_892_968_Open_Image" onclick="this.style.display='none'; Codehighlighter1_892_968_Open_Text.style.display='none'; Codehighlighter1_892_968_Closed_Image.style.display='inline'; Codehighlighter1_892_968_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_892_968_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_892_968_Closed_Text.style.display='none'; Codehighlighter1_892_968_Open_Image.style.display='inline'; Codehighlighter1_892_968_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></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(Observable&nbsp;arg0,&nbsp;Object&nbsp;arg1)&nbsp;</span><span id="Codehighlighter1_892_968_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_892_968_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">49</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub</span><span style="color: #008000"><br />
</span><span style="color: #008080">50</span><span style="color: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">老鼠跑了,人惊醒了</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">51</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">52</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">53</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">54</span><span style="color: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p><br />
总结， <span style="font-family: 宋体">观察者模式的应用场景：</span></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt">1、&nbsp;<span style="font-family: 宋体">对一个对象状态的更新，需要其他对象同步更新，而且其他对象的数量动态可变。</span></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt">2、&nbsp;<span style="font-family: 宋体">对象仅需要将自己的更新通知给其他对象而不需要知道其他对象的细节。</span></p>
<p style="margin: 0cm 0cm 0pt 21pt"><span style="font-family: 宋体">观察者模式的优点：</span></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt">1、&nbsp;Subject<span style="font-family: 宋体">和</span>Observer<span style="font-family: 宋体">之间是松偶合的，分别可以各自独立改变。</span></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt">2、&nbsp;Subject<span style="font-family: 宋体">在发送广播通知的时候，无须指定具体的</span>Observer<span style="font-family: 宋体">，</span>Observer<span style="font-family: 宋体">可以自己决定是否要订阅</span>Subject<span style="font-family: 宋体">的通知。</span></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt">3、&nbsp;<span style="color: black; font-family: 宋体">遵守大部分</span><span style="color: black">GRASP</span><span style="color: black; font-family: 宋体">原则和常用设计原则，高内聚、低偶合。</span></p>
<p style="margin: 0cm 0cm 0pt 21pt"><span style="font-family: 宋体">观察者模式的缺陷：</span></p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt">1、&nbsp;<span style="font-family: 宋体">松偶合导致代码关系不明显，有时可能难以理解。</span>(<span style="background: red 0% 50%; font-family: 宋体; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">废话</span>)</p>
<p style="margin: 0cm 0cm 0pt 39pt; text-indent: -18pt">2、&nbsp;<span style="font-family: 宋体">如果一个</span>Subject<span style="font-family: 宋体">被大量</span>Observer<span style="font-family: 宋体">订阅的话，在广播通知的时候可能会有效率问题。（毕竟只是简单的遍历）</span></p>
<p><br />
</span></span></span></span></span></span></p>
<img src ="http://www.blogjava.net/Lanny/aggbug/242478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Lanny/" target="_blank">Lanny</a> 2008-11-25 11:02 <a href="http://www.blogjava.net/Lanny/archive/2008/11/25/242478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>