﻿<?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-离弦之ray和霹雳vivian的技术天空-随笔分类-Design Pattern</title><link>http://www.blogjava.net/clraychen/category/12821.html</link><description>contact us by sending email to 
            clraychen@gmail.com
            eieig@hotmail.com</description><language>zh-cn</language><lastBuildDate>Wed, 05 Mar 2008 09:28:16 GMT</lastBuildDate><pubDate>Wed, 05 Mar 2008 09:28:16 GMT</pubDate><ttl>60</ttl><item><title>Builder Pattern &amp; Factory Method</title><link>http://www.blogjava.net/clraychen/archive/2008/02/26/182294.html</link><dc:creator>离弦之ray的技术天空</dc:creator><author>离弦之ray的技术天空</author><pubDate>Tue, 26 Feb 2008 12:25:00 GMT</pubDate><guid>http://www.blogjava.net/clraychen/archive/2008/02/26/182294.html</guid><wfw:comment>http://www.blogjava.net/clraychen/comments/182294.html</wfw:comment><comments>http://www.blogjava.net/clraychen/archive/2008/02/26/182294.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clraychen/comments/commentRss/182294.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clraychen/services/trackbacks/182294.html</trackback:ping><description><![CDATA[<span style="font-size: 14pt;"><span style="font-size: 12pt;"><span style="font-size: 10pt;"><span style="font-size: 12pt;"><span style="font-size: 12pt;"><span style="font-size: 8pt;"><span><br />
&nbsp;&nbsp;&nbsp; <span style="font-size: 8pt;"><span style="font-size: 12pt;">粗粗看完一遍设计模式的时候，觉得Builder Pattern和Factory Method Pattern有点混淆，好像这两者都是将复杂的构造过程屏蔽掉，最终返回一个Client满意的对象，但他们的本质是不一样的</span>。<br />
&nbsp;&nbsp;<span style="font-size: 12pt;">&nbsp; Builder Pattern只针对一个类，这个类的特点是构造起来过程特别复杂，所以将构造的部分独立出来，专门用一个BuilderClass来负责生成对象。<br />
&nbsp;&nbsp;&nbsp; Factory Method更多的是针对生成实现同一接口的一组类中的某个。有点拗口，就是在运行时生成正确的对象。<br />
&nbsp;&nbsp;&nbsp; 总结下来，就是Builder针对一个Class，Factory Method针对从一组Class中挑选一个</span></span></span><span style="font-size: 8pt;">。</span></span></span></span></span></span></span>
<img src ="http://www.blogjava.net/clraychen/aggbug/182294.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clraychen/" target="_blank">离弦之ray的技术天空</a> 2008-02-26 20:25 <a href="http://www.blogjava.net/clraychen/archive/2008/02/26/182294.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计模式初试（Sigleton &amp; Factory）</title><link>http://www.blogjava.net/clraychen/archive/2007/12/17/168231.html</link><dc:creator>离弦之ray的技术天空</dc:creator><author>离弦之ray的技术天空</author><pubDate>Mon, 17 Dec 2007 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/clraychen/archive/2007/12/17/168231.html</guid><wfw:comment>http://www.blogjava.net/clraychen/comments/168231.html</wfw:comment><comments>http://www.blogjava.net/clraychen/archive/2007/12/17/168231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clraychen/comments/commentRss/168231.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clraychen/services/trackbacks/168231.html</trackback:ping><description><![CDATA[<p>设计模式看懂了，好像是没什么用的。只有在你的开发中运用起来才有它的意义。</p>
<p>虽然还是小菜鸟，但既然看过了设计模式，还是希望能用起来的。</p>
<p>想做个自娱自乐的j2ee的东西。</p>
<p>关于得到数据库连接部分，一开始觉得是用工厂模式，用工厂模式得到Connection对象，试了几次好像不行。</p>
<p>然后尝试单态模式，创造了一个DatabaseGeneralServices类，来提供数据库连接和关闭数据库等一些通用的服务。<br />
一切正常。有点小感悟，代码如下，希望高手指点。</p>
<p>package com.ClockWise.ray.persistence;</p>
<p>import java.sql.Connection;<br />
import java.sql.PreparedStatement;<br />
import java.sql.ResultSet;<br />
import java.sql.SQLException;</p>
<p>import javax.naming.InitialContext;<br />
import javax.naming.NamingException;<br />
import javax.sql.DataSource;</p>
<p>public class&nbsp; DatabaseGeneralServices {<br />
&nbsp;private DataSource ds;<br />
&nbsp;private InitialContext ic;<br />
&nbsp;<br />
&nbsp;private static DatabaseGeneralServices dgs = new DatabaseGeneralServices();<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;private DatabaseGeneralServices()<span style="color: #0000ff"><strong>//use singleton pattern, so the constructor is private<br />
</strong></span>&nbsp; {&nbsp;<br />
&nbsp; &nbsp;try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ic = new InitialContext ();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ds = (DataSource)ic.lookup("java:jdbc/readshare<span style="color: #0000ff"><strong>");//get database connection</strong></span><br />
&nbsp;&nbsp;}catch(NamingException e){<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public&nbsp; Connection getConnection(){<br />
&nbsp;&nbsp;try{<br />
&nbsp;&nbsp;&nbsp;return ds.getConnection();<br />
&nbsp;&nbsp;}catch(SQLException e){<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return null;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public&nbsp; void closeConnection(ResultSet rs,PreparedStatement ps,Connection conn){<br />
&nbsp;&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(rs!=null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rs.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ps!=null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ps.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(conn!=null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; }catch(SQLException e ){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public static DatabaseGeneralServices getInstance()<span style="color: #339966"><span style="color: #0000ff"><strong>//get the sigleton instance</strong></span><br />
</span>&nbsp;{<br />
&nbsp;&nbsp;if(null==dgs){dgs= new DatabaseGeneralServices();}&nbsp; <br />
&nbsp;&nbsp;return dgs;<br />
&nbsp;}</p>
<p>}</p>
<img src ="http://www.blogjava.net/clraychen/aggbug/168231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clraychen/" target="_blank">离弦之ray的技术天空</a> 2007-12-17 14:55 <a href="http://www.blogjava.net/clraychen/archive/2007/12/17/168231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3 Patterns</title><link>http://www.blogjava.net/clraychen/archive/2007/09/22/147396.html</link><dc:creator>离弦之ray的技术天空</dc:creator><author>离弦之ray的技术天空</author><pubDate>Sat, 22 Sep 2007 05:51:00 GMT</pubDate><guid>http://www.blogjava.net/clraychen/archive/2007/09/22/147396.html</guid><wfw:comment>http://www.blogjava.net/clraychen/comments/147396.html</wfw:comment><comments>http://www.blogjava.net/clraychen/archive/2007/09/22/147396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clraychen/comments/commentRss/147396.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clraychen/services/trackbacks/147396.html</trackback:ping><description><![CDATA[&nbsp;
<p><strong><span style="color: #3366ff">Template method pattern</span></strong></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">从这个模式的名字就可以知道个大概，</span>Template<span style="font-family: 宋体">说明这个模式有一个模版，子类都要按照父类列出的大纲来干活。在这个模式中，父类通常是</span><strong><span style="color: #3366ff">abstract</span></strong><span style="font-family: 宋体">的。为什么不用接口？因为对某些所有子类都要用到的方法，父类中就给出了代码，而接口中是不能有具体实现代码的。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">父类中有一个总的方法就是所谓的</span><strong><span style="color: #3366ff">template method</span></strong><span style="font-family: 宋体">，这个方法通常被声明为</span><strong><span style="color: #3366ff">final</span></strong><span style="font-family: 宋体">，这样子类就无法</span><strong><span style="color: #3366ff">override</span></strong><span style="font-family: 宋体">它，保证了它的权威性。这个</span>template method<span style="font-family: 宋体">调用其它方法，这些&#8220;其它方法&#8221;包括了三个类型：</span></p>
<p style="text-indent: 21pt"><strong><span style="color: #3366ff; font-family: 宋体">第一种，是</span><span style="color: #3366ff">abstract</span></strong><strong><span style="color: #3366ff; font-family: 宋体">类型</span></strong><span style="font-family: 宋体">，子类需要根据自己的情况实现这部分代码；</span></p>
<p style="text-indent: 21pt"><strong><span style="color: #3366ff; font-family: 宋体">第二种，是</span><span style="color: #3366ff">final</span></strong><strong><span style="color: #3366ff; font-family: 宋体">型的</span></strong><span style="font-family: 宋体">，这种方法父类把它写死了，子类必须遵守；</span></p>
<p style="text-indent: 21pt"><strong><span style="color: #3366ff; font-family: 宋体">第三种，就是普通方法，是</span><span style="color: #3366ff">optional</span></strong><strong><span style="color: #3366ff; font-family: 宋体">的</span></strong><span style="font-family: 宋体">，子类可以延用父类的方法，也可以</span>override<span style="font-family: 宋体">掉它，写自己的代码，这种</span>optional<span style="font-family: 宋体">的方法给它一个名字叫做</span><strong><span style="color: #3366ff">hook</span></strong><span style="font-family: 宋体">。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">这个父类通常是这种形势。</span></p>
<p style="text-indent: 21pt"><span style="color: #3366ff">abstract</span> <span style="color: #3366ff">class AbstractClass{</span></p>
<p style="text-indent: 21pt">&nbsp;<span style="color: #3366ff">&nbsp;final void templateMethod(){</span></p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a();</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b();</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c();</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;</p>
<p style="text-indent: 42pt">}</p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp; <span style="color: #3366ff">abstract void a();</span></p>
<p style="text-indent: 21pt">&nbsp;&nbsp;&nbsp; <span style="color: #3366ff">final void b(){}</span></p>
<p style="text-indent: 21pt">&nbsp;&nbsp; <span style="color: #3366ff">&nbsp;void c(){}</span></p>
<p style="text-indent: 21pt">}</p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">应该说这个模式既蕴含着权威性和自由性。</span></p>
<p><strong><span style="color: #3366ff">Iterator and Composite Patterns</span></strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">这个模式的研究对象是</span><strong><span style="color: #3366ff">Collection</span></strong><span style="font-family: 宋体">，包括</span><strong><span style="color: #3366ff">ArrayList</span></strong><span style="font-family: 宋体">、</span><strong><span style="color: #3366ff">Arra</span></strong>y<span style="font-family: 宋体">甚至还有</span><strong><span style="color: #3366ff">Hashmap</span></strong><span style="font-family: 宋体">等等一切</span>java<span style="font-family: 宋体">里面的集合对象。</span>Iterator<span style="font-family: 宋体">的理念是把集合对象中的遍历等功能独立抽取出来，实现一个</span>Iterator<span style="font-family: 宋体">的接口，主要实现</span><strong><span style="color: #3366ff">next</span></strong><strong><span style="color: #3366ff; font-family: 宋体">（）</span></strong><span style="font-family: 宋体">和</span><strong><span style="color: #3366ff">hasNext</span></strong><strong><span style="color: #3366ff; font-family: 宋体">（）</span></strong><span style="font-family: 宋体">两个方法，这些东西和数据结构里面的东西基本一样。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">而以此为基础的</span><strong><span style="color: #3366ff">Composite Pattern</span></strong><span style="font-family: 宋体">其实就是数据结构里面树的概念，所以这里的东西还是找本数据结构书看看更好。</span></p>
<p><strong><span style="color: #3366ff">The State Pattern</span></strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">初看这个模式，发现里面有一个类似</span>UML<span style="font-family: 宋体">中状态图的东西，如其名字，这个模式主要描述如何处理应用中出现的&#8220;状态&#8221;。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">解决方式是这样的：</span></p>
<p>.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">第一步，创建一个叫做</span><strong><span style="color: #3366ff">State</span></strong><strong><span style="color: #3366ff; font-family: 宋体">的接口</span></strong><span style="font-family: 宋体">，里面包含什么东西呢？记得</span>UML<span style="font-family: 宋体">状态图中发生状态转换时箭头上面那些改变的条件？把这些条件全部转化为方法，表示当这个条件发生时，状态该怎么变。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">第二步，每个具体的</span><strong><span style="color: #3366ff">concreteState</span></strong><span style="font-family: 宋体">都要实现都要实现</span>State<span style="font-family: 宋体">这个接口。怎么实现？当然，</span>state<span style="font-family: 宋体">不是独立出现的，总有一个把它作为参数的类，里面有个私有变量保存当前的状态，暂且就把它称作</span><strong><span style="color: #3366ff">currentState</span></strong><span style="font-family: 宋体">吧。接口中定义的方法，在</span><strong><span style="color: #3366ff">concreteState</span></strong><span style="font-family: 宋体">中这样实现：每个方法根据条件定义，将</span><strong><span style="color: #3366ff">currentState</span></strong><span style="font-family: 宋体">改成相应的状态。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">以上其实就是</span>State Pattern<span style="font-family: 宋体">的精髓。</span></p>
<img src ="http://www.blogjava.net/clraychen/aggbug/147396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clraychen/" target="_blank">离弦之ray的技术天空</a> 2007-09-22 13:51 <a href="http://www.blogjava.net/clraychen/archive/2007/09/22/147396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>another three patterns</title><link>http://www.blogjava.net/clraychen/archive/2007/09/18/146184.html</link><dc:creator>离弦之ray的技术天空</dc:creator><author>离弦之ray的技术天空</author><pubDate>Tue, 18 Sep 2007 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/clraychen/archive/2007/09/18/146184.html</guid><wfw:comment>http://www.blogjava.net/clraychen/comments/146184.html</wfw:comment><comments>http://www.blogjava.net/clraychen/archive/2007/09/18/146184.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clraychen/comments/commentRss/146184.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clraychen/services/trackbacks/146184.html</trackback:ping><description><![CDATA[<p>&nbsp; </p>
<p><strong><span style="color: #3366ff">Singleton Pattern</span></strong></p>
<p><span style="font-family: 宋体">针对一些在应用中只会有一个对象存在的类而总结的模式。</span></p>
<p><span style="font-family: 宋体">令人意想不到的是，它是通过声明该类的构造函数为私有这种方法来实现的。</span></p>
<p><span style="font-family: 宋体">疑问就是，既然构造函数都成私有了，那怎么来创建这个类的对象呢？</span></p>
<p><span style="font-family: 宋体">解答就是通过在类中声明一个静态方法，返回这个对象。</span></p>
<p><span style="font-family: 宋体">典型的写法是</span></p>
<p>public static Singleton getInstance(){</p>
<p>&nbsp;if(uniqueInstance==null){uniqueInstance = new Singleton();}</p>
<p>return uniqueInstance;</p>
<p>}</p>
<p><span style="font-family: 宋体">这个模式的精髓就这么简单，剩下的就是线程对对象的操作安全，要把这个方法加上</span><strong>synchronized</strong><span style="font-family: 宋体">关键字。</span></p>
<p><strong><span style="color: #3366ff">Command Pattern</span></strong></p>
<p><span style="font-family: 宋体">书中是以餐馆点菜作比来讲述这个模式的。</span></p>
<p><span style="font-family: 宋体">其中的对比概念如下</span></p>
<p>Customer-------Client</p>
<p>Order------------Command</p>
<p>Waitress--------Invoker</p>
<p>Cook------------Receiver</p>
<p>Take order--------setCommand</p>
<p>orderUp-----------excute</p>
<p><span style="font-family: 宋体">怎么来解释呢？说白了，就是把调用类要达成的操作封装成一个</span>Command<span style="font-family: 宋体">对象，就像点菜那张单子一样，当然这个</span>Command<span style="font-family: 宋体">要符合一定的规则实现</span>Command<span style="font-family: 宋体">接口，里面非常重要的一个方法就是</span>execute<span style="font-family: 宋体">。</span></p>
<p><strong>setCommand</strong><span style="font-family: 宋体">方法相当于</span>waitress<span style="font-family: 宋体">把菜单递给了厨师，在接收者方面他只管运行</span><strong>execute</strong><span style="font-family: 宋体">，具体做什么传过来的</span>command<span style="font-family: 宋体">对象都已经设定好了。</span></p>
<p><strong><span style="color: #3366ff">Adapter &amp; Fa&#231;ade</span></strong></p>
<p><span style="font-family: 宋体">适配器模式其实没什么多说的，就是要把传过去的对象要实现接收者支持的格式，那个格式实际上就是一个接口。</span></p>
<p><span style="font-family: 宋体">而</span>Fa&#231;ade<span style="font-family: 宋体">模式是一种衍生物，它的目的是让操作简单化。将一系列不同对象中的操作整合，提供给其它类调用接口书上的例子是家庭影院，要看部电影，要开这个电器，开那个电器，通过</span>Fa&#231;ade<span style="font-family: 宋体">模式，将要看电影所必须的动作整合起来，一键搞定。明白了这点，也就理解了这个模式。</span></p>
<img src ="http://www.blogjava.net/clraychen/aggbug/146184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clraychen/" target="_blank">离弦之ray的技术天空</a> 2007-09-18 15:48 <a href="http://www.blogjava.net/clraychen/archive/2007/09/18/146184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Decorator &amp; Factory</title><link>http://www.blogjava.net/clraychen/archive/2007/09/10/144117.html</link><dc:creator>离弦之ray的技术天空</dc:creator><author>离弦之ray的技术天空</author><pubDate>Mon, 10 Sep 2007 15:21:00 GMT</pubDate><guid>http://www.blogjava.net/clraychen/archive/2007/09/10/144117.html</guid><wfw:comment>http://www.blogjava.net/clraychen/comments/144117.html</wfw:comment><comments>http://www.blogjava.net/clraychen/archive/2007/09/10/144117.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clraychen/comments/commentRss/144117.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clraychen/services/trackbacks/144117.html</trackback:ping><description><![CDATA[&nbsp;
<p style="text-indent: 21pt"><strong><span style="color: blue">Decorator Pattern</span></strong><span style="font-family: 宋体">其实早就接触过了，从</span>java<span style="font-family: 宋体">的输入语句中可见一斑</span>InputStream in = new BufferedInputStream(new FileInputStream(&#8220;test.txt&#8221;)); <span style="font-family: 宋体">其中</span>BufferedInputStream <span style="font-family: 宋体">和</span>FileInputStream <span style="font-family: 宋体">都是</span>InputStream<span style="font-family: 宋体">的子类，通过包含关系，让外围的类包含内部那个类的功能及数据，说的形象一点，就是在内部那个类外面加了一层装饰。这也是装饰模型最核心的概念。</span></p>
<p style="text-indent: 21pt"><strong><span style="color: blue">Factory Pattern</span></strong></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">书中举了匹萨店的例子，一开始的类，将制作不同类型匹萨的方法都包含在里面，整个类显得很冗余。顺着正常的思路，将制作匹萨的方法从这个类里面剥离出去单独形成一个类，这个类就像生产对象的工厂，只要你告诉它该生产的产品的型号，它就生产对应的对象再发送给客户。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">按照书中的例子，如果匹萨店开在同一个城市以内，匹萨的风味多样，那么上述的模式很好地实现了上面的功能。但如果是连锁店，每个地方的风味不同呢？&#8230;&#8230;</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">是的，每个地方的风味不同，但同一个地方不同匹萨的种类却相当有限。也就是说可以有一个匹萨店父类，然后各地的分店是这个父类的子类。而其中最重要的制作匹萨的方法在父类中被声明为虚函数，由各个具体的子类来实现。这样&#8220;工厂&#8221;又被搬回具体的类中间。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">具体如何使用，我个人觉得是要看情况的。上面两个是工厂模式的两种表现形式。</span></p>
<p>&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">对于后一种模式，里面用到的对象，比如例子中匹萨的原材料，同样可以用工厂模式来实现，这样程序的结构就相当灵活了。</span></p>
<img src ="http://www.blogjava.net/clraychen/aggbug/144117.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clraychen/" target="_blank">离弦之ray的技术天空</a> 2007-09-10 23:21 <a href="http://www.blogjava.net/clraychen/archive/2007/09/10/144117.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Observer Pattern</title><link>http://www.blogjava.net/clraychen/archive/2007/09/06/143153.html</link><dc:creator>离弦之ray的技术天空</dc:creator><author>离弦之ray的技术天空</author><pubDate>Thu, 06 Sep 2007 05:26:00 GMT</pubDate><guid>http://www.blogjava.net/clraychen/archive/2007/09/06/143153.html</guid><wfw:comment>http://www.blogjava.net/clraychen/comments/143153.html</wfw:comment><comments>http://www.blogjava.net/clraychen/archive/2007/09/06/143153.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/clraychen/comments/commentRss/143153.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clraychen/services/trackbacks/143153.html</trackback:ping><description><![CDATA[&nbsp;
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">这是<strong><span style="color: blue">《</span></strong></span><strong><span style="color: blue">Head First Design Pattern</span></strong><strong><span style="color: blue; font-family: 宋体">》</span></strong><span style="font-family: 宋体">里面介绍的第二个</span>Pattern<span style="font-family: 宋体">，叫做</span><strong><span style="color: blue">Observer Pattern</span></strong><span style="font-family: 宋体">，其核心概念就是一种一对多的关系。</span></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">其中的&#8220;一&#8221;，类似于定报纸系统的发送方，而&#8220;多&#8221;就是订阅方。当有新的&#8220;报纸&#8221;时，发送方将最新的报纸送达订阅方手中。发送方维护着一个订阅方的列表。</span></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">文中通过一个气象站的例子来解说这个模式。</span>WeatherData<span style="font-family: 宋体">实现</span>Subject<span style="font-family: 宋体">接口，里面包括所要传送的</span>private <span style="font-family: 宋体">数据，还有注册</span><strong><span style="color: blue">Observer</span></strong><span style="font-family: 宋体">和去除</span><strong><span style="color: blue">Observer</span></strong><span style="font-family: 宋体">的方法。当数据有所更新时调用</span><strong><span style="color: blue">measurementChanged</span></strong><span style="font-family: 宋体">方法，这个方法再调用</span><strong><span style="color: blue">notifyObservers</span></strong><span style="font-family: 宋体">方法。</span></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">而在</span><strong><span style="color: blue">Observer</span></strong><span style="font-family: 宋体">那端，有一个</span><strong><span style="color: blue">subject</span></strong><span style="font-family: 宋体">对象的私有数据，通过构造函数将要注册的</span>Subject<span style="font-family: 宋体">作为参数来对它进行初始化，以此建立</span>Observer<span style="font-family: 宋体">和</span>Subject<span style="font-family: 宋体">的联系。</span></p>
<p style="text-indent: 21.75pt"><span style="font-family: 宋体">最后还介绍了</span>java<span style="font-family: 宋体">那建的</span>Observer<span style="font-family: 宋体">模式。通过继承</span><strong><span style="color: blue">Observable</span></strong><span style="font-family: 宋体">来成为</span>Subject<span style="font-family: 宋体">，通过实现</span><strong><span style="color: blue">Observer</span></strong><span style="font-family: 宋体">接口来成为</span>Observer<span style="font-family: 宋体">。但其有一定弊病，因为</span>java<span style="font-family: 宋体">不支持多继承，这就限制了使用这个模式的灵活性。所以我觉得以后如果真的用到</span>Observer<span style="font-family: 宋体">模式还是自己编程比较好。</span></p>
<img src ="http://www.blogjava.net/clraychen/aggbug/143153.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clraychen/" target="_blank">离弦之ray的技术天空</a> 2007-09-06 13:26 <a href="http://www.blogjava.net/clraychen/archive/2007/09/06/143153.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>the first pattern</title><link>http://www.blogjava.net/clraychen/archive/2006/07/06/56944.html</link><dc:creator>离弦之ray的技术天空</dc:creator><author>离弦之ray的技术天空</author><pubDate>Thu, 06 Jul 2006 06:17:00 GMT</pubDate><guid>http://www.blogjava.net/clraychen/archive/2006/07/06/56944.html</guid><wfw:comment>http://www.blogjava.net/clraychen/comments/56944.html</wfw:comment><comments>http://www.blogjava.net/clraychen/archive/2006/07/06/56944.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/clraychen/comments/commentRss/56944.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/clraychen/services/trackbacks/56944.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<b style="mso-bidi-font-weight: normal">
						<span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">《</span>
						<span lang="EN-US" style="COLOR: blue">Head first design patterns</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span style="COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">》</span>
				</b>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一直被束之高阁，总算考完期末考试。然而，我却又要开始复习考研的东西了，整天看数学看的十分头晕，把这本书重新拿来看，权当连环画来看。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以前已经看过两章了，实在太过久远，只得重温一下。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">前面的</span>
				<span lang="EN-US">Introduction</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其实是非常有意思的，在这先不赘述了。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">介绍的第一个</span>
				<span lang="EN-US">Pattern </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</span>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="COLOR: blue">Strategy Pattern</span>
				</b>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过一个</span>
				<span lang="EN-US">duck</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的例子，在讲述</span>
				<span lang="EN-US">Strategy Pattern</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的过程中引出了三个</span>
				<span lang="EN-US">Design Principles</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">它们是：</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 57.75pt; TEXT-INDENT: -36.75pt; mso-list: l0 level1 lfo1; tab-stops: list 57.75pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="COLOR: blue; mso-fareast-font-family: 'Times New Roman'">
								<span style="mso-list: Ignore">1．<span style="FONT: 7pt 'Times New Roman'">              </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="COLOR: blue">Identify the aspects of your application that vary and separate them from what stays the same.<o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 57.75pt; TEXT-INDENT: -36.75pt; mso-list: l0 level1 lfo1; tab-stops: list 57.75pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="COLOR: blue; mso-fareast-font-family: 'Times New Roman'">
								<span style="mso-list: Ignore">2．<span style="FONT: 7pt 'Times New Roman'">              </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="COLOR: blue">Program to an interface, not an implementation.<o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 57.75pt; TEXT-INDENT: -36.75pt; mso-list: l0 level1 lfo1; tab-stops: list 57.75pt">
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="COLOR: blue; mso-fareast-font-family: 'Times New Roman'">
								<span style="mso-list: Ignore">3．<span style="FONT: 7pt 'Times New Roman'">              </span></span>
						</span>
				</b>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="COLOR: blue">Favor composition over inheritance.<o:p></o:p></span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt">
				<span lang="EN-US">Duck </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">例子完美地体现了以上三个</span>
				<span lang="EN-US">Principles</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一开始</span>
				<span lang="EN-US">Duck</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类是这样的，里面有三个方法：</span>
				<span lang="EN-US">quack(), swim() </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">display(), </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其它一些特殊的</span>
				<span lang="EN-US">Duck</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">子类继承这个父类，并重载</span>
				<span lang="EN-US">display</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法去显示各种不同种类的</span>
				<span lang="EN-US">Duck</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">现在需求变更，需要让一些</span>
				<span lang="EN-US">Duck</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">能够有飞的能力，理所当然地，在父类中加上了</span>
				<span lang="EN-US">fly()</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个方法。但一些不能飞的</span>
				<span lang="EN-US">Duck</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类却同时拥有了</span>
				<span lang="EN-US">fly()</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法，这显然是不对的。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可能有人提出解决的方法是重载那些不需要</span>
				<span lang="EN-US">fly()</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法的</span>
				<span lang="EN-US">duck</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的</span>
				<span lang="EN-US">fly()</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，让这个方法什么也不做，但你有没有想过如果这么处理，以后再加一些不需要一些方法的子类是不是很繁琐？</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也许又有人想到了，把</span>
				<span lang="EN-US">fly()</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">quack()</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提取出来，编程</span>
				<span lang="EN-US">interface</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。如果某个子类需要这个能力可以去</span>
				<span lang="EN-US">implement</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这个</span>
				<span lang="EN-US">interface</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有没有想过后果？每一个子类都要重写</span>
				<span lang="EN-US">fly()</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">quack(),OO</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的代码重用的特性荡然无存。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">那什么才是最好的解决之道呢？？？</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">书里面给出了答案。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">把</span>
				<span lang="EN-US">fly()</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">quack()</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">两个功能提取出来这个思路是对的。<b style="mso-bidi-font-weight: normal"><span style="COLOR: blue">这里体现了第一个</span></b></span>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="COLOR: blue">Principle</span>
				</b>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。首先声明</span>
				<span lang="EN-US">FlyBehavior() </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">QuackBehavior()</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">两个</span>
				<span lang="EN-US">interface</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，然后实现各种</span>
				<span lang="EN-US">fly</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">quack</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，比如</span>
				<span lang="EN-US">FlyWithWings, FlyNoWay</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；</span>
				<span lang="EN-US">Quack, Squeak</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等等。<b style="mso-bidi-font-weight: normal"><span style="COLOR: blue">这里体现了第二个</span></b></span>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="COLOR: blue">Principle</span>
				</b>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">现在的</span>
				<span lang="EN-US">Duck</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">父类已经变了，里面有两个私有变量</span>
				<span lang="EN-US">FlyBehavior fb,</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">QuackBehavior qb</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">Duck</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">父类甚至可以直接声明成</span>
				<span lang="EN-US">Abstract</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类，当有子类继承它的时候，可以在构造函数里给</span>
				<span lang="EN-US">fb</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">qb</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">初始化的时候直接赋给它需要的</span>
				<span lang="EN-US">fly</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">quack</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">种类。<b style="mso-bidi-font-weight: normal"><span style="COLOR: blue">这里体现了第三个</span></b></span>
				<b style="mso-bidi-font-weight: normal">
						<span lang="EN-US" style="COLOR: blue">Principle</span>
				</b>
				<span style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">小小的一个例子已经分析的那么专业，让我受益匪浅。好书！</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
<img src ="http://www.blogjava.net/clraychen/aggbug/56944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/clraychen/" target="_blank">离弦之ray的技术天空</a> 2006-07-06 14:17 <a href="http://www.blogjava.net/clraychen/archive/2006/07/06/56944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>