<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>RedSaga满江红</title>
    <description>本圈子是对RedSaga满江红开放技术研究组织的介绍，对近期活动的预告和对文档发布的通知。</description>
    <link>http://redsaga.group.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Spring Framework 2.5 Reference中文版正式发布</title>
        <author>DigitalSonic</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://digitalsonic.javaeye.com">DigitalSonic</a>&nbsp;
          链接：<a href="http://redsaga.group.javaeye.com/group/blog/209974" style="color:red;">http://redsaga.group.javaeye.com/group/blog/209974</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong><span style="font-size: small;">声明</span> </strong><br />Spring中文参考手册得到Spring Framework开发团队的直接授权和大力的支持，其目的是在中文世界推广优秀的开源技术。本次翻译活动由满江红开放技术研究组织(<a href="http://www.redsaga.com" target="_blank">http://www.redsaga.com</a> )和Spring中文论坛(<a href="http://spring.jactiongroup.net" target="_blank">http://spring.jactiongroup.net</a> ) 共同发起、组织。我们在此郑重宣布，本次翻译遵循原Spring Framework的授权协议，即Apache 2.0协议。在完整保留全部文本(包括本版权页)，并且不违反Apache 2.0协议的前提下，允许和鼓励任何人进行全文转载及推广，所有参与人员放弃除署名权外的一切权利。<br /><br /><strong><span style="font-size: small;">致谢</span> </strong><br />如此庞大的项目不是一两个组织可以独立完成的，就像Spring本身一样，涵盖了Java技术的方方面面。因为有了大家的关心和支持才使此次项目能够顺利完成。有理由相信，中文开源世界必将在不久的将来展现出更广阔的发展空间，希望大家都能为推动中国软件发展奉献出自己的一份力量。<br /><br />项目主页：<br /><a href="http://wiki.redsaga.com/confluence/display/Spring2/Spring2.5" target="_blank">http://wiki.redsaga.com/confluence/display/Spring2/Spring2.5</a> <br /><br />在线版本：<br /><a href="http://www.redsaga.com/spring_ref/2.5/html/" target="_blank">HTML</a> / <a href="http://www.redsaga.com/spring_ref/2.5/html_single/" target="_blank">HTML Single</a> <br /><br />下载地址：<br /><a href="http://www.redsaga.com/spring_ref/2.5/spring-reference.pdf" target="_blank">PDF(593页，4.41MB)</a> / <a href="http://www.redsaga.com/spring_ref/2.5/Spring-Reference_zh_CN.chm" target="_blank">CHM(2.08MB)</a> <br /><br />勘误表：<br /><a href="http://wiki.redsaga.com/confluence/pages/viewpage.action?pageId=3171" target="_blank">http://wiki.redsaga.com/confluence/pages/viewpage.action?pageId=3171</a> </p>
          <br/>
          <span style="color:red;">
            <a href="http://redsaga.group.javaeye.com/group/blog/209974#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Jul 2008 00:01:54 +0800</pubDate>
        <link>http://redsaga.group.javaeye.com/group/blog/209974</link>
        <guid>http://redsaga.group.javaeye.com/group/blog/209974</guid>
      </item>
      <item>
        <title>摘洋槐花</title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://redsaga.group.javaeye.com/group/blog/187361" style="color:red;">http://redsaga.group.javaeye.com/group/blog/187361</a>&nbsp;
          发表时间: 2008年04月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天上午比较忙 ，下午回到家里感觉有些累，躺到床上就睡着了，醒来时发现已经5点了，突然想起来紫金山上洋槐花已经开了，小时候在老家还摘过，好多年都没有吃过洋槐花做的蒸闷饭了，那个香啊，童年的美好时光又浮现在眼前，早上还打算着要摘些回来做饭吃，现在还没有行动呢。马上穿上衣服上山摘槐花，紫金山就离家不到300米的地方，几分钟就到了，看着高高的洋槐树，怎么摘呢，难道真的要爬树么，这样会把衣服弄得很脏而且很费力气了。先走走看看，看看是不是有比较矮的树，这样我就可以不必要花很大力气了，正在边走边转悠，突然发现在草丛中淹没着一个用来勾洋槐花的竹竿，哈哈，上天作美啊，得来全不费功夫啊，有了勾洋槐花的竹竿，摘槐花就不难了。正好看到远处一个比较容易勾的树，这个树上槐花繁茂，而且有几个树枝不高不粗，很容易勾。举起竹竿，勾住一个树枝，用力拉了一下，没有想到，竹竿上的铁丝钩太软，被拉直了，我只好把铁丝拧成麻花状，这样就硬些，然后再折成钩，再举起竹竿，勾住那个树枝，这次吸取教训 不能用力太猛，慢慢的拉下来，树枝慢慢的弯了下来，越来越弯，突然啪的一声，树枝终于断了，在用力拉一下，终于掉下来。这时候想到妻加班也快到家了吧，让她一起帮忙摘槐花，打电话正好她到小区，告诉妻后，我想这个树枝可能不够我们吃，再勾一个树枝吧。这时候在远处发现两个女子，她们也在摘槐花，不过她们没有工具，只是用脚垫起来伸着脖子去摘，但是由于树都很高，她们也没有摘多少，不一会她们走过来，一人拎着一个大袋，里面有少许槐花，一个说能不能用我这个竹竿借她们也勾一下，我欣然答应，告诉她们，等我把下一个树枝钩下来，就给她们，第二个树枝一会就勾下来了，这时候妻已经到了，我把袋子给她，让她先摘，我帮那两个人勾几个树枝后就回来一起摘，后来由于那个铁丝钩又软了，怎么也勾不下一个树枝，再看看妻那边，摘了半袋了，树枝上槐花还有很多，反正我们也摘不完，就请那两个女子一起摘，不一会我们的那个袋子就摘满了，我和妻开心的回家了。靠山吃山，靠氺吃水，这句话真没错。昨天晚上在阅读菜根谭时，书上说道要做到静，单纯的静其实很难做到，但是如果能寄情于物，全身心投入到某个事物上，并从中找到乐趣，反倒很容易入静，这就是借物以养心之静力，我想傍晚摘槐花难道不是寄情于物和借物以养心之静力吗？</p>
          <br/>
          <span style="color:red;">
            <a href="http://redsaga.group.javaeye.com/group/blog/187361#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 27 Apr 2008 21:27:57 +0800</pubDate>
        <link>http://redsaga.group.javaeye.com/group/blog/187361</link>
        <guid>http://redsaga.group.javaeye.com/group/blog/187361</guid>
      </item>
      <item>
        <title>Welcome to Open Source &amp; Drupal Camp Shanghai 2008</title>
        <author>YuLimin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yulimin.javaeye.com">YuLimin</a>&nbsp;
          链接：<a href="http://redsaga.group.javaeye.com/group/blog/187206" style="color:red;">http://redsaga.group.javaeye.com/group/blog/187206</a>&nbsp;
          发表时间: 2008年04月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="gmail_quote"><strong>Welcome to Open Source &amp; Drupal Camp Shanghai 2008!</strong><br /><br />OpenSourceCamp is delighted to invite you to attend the event 'Share OpenSource, What's the furture' taking place on May, 17th ShangHai.<br /><br /><strong>What:</strong><br />What is Open Source Camp Shanghai?<br />Open Source Camp is an invitation-based and unconference event that brings together open source developer, geek, entrepreneurs, academics, venture capitalists, technology influencer and Media for an intense user-created conference about open source, emerging technology topics. It's organized by the community, for the community. The event combines, sharing, learning, networking, and fun. Participants, who are experts and innovators in their fields, are also the presenters. We suggest you to join as an individual to share your ideas here, communicate with each other. The goal is to boost tech community and innovation around the world.<br />&nbsp;<strong><br />上海 Open Source Camp 是什么？</strong><br />Open Source Camp 将开源技术爱好者、极客、创业者、学者、风险投资商、有影响力的技术高手，甚至媒体都聚集一起，在紧凑的会上大家广泛讨论开源文化与技术热点一种活动形式。这样的会议是由整个社区所有人一起参与组织的，为所有这些人准备的。与会者通常自由组队讨论，相互学习并分享、交际，同时享受其中的乐趣，他们中的专家与创新发起者同时也可能是主讲人。我们希望大家以个人的身份（而非公司代表）会见其它参与者，表达个人看法，并与他们进行交流。会议的目的通常是推动社区内甚至全世界范围内的技术创新。<br /><strong><br />What's DruaplCamp Shanghai? </strong><br />Drupal Camp Shanghai is a volunteer-organized, peer taught, multi-track conference focused on the Drupal open source content management system. The event will bring experts and rookies alike from all facets of web communications including developers, information architects, designers and themers, as well as entrepreneurs, marketers, non-profit groups, and other users of Drupal.<br /><strong></strong></div>
<div class="gmail_quote"><strong>上海 Drupal Camp 是什么？</strong><br />上海 Drupal Camp 是由志愿者组织的，由与会者互相帮助，在多个分会场同时讨论 Drupal 开源内容管理系统相关话题的聚会。活动将同时吸引网站设计开发方面的开发人员、信息构架师、产品设计、界面美工中的专家与新手，同时也会融合入本地的创业者、营销人员、非盈利性组织，以及其他 Drupal 爱好者。<br /><br /><strong>Why are we doing a joint event?</strong><br />To simply put it! Save time and energy. OSCamp is a format to let community meetup, it's the community of community , which is composed of technology evangelists who are also active in the open source community, Well, drupal is build on the concept that form open source software development it was more than logical to combined the two event and bring the two communities together. We hope this will be a foundation piece for many more open source collaboration between the various technologies and communities.<br /><br /><strong>为什么与我们合办这次Camp？</strong><br />是为了让事情简单！咱们可以为大家节省出时间与精力。 OSCamp是社区之间进行交流的一种活动形式，它是社区中的社区，OSCamp的参与者是由活跃在开源社区的技术参与贡献者组成，同时Drupal 是全部构建在开放源代码的开发基础上，所以将开源爱好者社区与 Drupal 爱好者社区联系起来是很自然的一件事。我们希望这会成为更多技术与社区间实现开源合作的榜样与基石。<br /><strong><br />When:&nbsp; </strong><br />Time: <br />Day 1: OpenSource Camp Event 5.17 13:00 -- 19:00<br />Day 2: Druapl Camp Event 5.18 10:00 -- 18:00<br />&nbsp;<br /><strong>时间:</strong><br />第一天 OSCamp 活动 5.17 下午1点 --- 下午7点<br />第二天: Druapl Camp 活动 5.18 上午10点 --- 下午6点<br />How to Register? <br />1) If you want to attend OSCamp event just send an email to the following address:<br />&nbsp;<br />opensourcecamp&lt;at&gt;<a href="http://gmail.com/" onclick="return top.js.OpenExtLink(window,event,this)" target="_blank">gmail.com</a><br /><br />This mail should contain:<br />* Your name<br />* Your email address<br />* Your website or blog (if you have any)<br />* Your interesting 3 tags(e.g. open source , climbing, networking)<br />* Your Recommended People<br />* Session(s) you'd like to lead<br />If you want to give a presentation at 8 minutes project show, please metioned in your email<br />2) If you want to attend DrupalCamp, please register here<br /><a href="http://www.drupalcampshanghai.org/en/user/register" onclick="return top.js.OpenExtLink(window,event,this)" target="_blank">http://www.drupalcampshanghai.org/en/user/register</a><br /><br /><br /><strong>如何注册</strong><br />1) 如果你想参加OSCamp 活动，请发送邮件到一下地址，opensourcecamp&lt;at&gt;<a href="http://gmail.com/" onclick="return top.js.OpenExtLink(window,event,this)" target="_blank">gmail.com</a><br />你的邮件必须包含以下信息<br />* 您的名字<br />* 您的邮件地址<br />* 您的网站或博客地址(如果您有)<br />* 您感兴趣的3个Tag(例如. open source , climbing, networking)<br />* 你的推荐人名字<br />* 你所想将的主题<br />如果您想参加会议开始时的8分钟项目秀，请提前在Email中说明<br />2) 如果你想参加DrupalCamp 活动，请到这里注册<br /><a href="http://www.drupalcampshanghai.org/en/user/register" onclick="return top.js.OpenExtLink(window,event,this)" target="_blank">http://www.drupalcampshanghai.org/en/user/register</a><br /><br /><br /><strong>How Much</strong><br /><br />50 RMB per person (Includes cost share on venue, a t-shirt, in order to encouage more<br />girls to join open source, oscamp will give a special girl-edition t-shirt to open source girls,:) )<br /></div>
<div class="gmail_quote"><strong>参会费用: </strong><br />50 RMB/人 (包含场地费分摊，纪念T恤一件, 为了鼓励更多的女性参与开源，OSCamp 活动将额外赠送给参加活动的女生每人一件女生版的T-Shirt) <br /><br /><br /><strong>Where:</strong><br />Venue: River South Creative Park<br />Address: 1247 Nan Suzhou Road (Suzhou Road South)<br /><a href="http://drupalcampshanghai.org/sites/drupalcampshanghai.org/files/address_small_apr21.jpg" onclick="return top.js.OpenExtLink(window,event,this)" target="_blank">Map:</a><br />&nbsp;<br /><strong>在哪举行:</strong><br />地点：上海南岸艺术中心 3 搂<br />地址：上海市南苏州路 1247 号<br /><a href="http://drupalcampshanghai.org/sites/drupalcampshanghai.org/files/address_small_apr21.jpg" onclick="return top.js.OpenExtLink(window,event,this)" target="_blank">地图</a><br /></div>
          <br/>
          <span style="color:red;">
            <a href="http://redsaga.group.javaeye.com/group/blog/187206#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 26 Apr 2008 23:47:47 +0800</pubDate>
        <link>http://redsaga.group.javaeye.com/group/blog/187206</link>
        <guid>http://redsaga.group.javaeye.com/group/blog/187206</guid>
      </item>
      <item>
        <title>有感于新疆罗布泊发现巨型地下水库 库容量与三峡相当</title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://redsaga.group.javaeye.com/group/blog/182968" style="color:red;">http://redsaga.group.javaeye.com/group/blog/182968</a>&nbsp;
          发表时间: 2008年04月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天看到一则新闻，“新疆南部的塔里木盆地是中国地表最干旱的地区，幸运的是该盆地地下，不仅储藏着石油，还拥有巨大的地下水资源，地质工作者相继在塔里木盆地北缘和罗布泊发现与三峡水库库容相当的“地下水库”。这些水资源如果合理开采，能有效地缓解当地用水矛盾”。据地质学家考证，当年新疆罗布泊沙漠曾经是海洋，现今确是茫茫沙海。然而昔日的贫瘠沙海将不贫瘠，将不在是不毛之地，因为找到了水，发现了石油，他将会成为新疆的一个新的增长极。从这则新闻我更加感慨沧海桑田，世事轮回，乾坤无常，这个世界上唯有不变的是变化。周易认为大千世界都是在64卦中循回，每时每刻每种事物都处于自己卦象中，这个卦的时间也许是一天也许是一年也许是一万年，但是卦象总会更替，昔日的塔里木盆地可能处于困卦或者其他很不好的卦象，但是经过人们的努力，他已经脱离的困卦，在今天石油就是黄金，有了石油又有了水，我想塔里木明天肯定会很好，也许真的会出现一个新的塞外小江南。有时候人们处于象塔里木过去那样除了沙子什么都没有的困境，但是只要静静的等待，默默地坚持，总有一天自己也会发现自己的石油和地下水库。
          <br/>
          <span style="color:red;">
            <a href="http://redsaga.group.javaeye.com/group/blog/182968#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 15 Apr 2008 17:20:14 +0800</pubDate>
        <link>http://redsaga.group.javaeye.com/group/blog/182968</link>
        <guid>http://redsaga.group.javaeye.com/group/blog/182968</guid>
      </item>
      <item>
        <title>浅谈DAO工厂设计模式</title>
        <author>yongtree</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yongtree.javaeye.com">yongtree</a>&nbsp;
          链接：<a href="http://redsaga.group.javaeye.com/group/blog/182470" style="color:red;">http://redsaga.group.javaeye.com/group/blog/182470</a>&nbsp;
          发表时间: 2008年04月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          随着软件分层设计的流行及广泛的应用，对于DAO的设计模式大家已经不再陌生了，DAO层已经在软件系统的开发中成为必不可少的一层，将后台的数据层和前台的VO进行分离。前段时间也针对于DAO的设计介绍过一个基于Hibernate的泛型DAO的设计。<br />csdn blog：http://blog.csdn.net/yongtree/archive/2008/03/12/2172071.aspx<br />javaeye blog：http://yongtree.javaeye.com/blog/170449<br /> <br />      通过DAO的设计的确可以让我们的软件系统已经将数据层和表现层进行了简单的分离，让我们系统各层次的功能更加的清晰。所以我们开始洋洋得意了，DAO的引入让系统的耦合性更加的松散，表现层再也不需要关心后台数据操作的变化了。于是我们开始高枕无忧了，我们肆无忌惮的在表现层通过调用DAO来实现我们的系统了。事实真的如此吗？那我们就举个例子来看看我们的系统是否真的具有解偶的能力了。<br />      现在我们有个员工管理系统，在该系统中，Person.java表示员工这个对象，它对应着数据库中的person表。还有用于操作Person对象的DAO接口—PersonDAO.java，还有一个PersonDAO的实现类PersonDAOImpl.java。在PersonDAOImpl.java中我们实现了操作Person对象的所有的方法。我们很自豪的说，看我们已经把操作封装在PersonDAO中了，现在我们可以在表现层（jsp，或者VO操作类中）使用PersonDAO personDAO=new PersonDAOImpl()来调用DAO操作我们的数据对象了。当我们陶醉于自己写的优美的代码的时候，项目经理来通知了，由于使用Hibernate的效率偏低，客户开始不满了，还是让我们重新用JDBC再重写一遍吧。于是所有DAO的Hibernate实现开始全部转换成JDBC实现。但是项目经理建议不要破坏现有的Hibernate实现，以后可以通过技术研究来提升Hibernate的访问效率。于是我们开始写了又写了一套JDBC的实现—PersonDAOJDBCImpl.java，现在问题出来了，表现层大量的使用了PersonDAO personDAO=new PersonDAOImpl()，全部改成new PersonDAOJDBCImpl()谈何容易，我们是不是开始欲哭无泪了。<br />      怎么解决类似的问题呢？于是我们开始引进工厂模式。我们建立一个类DaoFactory.java对DAO进行统一管理。<br />DaoFactory.java:<br />      public class DaoFactory{<br />      public static PersonDAO getPersonDAOInstance()<br />      {<br />           return new PersonDAOImpl() ;<br />      }<br />      //得到其他的DAO实例<br />      ……<br />}<br />表现层通过PersonDAO personDAO=DaoFactory.get getPersonDAOInstance();来实例化DAO实例。这样问题就解决了，DAO改变了，我们只需要在DAO工厂类中修改一下代码：return new PersonDAOJDBCImpl() ;那我们的应用就快速切换到JDBC实现了。可见利用工厂模式，我们的系统又进一步的解耦，表现层真的无需再关系DAO层的变化了，一切交给DAO工厂来解决。<br />使用过Spring这样框架的开发人员都知道，Spring通过利用IoC来实现类之间的解耦。其实在DAO工厂中我们也可以简单的借鉴一下IoC的思想，更进一步解除类之间的耦合。Spring是通过配置xml文件来进行IoC的，那么我们也可以借助于xml文件来实现。比如下面的xml：<br />&lt;?xml version="1.0"?><br />&lt;config><br />    &lt;daos><br />       &lt;!-- 组织机构服务接口实现类 --><br />       &lt;dao id="organizationService"<br />           type="com.baiyyy.oa.services.organization.OrganizationServiceImpl"><br />       &lt;/dao><br />       &lt;!-- 工作流参与者接口 --><br />       &lt;dao id="participantService"<br />           type="com.baiyyy.workflow.services.impl.ParticipantServiceImpl"><br />       &lt;/dao><br />       &lt;!-- 工作流定义接口 --><br />       &lt;dao id="processDefinitionService"<br />           type="com.baiyyy.workflow.services.impl.ProcessDefinitionServiceImpl"><br />       &lt;/dao><br />       &lt;!-- 工作流实例接口 --><br />       &lt;dao id="processInstanceService"<br />           type="com.baiyyy.workflow.services.impl.ProcessInstanceServiceImpl"><br />       &lt;/dao><br />    &lt;/daos><br />&lt;/config><br />这是我设计实现的工作流系统给业务系统提供的接口所配置的xml，所有的接口都配置在xml中，我们怎么使用呢？我只不过是把DAO工厂进行进一步的改进，通过ProcessInstanceService processInstanceService=DaoFactory.getDao(ProcessInstanceService.class,” processInstanceService”);从传入的参数我们可以看出，我们清楚的知道要调用的接口ProcessInstanceService，同时通过字符串” processInstanceService”，我们可以解析上面的配置文件，得到具体实现类的路径，通过反射得到该实现类的实例。具体的DAO工厂类的实现，朋友们有兴趣可以自己去实现，我就不详细介绍了。<br />      终于写完了，以上便是对DAO工厂一些浅显的理解。现在正在学习设计模式，以后会根据自己的所学所思，介绍自己对各个设计模式的理解，希望大家一块学习讨论。<br /> <br />yongtree  2008-4-14 晚
          <br/>
          <span style="color:red;">
            <a href="http://redsaga.group.javaeye.com/group/blog/182470#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 14 Apr 2008 09:28:14 +0800</pubDate>
        <link>http://redsaga.group.javaeye.com/group/blog/182470</link>
        <guid>http://redsaga.group.javaeye.com/group/blog/182470</guid>
      </item>
      <item>
        <title>红灯思</title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://redsaga.group.javaeye.com/group/blog/180248" style="color:red;">http://redsaga.group.javaeye.com/group/blog/180248</a>&nbsp;
          发表时间: 2008年04月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          每天，在上班路上，我总是要时不时注视一下远方，看看是不是有红灯，如果远远看到了红灯，我的车就要减速，然后慢慢停下，如果发现马上就是红灯了我也会停下来，等待，直到红灯成为绿灯。我在想，其实生活中我们会经常遇到红灯，我们会停 下来吗。今年cctv 有一个感动中国节目，评选了一个军校的老师为2007十大感动中国人物，这个人的获选，很大意义上 是原由他在身患重病时还坚持工作，好像写出了一部书，他由于病情严重已经不能去cctv领奖了，听他老婆说他已经把他的后事都安排好了。他的行为让我反省，他是不是应该这样？当身患重病时候是应该养病呢还是继续工作，留得青山在不愁没柴烧，当身体很有问题时候，意味着身体已经亮了红灯，应该停下来了好好休养身体了，继续坚持其他事情是否值得。人当遇到红灯时必须停下，如果继续前进，事与愿违，后果不堪设想 。有时 人们遇到红灯却全然不知，这时候一样很危险，因此在生活中要不时地留意身边是否有红灯，并且要善于发现隐蔽的红灯，红灯发现的越早越好，越早越容易停住。其实很多人都不希望遇到红灯，但是谁也决定不了是不是要遇到红灯和什么时候会遇到红灯，有些人遇到红灯焦急的等待，焦急地等待难到红灯会马上变成绿灯吗，对待红灯只能顺其自然，随遇而安，别无他法 。在周易里有一卦 说如果遇到此卦，做什么都不好，唯一可以做的是什么也不做，等待，等待情况的转变，否则做什么都不成。这一卦说的情况和遇到红灯的情况 是一样的。
          <br/>
          <span style="color:red;">
            <a href="http://redsaga.group.javaeye.com/group/blog/180248#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 07 Apr 2008 18:49:37 +0800</pubDate>
        <link>http://redsaga.group.javaeye.com/group/blog/180248</link>
        <guid>http://redsaga.group.javaeye.com/group/blog/180248</guid>
      </item>
      <item>
        <title>工厂方法 读书笔记</title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://redsaga.group.javaeye.com/group/blog/179244" style="color:red;">http://redsaga.group.javaeye.com/group/blog/179244</a>&nbsp;
          发表时间: 2008年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          工厂发法定义了一个创建对象的接口或者抽象类，但是有子类来决定要实例化的类是哪一个，工厂方法让类把实例化 推迟到子类。<br /><img src="http://blufiles.storage.live.com/y1pZ1u4rC44uCjZnwn46CaeGatIYIVB2-kneM5uFiuWN2LPHcCNKKad7yDx_tV-pBhfOV1ouAqWI0c" /><br /><pre name="code" class="java">package pattern;
import java.util.ArrayList;
public abstract class PizzaStore {
 SimplePizzaFactory factory;
 public PizzaStore() {
 }
 public PizzaStore(SimplePizzaFactory factory) {
  this.factory = factory;
 }
 public Pizza orderPizza(String type) {
  Pizza pizza;
  pizza = createPizza(type);
  pizza.prepare();
  pizza.bake();
  pizza.cut();
  pizza.box();
  return pizza;
 }
 abstract Pizza createPizza(String type);
}
class NYPizzaStore extends PizzaStore {
 Pizza createPizza(String item) {
  if (item.equals("cheese")) {
   return new NYStyleCheesePizza();
  } else if (item.equals("pepperoni")) {
   return new NYStylePepperoniPizza();
  } else if (item.equals("clam")) {
   return new NYStyleClamPizza();
  } else if (item.equals("veggie")) {
   return new NYStyleVeggiePizza();
  } else
   return null;
 }
}
class ChicagoPizzaStore extends PizzaStore {
 Pizza createPizza(String item) {
  if (item.equals("cheese")) {
   return new ChicagoStyleCheesePizza();
  } else if (item.equals("pepperoni")) {
   return new ChicagoStylePepperoniPizza();
  } else if (item.equals("clam")) {
   return new ChicagoStyleClamPizz();
  } else if (item.equals("veggie")) {
   return new ChicagoStyleVeggiePizza();
  } else
   return null;
 }
}
class CaliforniaPizzaStore extends PizzaStore {
 Pizza createPizza(String item) {
  if (item.equals("cheese")) {
   return new CaliforniaStyleCheesePizza();
  } else if (item.equals("pepperoni")) {
   return new CaliforniaStylePepperoniPizza();
  } else if (item.equals("clam")) {
   return new CaliforniaStyleClamPizza();
  } else if (item.equals("veggie")) {
   return new CaliforniaStyleVeggiePizza();
  } else
   return null;
 }
}
abstract class Pizza {
 String name;
 String dough;
 String sauce;
 ArrayList toppings = new ArrayList();
 public void prepare() {
  System.out.println("Preparing" + name);
  System.out.println("Tossing dough...");
  System.out.println("Adding sauce...");
  System.out.println("Adding toppings: ");
  for (int i = 0; i &lt; toppings.size(); i++) {
   System.out.println("   " + toppings.get(i));
  }
 }
 public void bake() {
  System.out.println("Bake for 25 minutes at 350");
 }
 public void cut() {
  System.out.println("Cutting the pizza into diagonal slices");
 }
 public void box() {
  System.out.println("Place pizza in official PizzaStore box");
 }
 public String getName() {
  return name;
 }
}
class CheesePizza extends Pizza {
 public CheesePizza() {
  System.out.println("Cheesepizza");
 }
}
class NYStyleCheesePizza extends Pizza {
 public NYStyleCheesePizza() {
  name = "NY Style sauce and Cheese Pizza";
  dough = "Thin Crust Dough";
  sauce = "Marinara Sauce";
  toppings.add("Grated Reggiano Cheese");
 }
}
class ChicagoStyleCheesePizza extends Pizza {
 public ChicagoStyleCheesePizza() {
  name = "Chicago StyleDeep Dish Cheese Pizza";
  dough = "Extra Thick Crust Dough";
  sauce = "Plum Tomato Sauce";
  toppings.add("Shredded Mozzarella Cheese");
 }
 public void cut() {
  System.out.println("Cutting the pizza into square slices");
 }
}
class CaliforniaStyleCheesePizza extends Pizza {
 public CaliforniaStyleCheesePizza() {
  name = "California Style sauce and Cheese Pizza";
  dough = "Thin Crust Dough";
  sauce = "Marinara Sauce";
  toppings.add("Grated California Cheese");
 }
}
class PepperoniPizza extends Pizza {
 public PepperoniPizza() {
  System.out.println("PepperoniPizza");
 }
}
class NYStylePepperoniPizza extends Pizza {
 public NYStylePepperoniPizza() {
  name = "NY Style sauce and Cheese Pizza";
  dough = "Thin Crust Dough";
  sauce = "Marinara Sauce";
  toppings.add("Grated Pepperoni Cheese");
 }
}
class ChicagoStylePepperoniPizza extends Pizza {
 public ChicagoStylePepperoniPizza() {
  name = "Chicago StyleDeep Dish Cheese Pizza";
  dough = "Extra Thick Crust Dough";
  sauce = "Plum Tomato Sauce";
  toppings.add("Shredded Pepperoni Cheese");
 }
 public void cut() {
  System.out.println("Cutting the pizza into square slices");
 }
}
class CaliforniaStylePepperoniPizza extends Pizza {
 public CaliforniaStylePepperoniPizza() {
  name = "California Style sauce and Cheese Pizza";
  dough = "Thin Crust Dough";
  sauce = "Marinara Sauce";
  toppings.add("Grated Pepperoni Cheese");
 }
}
class ClamPizza extends Pizza {
 public ClamPizza() {
  System.out.println("ClamPizza");
 }
}
class NYStyleClamPizza extends Pizza {
 public NYStyleClamPizza() {
  name = "NY Style sauce and Cheese Pizza";
  dough = "Thin Crust Dough";
  sauce = "Marinara Sauce";
  toppings.add("Grated ClamPizza Cheese");
 }
}
class ChicagoStyleClamPizz extends Pizza {
 public ChicagoStyleClamPizz() {
  name = "Chicago StyleDeep Dish Cheese Pizza";
  dough = "Extra Thick Crust Dough";
  sauce = "Plum Tomato Sauce";
  toppings.add("Shredded Clam Cheese");
 }
 public void cut() {
  System.out.println("Cutting the pizza into square slices");
 }
}
class CaliforniaStyleClamPizza extends Pizza {
 public CaliforniaStyleClamPizza() {
  name = "California Style sauce and Cheese Pizza";
  dough = "Thin Crust Dough";
  sauce = "Marinara Sauce";
  toppings.add("Grated Clam Cheese");
 }
}
class VeggiePizza extends Pizza {
 public VeggiePizza() {
  System.out.println("VeggiePizza");
 }
}
class NYStyleVeggiePizza extends Pizza {
 public NYStyleVeggiePizza() {
  name = "NY Style sauce and Cheese Pizza";
  dough = "Thin Crust Dough";
  sauce = "Marinara Sauce";
  toppings.add("Grated VeggiePizza Cheese");
 }
}
class ChicagoStyleVeggiePizza extends Pizza {
 public ChicagoStyleVeggiePizza() {
  name = "Chicago StyleDeep Dish Cheese Pizza";
  dough = "Extra Thick Crust Dough";
  sauce = "Plum Tomato Sauce";
  toppings.add("Shredded Veggie Cheese");
 }
 public void cut() {
  System.out.println("Cutting the pizza into square slices");
 }
}
class CaliforniaStyleVeggiePizza extends Pizza {
 public CaliforniaStyleVeggiePizza() {
  name = "California Style sauce and Cheese Pizza";
  dough = "Thin Crust Dough";
  sauce = "Marinara Sauce";
  toppings.add("Grated Veggie Cheese");
 }
}
 
 
public class PizzaTestDrive {
 public static void main(String[] args) {
  PizzaStore nyStore = new NYPizzaStore();
  PizzaStore chicagoStore = new ChicagoPizzaStore();
  Pizza pizza = nyStore.orderPizza("cheese");
  System.out.println("Ethan ordered a " + pizza.getName() + "\n");
  pizza = chicagoStore.orderPizza("cheese");
  System.out.println("Joel ordered a " + pizza.getName() + "\n");
 }
}
 
 
public class SimplePizzaFactory {
 public Pizza createPizza(String type) {
  Pizza pizza = null;
  if (type.equals("cheese")) {
   pizza = new CheesePizza();
  }else if(type.equals("pepperoni")){
   pizza=new PepperoniPizza();
  }else if(type.equals("clam")){
   pizza=new ClamPizza();
  }else if(type.equals("veggie")){
   pizza=new VeggiePizza();
  }  
  return pizza;
 }
}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://redsaga.group.javaeye.com/group/blog/179244#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Apr 2008 14:27:40 +0800</pubDate>
        <link>http://redsaga.group.javaeye.com/group/blog/179244</link>
        <guid>http://redsaga.group.javaeye.com/group/blog/179244</guid>
      </item>
      <item>
        <title>装饰者模式 读书笔记</title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://redsaga.group.javaeye.com/group/blog/179242" style="color:red;">http://redsaga.group.javaeye.com/group/blog/179242</a>&nbsp;
          发表时间: 2008年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div>
<pre name="code" class="java"> package pattern; 
public class StarbuzzCoffee { 
public static void main(String args[]) { 
Beverage beverage = new Espresso(); 
System.out.println(beverage.getDescription() + "$" + beverage.cost(0.5)); 
Beverage beverage2 = new DarkRoast(); 
beverage2 = new Mocha(beverage2); 
beverage2 = new Mocha(beverage2); 
beverage2 = new Whip(beverage2); 
System.out.println(beverage2.getDescription() + "$" + beverage2.cost(0.5)); 
Beverage beverage3 = new HouseBlend(); 
beverage3.setDiscounts(true); 
beverage3.setSize(beverage.TALL); 
beverage3 = new Soy(beverage3); 
beverage3 = new Mocha(beverage3); 
beverage3 = new Whip(beverage3); 
System.out.println(beverage3.getDescription() + "$" + beverage3.cost(0.5)); 
} 
} 
abstract class Beverage { 
public static int TALL = 10; 
public static int GRANDE = 20; 
public static int VENTI = 30; 
public int size = VENTI; 
public boolean isDiscounts=false; 

public int getSize() { 
return size; 
} 
public void setSize(int insize) { 
size = insize; 
} 
String description = "Unknown Beverage"; 
public String getDescription() { 
return description; 
} 
public abstract double cost(double discounts); 
public boolean isDiscounts() { 
return isDiscounts; 
} 
public void setDiscounts(boolean isDiscounts) { 
this.isDiscounts = isDiscounts; 
} 
} 
abstract class CondimentDecorator extends Beverage { 
public abstract String getDescription(); 
} 
class Espresso extends Beverage { 
public Espresso() { 
description = "Espresso"; 
} 
public double cost(double discounts) { 
if(isDiscounts){ 
return 1.99*discounts; 
} 
return 1.99; 
} 
} 
class DarkRoast extends Beverage { 
public DarkRoast() { 
description = "DarkRoast"; 
} 
public double cost(double discounts) { 
if(isDiscounts){ 
return 0.99*discounts; 
} 
return 0.99; 
} 
} 
class HouseBlend extends Beverage { 
public HouseBlend() { 
description = "House Blend Coffee"; 
} 
public double cost(double discounts) { 
if(isDiscounts){ 
return .89*discounts; 
} 
return .89; 
} 
} 
class Mocha extends CondimentDecorator { 
Beverage beverage; 
public Mocha(Beverage beverage) { 
this.beverage = beverage; 
} 
public String getDescription() { 
return beverage.getDescription() + ",Mocha"; 
} 
public double cost(double discounts) { 
return .20 + beverage.cost(discounts); 
} 
} 
class Whip extends CondimentDecorator { 
Beverage beverage; 
public Whip(Beverage beverage) { 
this.beverage = beverage; 
} 
public String getDescription() { 
return beverage.getDescription() + ",Whip"; 
} 
public double cost(double discounts) { 
return .20 + beverage.cost(discounts); 
} 
} 
class Soy extends CondimentDecorator { 
Beverage beverage; 
public Soy(Beverage beverage) { 
this.beverage = beverage; 
} 
public int getSize() { 
return beverage.getSize(); 
} 
public String getDescription() { 
return beverage.getDescription() + ",Soy"; 
} 
public double cost(double discounts) { 
double cost = beverage.cost(discounts); 
if (getSize() == Beverage.TALL) { 
cost += .10; 
} else if (getSize() == Beverage.GRANDE) { 
cost += .15; 
} else if (getSize() == Beverage.VENTI) { 
cost += .20; 
} 
return cost; 
} 
}</pre>
&nbsp;装饰着模式--动态地讲责任附加到对象上。想要扩展功能，装饰着提供有别于继承的另一种选择。</div>
<div>继承属于扩展形式之一，但是不见得是达到弹性设计的最佳方案。</div>
<div>在我们的设计中，应该允许行为可以被扩展，而无须修改现有代码。</div>
<div>组和合委托可用于在运行时动态地加上新的行为。</div>
<div>除了继承装饰着模式也可以让我们扩展行为。</div>
<div>装饰者模式意味着一群装饰者类，这些类用来包装具体组件。</div>
<div>装饰者 可以在被被装饰者的行为前面或者与后面加上自己的行为，甚至将被装饰者的行为整个替换，而达到特定的目的。</div>
<div>可以用无数的装饰者包装一个组件。</div>
<div>装饰者一般对组件的客户是透明的，除非客户程序依赖于组件的具体类型。</div>
<div>装饰者会导致设计中出现很多小对象，如果过度使用，会让程序变得复杂。</div>
<div>装饰者模式 有点类似墙壁和染料，墙壁类似被装饰者，染料类似装饰者，我们可以给墙上涂上无穷的染料，而改变墙壁的颜色。或者类似人和衣服， 人为被装饰者 ，衣服为装饰者，衣服不停装饰人，人的外形就会改变，如果衣服有飞的功能，那么人就会飞了。</div>
<div><img src="http://blufiles.storage.live.com/y1pZ1u4rC44uCgGHXdceMB67dKIF6xRCqjt0-pnrST4D3d3o6lYbah9d9U6tXyZf6OkWVZEGzKL-yM" border="0" height="400" alt="" width="533" /><br /></div>
          <br/>
          <span style="color:red;">
            <a href="http://redsaga.group.javaeye.com/group/blog/179242#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Apr 2008 14:25:50 +0800</pubDate>
        <link>http://redsaga.group.javaeye.com/group/blog/179242</link>
        <guid>http://redsaga.group.javaeye.com/group/blog/179242</guid>
      </item>
      <item>
        <title>观察者模式（读书笔记）</title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://redsaga.group.javaeye.com/group/blog/178535" style="color:red;">http://redsaga.group.javaeye.com/group/blog/178535</a>&nbsp;
          发表时间: 2008年04月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><img src="../../../topics/download/6990e813-a0c7-3555-a316-9b84a610f7b8" border="0" height="632" alt="" width="800" /><img src="../../../topics/download/937b870b-ca04-3abe-9c88-3ceef021a216" border="0" height="1" alt="" width="1" /><img src="../../../topics/download/937b870b-ca04-3abe-9c88-3ceef021a216" border="0" height="1" alt="" width="1" />观察者模式定义了对象之间的一对多依赖，这样一来当一个对象改变状态时，他的所有依赖着都会收到通知改变状态。 <br />观察者模式 有点类似 打草惊蛇，一石双鸟。对主题进行扩展，不会影响观察者，添加观察者也业不会影响主题。 <br /><img src="../../../topics/download/937b870b-ca04-3abe-9c88-3ceef021a216" border="0" height="1" alt="" width="1" /><img src="../../../topics/download/6990e813-a0c7-3555-a316-9b84a610f7b8" border="0" height="1" alt="" width="1" /><br />1.观察者模式定义了对象之间一对多的关系。 <br />2。主题（也就是可观察者）用一个共同的接口来更新观察者 <br />3。观察者和可观察者之间用松耦合方式结合，可观察者不知道观察者的细节，只知道观察者实现了观察者接口。 <br />4 。使用此模式时，你可以被观察者处推或者拉数据。然而推的方式被认为更正确。 <br />5。有多个观察者时，不可以依赖特定的通知次序。 <br />6。java 有多种观察者模式的实现，包括了通用的java。util。Observable <br />7。要注意java。util。Observable 实现上所带来的问题。 <br />8。如果有必要的话，可以实现自己的Observable，这并不难。 <br />9。Swing大量使用观察者模式。许多GUI框架也是如此 <br />10。此模式也被应用在许多地方 <br /><br />package pattern; <br />import java.util.ArrayList; <br />public class WeatherStation { <br />public static void main(String[] args) { <br />WeatherData weatherData = new WeatherData(); <br />CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay( <br />weatherData); <br />ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData); <br />weatherData.setMeasurements(80, 65, 30.4f); <br />} <br />} <br />interface Observer { <br />public void update(float temp, float humidity, float pressure); <br />} <br />interface Subject { <br />public void registerObserver(Observer o); <br />public void removeObserver(Observer o); <br />public void notifyObservers(); <br />} <br />interface DisplayElement { <br />public void display(); <br />} <br />class WeatherData implements Subject { <br />private ArrayList observers; <br />private float temperature; <br />private float humidity; <br />private float pressure; <br />public WeatherData() { <br />observers = new ArrayList(); <br />} <br />public void registerObserver(Observer o) { <br />observers.add(o); <br />} <br />public void removeObserver(Observer o) { <br />int i = observers.indexOf(o); <br />if (i &gt;= 0) { <br />observers.remove(i); <br />} <br />} <br />public void notifyObservers() { <br />for (int i = 0; i &lt; observers.size(); i++) { <br />Observer observer = (Observer) observers.get(i); <br />observer.update(temperature, humidity, pressure); <br />} <br />} <br />public void measurementsChanged() { <br />this.notifyObservers(); <br />} <br />public void setMeasurements(float temperature, float humidity, <br />float pressure) { <br />this.temperature = temperature; <br />this.humidity = humidity; <br />this.pressure = pressure; <br />this.measurementsChanged(); <br />} <br />} <br />class CurrentConditionsDisplay implements Observer, DisplayElement { <br />private float temperature; <br />private float humidity; <br />private Subject weatherData; <br />public CurrentConditionsDisplay(Subject weatherData) { <br />this.weatherData = weatherData; <br />weatherData.registerObserver(this); <br />} <br />public void update(float temperature, float humidity, float pressure) { <br />this.temperature = temperature; <br />this.humidity = humidity; <br />this.display(); <br />} <br />public void display() { <br />System.out.println("Current conditions:" + temperature <br />+ "F degrees and" + humidity + "%humidity"); <br />} <br />} <br />class ForecastDisplay implements Observer, DisplayElement { <br />private float currentPressure = 29.92f; <br />private float lastPressure; <br />private Subject weatherData; <br />public ForecastDisplay(Subject weatherData) { <br />this.weatherData = weatherData; <br />weatherData.registerObserver(this); <br />} <br />public void update(float temperature, float humidity, float pressure) { <br />this.currentPressure = pressure; <br />this.display(); <br />} <br />public void display() { <br />System.out.println("Current conditions:" + currentPressure); <br />} <br />} <br /><br /><br /><br /><br /><br />package pattern; <br />import java.awt.BorderLayout; <br />import java.awt.event.ActionEvent; <br />import java.awt.event.ActionListener; <br />import javax.swing.JButton; <br />import javax.swing.JFrame; <br />public class SwingOberverExample { <br />JFrame frame; <br />public static void main(String[] args){ <br />SwingOberverExample example =new SwingOberverExample(); <br />example.go(); <br />} <br />public void go(){ <br />frame=new JFrame(); <br />JButton button=new JButton("Shoule I do it?"); <br />button.addActionListener(new AngelListener()); <br />button.addActionListener(new DevilListener()); <br />frame.getContentPane().add(BorderLayout.CENTER,button); <br />} <br />} <br />class AngelListener implements ActionListener{ <br />public void actionPerformed(ActionEvent event){ <br />System.out.println("Don't do it,you might regret it!"); <br />} <br />} <br />class DevilListener implements ActionListener{ <br />public void actionPerformed(ActionEvent event){ <br />System.out.println("Come on,do it!"); <br />} <br />} <br /></p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://redsaga.group.javaeye.com/group/blog/178535#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Apr 2008 18:33:24 +0800</pubDate>
        <link>http://redsaga.group.javaeye.com/group/blog/178535</link>
        <guid>http://redsaga.group.javaeye.com/group/blog/178535</guid>
      </item>
      <item>
        <title>Head First Design Patterns 读后感2 设计原则</title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://redsaga.group.javaeye.com/group/blog/178028" style="color:red;">http://redsaga.group.javaeye.com/group/blog/178028</a>&nbsp;
          发表时间: 2008年03月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1。软件开发中唯一一个不变的是 变化。大千世界，千奇百怪，行行色色，光影陆离，瞬息万变，然而这些在这些变化中我们总是能找到不变的东西，只有找到不变的东西，我们才可以以不变应万变，才能不被万物所累，超脱万物，以不变应万变才处理万物的不二法门。<br />2。分离开不变的和变化的，把不变的封装在一起，把变化的封装在一起。好比这个社会，把坏人犯了法的人都封闭在监狱里，这样才容易管理，而把变化的封装在一起也容易处理<br />3。针对接口变成，不是针对实现编成。现实中好的公司管理，领导在于不在，都可以很好的运行，这就是公司针对某个管理角色管理，不是针对某个人管理。接口其实是抽象和规律，就是针对规律编程，只有规律是变化比较少的，这样也就 找到变化中不变，其实就是又变易中找到了不易，这也就是针对不易编程，这样我们的程序也就变得简易了。现实生活中，有时候我们处理问题 也不能就事论事，而必须找出事物的规律来处理问题，这样才能真正把事情处理好，道理是相同的。<br />4。多用组合，少用继承。 现实社会中新型公司都是组合型的公司，这里的主要领导来自世界各地，他们组合在一起成立了一个公司，这种公司一般寿命比较长，而且管理科学规范。而家族式公司，往往很难长久，这种公司都是后辈继承父辈产业，这种公司关系复杂，管理混乱。共和制国家一般比较自由，尊重人权，因此共和制国家更加长久，而封建专制国家领导权一般是继承，这种国家一般比较垄断，人们自由比较少，这种政权肯定会彻底消失。排列组合，无穷尽也。仅仅一百多种元素就组成这个世界千奇百怪的世界，同样的碳原子，由于排列的不同，组成了煤炭，石煤，金刚石三种物质。因此排列组合大有学问。<br />5。开闭原则，对扩展开放，对修改关闭。把可能变化的部分应用开闭原则，每个地方应用开闭是浪费。针对变化开放，针对不变关闭。周易有，变易，不易，简易，其实也是 要分离出变易的，不易的，分离的这些变易和不易 直到简易为止。<br />6。单一职责 原则，要求每个功能块职责要单一，这样其实也就是周易的简易。现实生活中如果要想把事情办好必须在某一个时间地点单位处理某一个事情，这样是单一职责。一个类应该只有一个引起变化的原因。类的每个责任都有变化的潜在区域。超过一个责任，意味着超过一个改变的区域。尽量让每个类保持单一责任。<br />7。依赖倒置原则。依赖抽象不要依赖具体类。具体类依赖抽象类，而不是抽象类依赖具体类。底层依赖高层，高层不依赖底层。现实中 领导不依赖员工，员工依赖领导。抽象本身就是一种规律，处理事情要靠规律办事，没有规律依靠于具体事情。 <br />  如何做到 a。变量不可以持有具体类的引用，比如 new<br />              b。类不能派生至具体类。<br />              c。不要覆盖基类已经实行的方法。<br />8。好莱坞原则。高层对待底层组件的方式时 “别调用我们，我们会调用你们”。<br />   依赖倒置原则教我们尽量避免使用具体类，而使用抽象。好莱翁原则是创建框架和组件的一个技巧，好让底层比挂钩组件被挂钩进计算中，而又不让高层依赖具体底层组件。
          <br/>
          <span style="color:red;">
            <a href="http://redsaga.group.javaeye.com/group/blog/178028#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 31 Mar 2008 13:47:37 +0800</pubDate>
        <link>http://redsaga.group.javaeye.com/group/blog/178028</link>
        <guid>http://redsaga.group.javaeye.com/group/blog/178028</guid>
      </item>
      <item>
        <title>Head First Design Patterns 读后感1</title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://redsaga.group.javaeye.com/group/blog/178027" style="color:red;">http://redsaga.group.javaeye.com/group/blog/178027</a>&nbsp;
          发表时间: 2008年03月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          如何让大脑把记得更深刻<br />1。慢点，你理解的越多，记得月少<br />2。勤做练习 ，自己记笔记<br />3。阅读“there  are  no dumb questions” part<br />4。上床睡觉前不要看其他书，最少不要看比较难的书籍<br />5。要多喝水<br />6。把你学到的讲给别人，这样记忆更深刻<br />7。听听大脑怎么说，如果大脑把刚刚看的东西就忘记了，就该休息了<br />8。要有感觉<br />9 。设计也写东西
          <br/>
          <span style="color:red;">
            <a href="http://redsaga.group.javaeye.com/group/blog/178027#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 31 Mar 2008 13:46:25 +0800</pubDate>
        <link>http://redsaga.group.javaeye.com/group/blog/178027</link>
        <guid>http://redsaga.group.javaeye.com/group/blog/178027</guid>
      </item>
      <item>
        <title>兴趣，热情与生活</title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://redsaga.group.javaeye.com/group/blog/178025" style="color:red;">http://redsaga.group.javaeye.com/group/blog/178025</a>&nbsp;
          发表时间: 2008年03月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          看过好几本关于设计模式的书，这些书对于设计模式的讲解多半比较严肃和抽象，相对而言趣味性比较差，还有时间比较少，后来这些书都没有看完，最近在网上看到程杰的博客《小菜变程成长记》两天就把看完了，而且看明白了。与之前对设计模式的讲解，这个博客对模式讲解显的比较风趣生动，而且很多生活的例子和模式联系到一起讲，这样把本来大家不熟悉的模式变为大家比较熟悉的生活现象，这样就会很好的理解模式了。由此引发我对兴趣和热情的思考，记得去年那场五十年不遇的大雪，雪很大，我们去爬山，大雪封了路，路难行，但是我们却很快就爬到了山顶，而且一点也不累，为什么呢，美丽的雪景使得我们忘记了困难和风险与艰辛，爬山时看到路边的雪景很美，于是想山上的风景也许更美吧，这样有了对爬山的兴趣和热情，后来到了山顶也就不显的累了。想想以前也爬过山，好多次都感到爬到山顶全身累的不轻，原因是当时没有下雪那次爬山的热情和兴趣。看书也是有时候看某本书心情好而且兴趣很浓，一会就把一章给看完了，而且思潮澎湃，触类旁通，理解的也比较深刻，有时就是怎么也看不下去，其实当时的兴趣没有在书上。做什么事情没有兴趣和热情 肯定做的不会很轻松，不会很彻底，不会很快，也不会很好。因此，做事时候 想法培养对这事情的兴趣和热情很重要。还有，俗话说“话有三说，巧说为妙”，怎么妙呢，要有趣味，要生动，我看过一些书，只讲道理，不讲事例，或者那个例子很不恰当和生动趣味，我就不想看下去了。说话时也要想法把话说的趣味一些，这样别人才愿意听。平时，对每件小事，都想办法让自己带着兴趣去做，如果实在没有兴趣，就要动脑子找乐子了。如果实在没有兴趣，而且可以不做，就不去做了。这样才能把事情做好，才有好的心情，如果平时的很多事情都有好的心情，那么生活就有了热情，生活才感觉更美些。
          <br/>
          <span style="color:red;">
            <a href="http://redsaga.group.javaeye.com/group/blog/178025#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 31 Mar 2008 13:45:12 +0800</pubDate>
        <link>http://redsaga.group.javaeye.com/group/blog/178025</link>
        <guid>http://redsaga.group.javaeye.com/group/blog/178025</guid>
      </item>
      <item>
        <title>爬五十年不遇的大雪山</title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://redsaga.group.javaeye.com/group/blog/178021" style="color:red;">http://redsaga.group.javaeye.com/group/blog/178021</a>&nbsp;
          发表时间: 2008年03月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><img src="http://blufiles.storage.live.com/y1pZ1u4rC44uCioD0qZpjMLu2Sy_Kq7TMwGSOa0NpYagdSnXJbCqk2DVmuQ-LsQrldhYEYcs3-Vm-E" border="0" height="400" alt="" width="533" /><img src="http://blufiles.storage.live.com/y1pZ1u4rC44uCjEgX7OGXUEnILqN19JCAEq3xn_lsmFZVBJZvkdgFRAS-P3kgES__S3zmuh8FdeYIs" border="0" height="400" alt="" width="533" /></p><p>五十年不遇的大雪，雪有一尺多厚，这么大的雪想想山顶应该风景独好吧，于是决定爬山，没有想到，大雪已经封山，过去的台阶已经被雪埋没，现在爬山很危险，如果不小心摔下来，极有可能有有很大危险，说不定.....但是困难没有吓倒我，即使遇到在陡的坡，在滑的路我们还是要向上攀登。在爬山的过程中也看到了山的苍茫，天地都是一片茫茫，在远什么都看不见了，这种感觉很是奇妙。付出了很大的努力，终于爬到了山顶，山顶公园的风景更是前所未有，我想如果等雪过天晴，冰雪融化，想看到这样的风景恐怕是没有机会了。山上的人很稀少，但是大家好像都很兴奋，并没有因为雪太大路难行感到一点不开心。上山容易下山难，特别是在大雪封山的时候这句话更是经典。如果站着下山肯定要摔倒，路边还有悬崖，说不定还会粉身碎骨，我们只有坐在地上用屁股一路溜下去，也算是坐了一次超级溜溜板。最后终于溜到了山下，山下依然是车水马龙人来人往。其实人生就如爬山，只要付出，只要努力就能爬的更高，爬的越高你的收获也就越多，会收获到山下的人没有接触过的东西，山下的人想也想不到的东西，而且越高你会发现和你并行的人越少，如果你爬到别人都不能爬的高度，那么你就是寡人了，这种孤独一般人想有也是没得有的。最后想说的是爬山真好，爬到别人不能爬到的地方更好。</p>
          <br/>
          <span style="color:red;">
            <a href="http://redsaga.group.javaeye.com/group/blog/178021#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 31 Mar 2008 13:42:49 +0800</pubDate>
        <link>http://redsaga.group.javaeye.com/group/blog/178021</link>
        <guid>http://redsaga.group.javaeye.com/group/blog/178021</guid>
      </item>
      <item>
        <title>proxy state 读书笔记</title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://redsaga.group.javaeye.com/group/blog/177391" style="color:red;">http://redsaga.group.javaeye.com/group/blog/177391</a>&nbsp;
          发表时间: 2008年03月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><img src="../../../topics/download/f115f3c8-67bf-34e2-81a8-86fafd2ae70a" border="0" height="510" alt="" width="816" />定义：为另一个对象提供一个替身或者战位符以范围这个对象。</p>
<p>要点：</p>
<p>1。代理模式为另外一个对象提供代表，以便控制客户对对象的访问，管理访问的方式有许多种。</p>
<p>2。远程带来管理客户和远程对象之间的交会。</p>
<p>3。虚拟代理控制访问实例化开销大的对象。</p>
<p>4。保护代理基于调用者控制对对象方法的访问。</p>
<p>5。代理模式有许多变体，例如：缓存代理，同步代理，防火墙代理和写入时复制代理。</p>
<p>6。代理在结构上类似装饰者，但是目的不同。</p>
<p>7。装饰者模式为对象加上行为，而代理则是控制访问。</p>
<p>8。java内置的代理支持，可以根据需要将来动态代理，并将所有调用分配到所选的处理器。</p>
<p>9。就合其他的包装者一样，代理会造成你的设计中类的数目增加。</p>
<p>&nbsp;</p>
<p>//虚拟代理 </p>
<p>package pattern;</p>
<p>import java.awt.Component;<br />import java.awt.Graphics;<br />import java.awt.event.ActionEvent;<br />import java.awt.event.ActionListener;<br />import java.net.MalformedURLException;<br />import java.net.URL;<br />import java.util.Enumeration;<br />import java.util.Hashtable;</p>
<p>import javax.swing.ImageIcon;<br />import javax.swing.JComponent;<br />import javax.swing.JFrame;<br />import javax.swing.JMenu;<br />import javax.swing.JMenuBar;<br />import javax.swing.JMenuItem;</p>
<p>public class ImageProxyTestDrive {</p>
<p>&nbsp;ImageComponent imageComponent;<br />&nbsp;JFrame frame = new JFrame("CD Cover viewer");<br />&nbsp;JMenuBar menuBar;<br />&nbsp;JMenu menu;<br />&nbsp;Hashtable cds = new Hashtable();</p>
<p>&nbsp;public static void main(String[] args) throws Exception {<br />&nbsp;&nbsp;ImageProxyTestDrive testDrive = new ImageProxyTestDrive();<br />&nbsp;&nbsp;// TODO Auto-generated method stub</p>
<p>&nbsp;}</p>
<p>&nbsp;public ImageProxyTestDrive() throws Exception {<br />&nbsp;&nbsp;cds.put("Ambient: Music for Airports",&nbsp;"<a href="http://image.club.china.com/3212956/2008/3/27/0.jpg">http://image.club.china.com/3212956/2008/3/27/0.jpg</a>");<br />&nbsp;&nbsp;cds.put("Ima","<a href="http://image.club.china.com/3934/2008/3/22/0.jpg">http://image.club.china.com/3934/2008/3/22/0.jpg</a>");<br />&nbsp;&nbsp;cds.put("Selected Ambient Works,Vol.2",&nbsp;"<a href="http://image.club.china.com/3934/2008/1/22/2.jpg">http://image.club.china.com/3934/2008/1/22/2.jpg</a>");<br />&nbsp;&nbsp;URL initialURL = new URL((String) cds.get("Ima"));<br />&nbsp;&nbsp;menuBar = new JMenuBar();<br />&nbsp;&nbsp;menu = new JMenu("Favorite CDs");<br />&nbsp;&nbsp;menuBar.add(menu);<br />&nbsp;&nbsp;frame.setJMenuBar(menuBar);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;for (Enumeration e = cds.keys(); e.hasMoreElements();) {<br />&nbsp;&nbsp;&nbsp;String name = (String) e.nextElement();<br />&nbsp;&nbsp;&nbsp;JMenuItem menuItem = new JMenuItem(name);<br />&nbsp;&nbsp;&nbsp;menu.add(menuItem);<br />&nbsp;&nbsp;&nbsp;menuItem.addActionListener(new ActionListener() {<br />&nbsp;&nbsp;&nbsp;&nbsp;public void actionPerformed(ActionEvent event) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imageComponent.setIcon(new ImageProxy(getCDUrl(event<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getActionCommand())));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.repaint();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;Icon icon = new ImageProxy(initialURL);<br />&nbsp;&nbsp;imageComponent = new ImageComponent(icon);<br />&nbsp;&nbsp;frame.getContentPane().add(imageComponent);<br />&nbsp;&nbsp;frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />&nbsp;&nbsp;frame.setSize(800, 600);<br />&nbsp;&nbsp;frame.setVisible(true);<br />&nbsp;}</p>
<p>&nbsp;URL getCDUrl(String name) {<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;return new URL((String) cds.get(name));<br />&nbsp;&nbsp;} catch (MalformedURLException e) {<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;return null;<br />&nbsp;&nbsp;}<br />&nbsp;}<br />}</p>
<p>interface Icon {<br />&nbsp;int getIconWidth();</p>
<p>&nbsp;int getIconHeight();</p>
<p>&nbsp;void paintIcon(final Component c, Graphics g, int x, int y);<br />}</p>
<p>class ImageProxy implements Icon {<br />&nbsp;ImageIcon imageIcon;<br />&nbsp;URL imageURL;<br />&nbsp;Thread retrievalThread;<br />&nbsp;boolean retrieving = false;</p>
<p>&nbsp;public ImageProxy(URL url) {<br />&nbsp;&nbsp;imageURL = url;<br />&nbsp;}</p>
<p>&nbsp;public int getIconWidth() {<br />&nbsp;&nbsp;if (imageIcon != null) {<br />&nbsp;&nbsp;&nbsp;return imageIcon.getIconWidth();<br />&nbsp;&nbsp;} else<br />&nbsp;&nbsp;&nbsp;return 500;<br />&nbsp;}</p>
<p>&nbsp;public int getIconHeight() {<br />&nbsp;&nbsp;if (imageIcon != null) {<br />&nbsp;&nbsp;&nbsp;return imageIcon.getIconHeight();<br />&nbsp;&nbsp;} else<br />&nbsp;&nbsp;&nbsp;return 400;<br />&nbsp;}</p>
<p>&nbsp;public void paintIcon(final Component c, Graphics g, int x, int y) {<br />&nbsp;&nbsp;if (imageIcon != null) {<br />&nbsp;&nbsp;&nbsp;imageIcon.paintIcon(c, g, x, y);<br />&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;g.drawString("Loading CD cover,please wait...", x + 40, y + 40);<br />&nbsp;&nbsp;&nbsp;if (!retrieving) {<br />&nbsp;&nbsp;&nbsp;&nbsp;retrieving = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;retrievalThread = new Thread(new Runnable() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void run() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imageIcon = new ImageIcon(imageURL, "CD Cover");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.repaint();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;retrievalThread.start();<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;<br />}</p>
<p>class ImageComponent extends JComponent {<br />&nbsp;private Icon icon;</p>
<p>&nbsp;public ImageComponent(Icon icon) {<br />&nbsp;&nbsp;this.icon = icon;<br />&nbsp;}</p>
<p>&nbsp;public void setIcon(Icon icon) {<br />&nbsp;&nbsp;this.icon = icon;<br />&nbsp;}</p>
<p>&nbsp;public void paintComponent(Graphics g) {<br />&nbsp;&nbsp;super.paintComponent(g);<br />&nbsp;&nbsp;int w = icon.getIconWidth();<br />&nbsp;&nbsp;int h = icon.getIconHeight();<br />&nbsp;&nbsp;int x = (800 - w) / 2;<br />&nbsp;&nbsp;int y = (600 - h) / 2;<br />&nbsp;&nbsp;this.icon.paintIcon(this,&nbsp; g,&nbsp; x,&nbsp; y);<br />&nbsp;}</p>
<p>}</p>
<p>//动态代理 和安全代理</p>
<p>&nbsp;</p>
<p>package pattern;</p>
<p>import java.lang.reflect.InvocationHandler;<br />import java.lang.reflect.InvocationTargetException;<br />import java.lang.reflect.Method;<br />import java.lang.reflect.Proxy;</p>
<p>public class MatchMakingTestDrive {</p>
<p>&nbsp;/**<br />&nbsp; * @param args<br />&nbsp; */<br />&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp;MatchMakingTestDrive test=new MatchMakingTestDrive();<br />&nbsp;&nbsp;test.drive();</p>
<p>&nbsp;}<br />&nbsp;&nbsp;&nbsp; public MatchMakingTestDrive(){<br />&nbsp;&nbsp;&nbsp; &nbsp;//initializeDatabase();<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; public void drive(){<br />&nbsp;&nbsp;&nbsp; &nbsp;PersonBean joe=new PersonBeanImpl("Joe Javabean");<br />&nbsp;&nbsp;&nbsp; &nbsp;PersonBean ownerProxy=getOwnerProxy(joe);<br />&nbsp;&nbsp;&nbsp; &nbsp;System.out.println("Name is " + ownerProxy.getName());<br />&nbsp;&nbsp;&nbsp; &nbsp;ownerProxy.setInterests("bowling, GO");<br />&nbsp;&nbsp;&nbsp; &nbsp;try{<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;ownerProxy.setHotOrNotRating(10);<br />&nbsp;&nbsp;&nbsp; &nbsp;}catch(Exception e){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;System.out.println("Can't set rating from owner proxy");<br />&nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp;&nbsp; &nbsp;System.out.println("Rating is"+ ownerProxy.getHotOrNotRating());<br />&nbsp;&nbsp;&nbsp; &nbsp;PersonBean nonOwnerProxy=getNoOwnerProxy(joe);<br />&nbsp;&nbsp;&nbsp; &nbsp;System.out.println("Name is "+ nonOwnerProxy.getName());<br />&nbsp;&nbsp;&nbsp; &nbsp;try{<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;nonOwnerProxy.setInterests("bowling, Go");<br />&nbsp;&nbsp;&nbsp; &nbsp;}catch(Exception e){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;System.out.println("Can't set interests from non owner proxy");<br />&nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp;&nbsp; &nbsp;nonOwnerProxy.setHotOrNotRating(3);<br />&nbsp;&nbsp;&nbsp; &nbsp;System.out.println("Rating set from non owner proxy");<br />&nbsp;&nbsp;&nbsp; &nbsp;System.out.println("Rating is "+ nonOwnerProxy.getHotOrNotRating());<br />&nbsp;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; PersonBean getOwnerProxy(PersonBean person){<br />&nbsp;&nbsp;&nbsp; &nbsp;return (PersonBean)Proxy.newProxyInstance(person.getClass().getClassLoader(),person.getClass().getInterfaces(),new OwnerInvocationHandler(person));<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; PersonBean getNoOwnerProxy(PersonBean person){<br />&nbsp;&nbsp;&nbsp; &nbsp;return (PersonBean)Proxy.newProxyInstance(person.getClass().getClassLoader(),person.getClass().getInterfaces(),new NoOwnerInvocationHandler(person));<br />&nbsp;&nbsp;&nbsp; }<br />}</p>
<p>interface PersonBean {<br />&nbsp;String getName();</p>
<p>&nbsp;String getGender();</p>
<p>&nbsp;String getInterests();</p>
<p>&nbsp;int getHotOrNotRating();</p>
<p>&nbsp;void setName(String name);</p>
<p>&nbsp;void setGender(String gender);</p>
<p>&nbsp;void setInterests(String interests);</p>
<p>&nbsp;void setHotOrNotRating(int rating);</p>
<p>}<br />class PersonBeanImpl implements PersonBean{<br />&nbsp;String name;<br />&nbsp;String gender;<br />&nbsp;String interests;<br />&nbsp;int rating;<br />&nbsp;int ratingCount=0;<br />&nbsp;public &nbsp;PersonBeanImpl(String name){<br />&nbsp; name=name;<br />&nbsp;}<br />&nbsp;public String getName() {<br />&nbsp;&nbsp;return name;<br />&nbsp;}<br />&nbsp;public void setName(String name) {<br />&nbsp;&nbsp;this.name = name;<br />&nbsp;}<br />&nbsp;public String getGender() {<br />&nbsp;&nbsp;return gender;<br />&nbsp;}<br />&nbsp;public int getHotOrNotRating(){<br />&nbsp;&nbsp;if(ratingCount==0)return 0;<br />&nbsp;&nbsp;return (rating/ratingCount);<br />&nbsp;}<br />&nbsp;public void setGender(String gender) {<br />&nbsp;&nbsp;this.gender = gender;<br />&nbsp;}<br />&nbsp;public String getInterests() {<br />&nbsp;&nbsp;return interests;<br />&nbsp;}<br />&nbsp;public void setInterests(String interests) {<br />&nbsp;&nbsp;this.interests = interests;<br />&nbsp;}<br />&nbsp;public void setHotOrNotRating(int rating){<br />&nbsp;&nbsp;this.rating+=rating;<br />&nbsp;&nbsp;ratingCount++;<br />&nbsp;}<br />}</p>
<p>class OwnerInvocationHandler implements InvocationHandler{<br />&nbsp;PersonBean person;<br />&nbsp;public OwnerInvocationHandler(PersonBean person){<br />&nbsp;&nbsp;this.person=person;<br />&nbsp;}<br />&nbsp;public Object invoke(Object proxy,Method method,Object[] args) throws IllegalAccessException{<br />&nbsp;&nbsp;try{<br />&nbsp;&nbsp;&nbsp;if(method.getName().startsWith("get")){<br />&nbsp;&nbsp;&nbsp;&nbsp;return method.invoke(person, args);<br />&nbsp;&nbsp;&nbsp;}else if(method.getName().equals("setHotOrNotRating")){<br />&nbsp;&nbsp;&nbsp;&nbsp;throw new IllegalAccessException();<br />&nbsp;&nbsp;&nbsp;}else if(method.getName().startsWith("set")){<br />&nbsp;&nbsp;&nbsp;&nbsp;return method.invoke(person, args);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}catch(InvocationTargetException e){<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return null;<br />&nbsp;}<br />}</p>
<p>class NoOwnerInvocationHandler implements InvocationHandler{<br />&nbsp;PersonBean person;<br />&nbsp;public NoOwnerInvocationHandler(PersonBean person){<br />&nbsp;&nbsp;this.person=person;<br />&nbsp;}<br />&nbsp;public Object invoke(Object proxy,Method method,Object[] args) throws IllegalAccessException{<br />&nbsp;&nbsp;try{<br />&nbsp;&nbsp;&nbsp;if(method.getName().startsWith("get")){<br />&nbsp;&nbsp;&nbsp;&nbsp;return method.invoke(person, args);<br />&nbsp;&nbsp;&nbsp;}else if(method.getName().equals("setHotOrNotRating")){&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return method.invoke(person, args);<br />&nbsp;&nbsp;&nbsp;}else if(method.getName().startsWith("set")){<br />&nbsp;&nbsp;&nbsp;&nbsp;throw new IllegalAccessException();<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}catch(InvocationTargetException e){<br />&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;return null;<br />&nbsp;}<br />}</p>
          <br/>
          <span style="color:red;">
            <a href="http://redsaga.group.javaeye.com/group/blog/177391#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 28 Mar 2008 18:35:12 +0800</pubDate>
        <link>http://redsaga.group.javaeye.com/group/blog/177391</link>
        <guid>http://redsaga.group.javaeye.com/group/blog/177391</guid>
      </item>
      <item>
        <title>七年的顿悟与突破(转载 这个人的经验值得我好好学习）</title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://redsaga.group.javaeye.com/group/blog/176680" style="color:red;">http://redsaga.group.javaeye.com/group/blog/176680</a>&nbsp;
          发表时间: 2008年03月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          几年前开始频繁接触网络，也才有机会见到这本现实生活中发行量不大的书。刚开始看，我就被作者深入浅出的语言和独特的观点打动了，那时我自己已经有了几年虽然不是专职但努力毫不逊色的炒股生涯，我知道作者的观点绝大多数都是正确的，所以我才和这本书的观点产生了强烈的共鸣。说实话，说到这几年来读《炒股的智慧》的感受，一是相见恨晚百看不厌，二是感触颇多，可以这么说，每一次读都能发现新的东西、对股市都会有新的理解和认识，也能感觉到自己的进步。所以，这本书已经成为我最知心的老师和朋友，所以想把他推荐给大家，也才不遗余力的力求做的最好。<br />        这本书虽然很小很薄，但这本书对股市乃至所有投机市场的认识却是最深刻和最到位的。这本书初版于 1999 年，由生活、读书、新知三联书店出版后，在读者中产生了巨大的反响，被誉为“炒股的圣经”、“最经典的投资著作”，具有永恒的生命力。作者以在华尔街十多年投资股市的经验教训为感性素材，在研读了西方几百年来的炒股名著和炒股大师传记的基础之上，对投资股市最根本、最重要的问题进行了深入的思考和探索，对取得成功的方法和过程进行了化繁为简、提纲挈领的阐述。其中包括华尔街的家训、学股的四个阶段、怎样克服负面的心理习惯并养成自己稳定的炒股模式、怎样选择临界点、怎样应对大户操纵、怎样利用大机会、怎样培养对股票运动的直觉……“这本书没有任何理论和公式，它是炒股十二年来的观察和经验之总结。”（作者的原话），同时也是华尔街和投机大师们的经验的总结：“我书中讲的方法并没多少是我自己的发明。它是几百年华尔街经验的总结。我通过自己的实践和理解，融合中国文化的特色，用中国人容易接受的方法表达出来。这些规则一百年前美国适用，今天中国适用，一百年后中美都适用。这些规则都已经经受了时间的检验。 ”（见作者访谈）。也使像我这样英语不好的人有机会正确和快速的学习、领会投机大师们的思想和经验。<br />        作者的经历非常复杂：毕业于上海交大，1983 年赴美，靠半工半读完成工程硕士和工商管理硕士。作者自己这样说：“我是中国为数不多经历土插队和洋插队双重插队的人。我养过牛，种过地，曾在工厂做过机械工程师，也在报社做过记者，在美国的餐馆做过多年跑堂，也曾戴领带任职大财团的投资分析员、银行的贷款专员。我还拉过人寿保险，也曾是有牌照的地产交易经纪人。在我这么多的经历中，没有一个行业比炒股为生更为艰难”（见第一章第一节）。这样的经历集中在一个人身上，几乎是绝无仅有的，以作者的悟性和努力，相信他不管选择哪一个行业做，都能够“成功”，但他却最终选择了“以炒股为生”这个最艰难的行业，可见投机的魅力是如何的强大。<br />        我没有这样的经历，相信绝大多数人也很难有类似的经历。但炒股的心理路程却是相似的，甚至有过之而无不及。<br />        开始读这本书时，我给一个朋友介绍它时曾经说过，书中的观点 99.9％ 都是正确的，只有一点我不认同，没想到的是，就是因为这一点点的不认同，使我经历了炒股以来最大的失败甚至苦难，真正体会了书中所说的“体验风险阶段”的真正含义。<br />        在有了 5  年的炒股经验之后，我遇到了这本书，看到了作者对炒股学习阶段的划分标准，也知道了许多成功的前辈、大师们进入“久赌必赢”阶段也至少需要 5 到 6 年的时间。那时是 2003 年，大家都知道在那之前的中国股市正经历了有史以来最大的镇痛，更因为我在那段时间里不仅毫发无损而且有连续两年的盈利，竟然认为自己已经用不到 6 年的时间也做到了“久赌必赢”，自以为自己已经有了战胜市场的能力。你能想象我当时的浅薄和狂妄。几种因素的机缘巧合使我义无反顾的辞去了虽然不是很好但仍有许多人羡慕的工作，开始了自己的专职炒股生涯。<br />        没有想到的是一切并不如想象的那样顺利，正是我刚才提到的对作者观点的仅有的一点不认同，给我的专职投资生涯埋下了隐患。不久之后我出现了炒股以来最大的一次失误和失败，不过比例并不算大，不到 20 ％，仅仅是上一年的盈利而已，并未到伤筋动骨的地步。所以，可怕的不是那次失败，而是那次失败之后我做出了一个“错误”的决定：做期货。之所以要加引号，是因为当时不是认真的吸取失败的教训，同时在并未真正弄懂投机的情况下盲目做期货，显然不对，不过现在看来，也正是那个决定和因此造成的更大的失败才让我猛醒，使我同时完成了对人性的顿悟和技术上的突破，所以，那个决定也许不是什么错误。这一点和作者非常相似，不管是动机还是结果，当然我绝没有效仿作者的意思，因为我还是清醒的知道，对作者来说，作者的期货投机的经历是一次失败的经历。即便如此，同时虽然在那之前我早就知道期货市场风险很大，对于做期货这件事早有规划，就是等做股票成熟了之后再做，但那时也许是昏了头，也许是因为有了时间（做期货需要更多的时间），我放弃了自己的计划，提前开始做期货。我犯了和作者同样的错误，“我自以为懂股票了，其实还不全懂”，直到那时也才有了许多深刻的领悟，真的是很深痛的领悟，当你在半小时之内赔掉股票市场赚了几年的钱时，人才会清醒过来，也才发现以前在股票市场的“观念”是如此的漫不经心和无知。股票市场甚至比期货更难，因为它的痛不是立即的，而是像毒瘾一般慢性的吞噬你，除非有很痛的生死天人交战，不然你会不经意的陷入失败的深渊，直到一切都消失后才惊醒。<br />        虽然我早就知道期货和股票是相通的，相同点很多，没有想到的区别仍然很大，这里的区别不仅仅是“T+0”,也不仅仅是可以“双向交易”，我认为，其最大的区别在于：<br />        1、少了“大盘”这个研判行情的基准，在这里有必要说一下，对于做股票我已经形成了一整套系统的做法，其中“看大盘做个股”是最根本的基础和前提，也是最关键的。我相信这个做法也适合绝大多数人，当然我不否认也有很大一部分人对这个做法很不以为然，在这里我不想和他们辩论，因为我知道我说了他们也不信，很多东西都需要亲身体验、感悟之后才能真正成为自己的，虽然这个过程的代价可能昂贵。<br /> <br />        2、另外一个很大的不同就是期货缺少了成交量这个指标的有效支持，我这么说不是因为期货中没有成交量，也不是不能看成交量，而是由于具体期货合约的周期一般很短（1 年左右），其成交量一般呈现出成交稀少---缓慢增加---快速增加---缓慢减少---成交稀少的周期性规律。所以，成交量对于行情判断的有效性大打折扣。<br />        3、由于期货实行保证金交易，一般来说，在国内可以买卖合约的价值一般相当于本金的 12 倍。所以，在期货中另一个重要的问题就是资金管理，做股票虽然也需要根据行情的不同阶段适当调整仓位，但重要性远不如期货。在获胜概率不变的前提下，资金管理成为最终盈利的关键性甚至是决定性的因素。关于这个问题在本书第三章第二节中有详细的论述，希望朋友们认真体会。<br />        正是因为少了大盘和成交量的这两个重要指标的帮助，一个重要的因素就显得特别突出了，这就是趋势。对股票来说，虽然趋势也很重要，但远不如期货这么纯粹，正是因为这个原因，我才真正用心的考虑趋势的问题，经过潜心研究和痛苦的抉择，也才真正认识了趋势。但是认识到一点的代价却是我几乎损失了所有的资金。虽然我手里还有从朋友、亲戚那里借来的钱，但这是我的底线，这部分资金是无论如何不能动的！但是除此之外我几乎一无所有：工作没了，一直当成事业来做的炒股一败涂地，几乎丧失了信心，打击一个接一个，苦难我到不怕，让我痛苦的是我不知道苦难的日子何时是个尽头！那时的股市还在艰难的探底，网上不时传来有人自杀的消息，我对一个朋友说，仔细比较一下，也许我比他们更有理由，当然我决不会那么做。不过，你能想象我当时的彷徨甚至几乎绝望的心情，这一点恐怕比作者犹甚！关于那段时间的心理路程，我建议有兴趣的朋友们可以读读《炒股的智慧》第八章“学股的四个阶段”这一节，我敢说我的经历几乎是作者的翻版，作者写到的我都有，没有的我也有。 <br />       我开始真正的反思。我不知道对于一般人来说， 6 年的时间意味着什么。6 年，有人也许可以博士毕业，换一个更好的工作，有人也许可以成为一个成功的商人......但是我呢？偏偏选择了股市。 6 年的时间，也许有些优秀者可以知道自己能在这行生存下去了，但是我能吗？我还有这个自信吗？铁打的股市，流水的股民啊，我反复的问自己：<br />　　<br />　　1、你真的能忍受在经历了六年或以上的勤奋钻研、刻苦研究之后，依然无法摆脱亏损的境地吗？<br />　　2、你真的愿意将自己的一生的时间、精力和智慧，全部押在这个可能令你一败涂地的投机事业中吗？　　<br />　　3、当你的朋友们通过稳定的工作，逐渐买起了房、车，而你依然一无所有，虽然你有那么多的别人无从知晓的苦难和勤奋，但并没有相应的回报。你依然能够保持坦然而且坚定的心态吗？你真的不会倒在黎明前的黑暗之中吗？　　<br />　　4：在这个充满了高智商人士而且成功率如此之低的市场，你凭什么能断定自己一定会成为那一小撮成功的人之一？<br />      当然，我之所以能挺过那段痛苦的时光，除了自己并未完全丧失信心之外，《炒股的智慧》也给了我足够的帮助：“在忍无可忍的时候，请再忍一忍。”陈江挺也说“为什么那些著名的炒股名家，在他们成“家”之前通常都有一次甚至几次的破产经历。其中包括本书中提到的利物莫和巴鲁克。”同时我也知道，司马迁在《史记》的自序中也说：盖西伯拘而演《周易》；仲尼厄而作《春秋》；屈原放逐，乃赋《离骚》；左丘失明，厥有《国语》；孙子膑脚，《兵法》修列；不韦迁蜀，世传《吕览》；韩非囚秦，《说难》、《孤愤》、《诗》三百篇，大氐贤圣发愤之所为作也。其实司马迁本人也不例外，他也是在受了宫刑之后，在丧失男人尊严的极端屈辱之中完成这篇历史巨著的。那段时间，对这个问题我也想了许多。我这么想绝不仅仅是自我安慰，更不会是因为和大师们犯了同样的错误而感觉不一般。为什么古今中外这么多伟人有所成就之前都有几乎相似的失败经历？我突然想起这也许是成功之前必须付出的代价。而作者恰恰是这样看的：“如果你确确实实有了几年的炒股经验，对研究股票及其运动规律也下过苦功，这时亏大钱常常是你大成之前的最后考验，请千万不要放弃！<br />      现在我清楚的知道，所有这些人的经历归纳起来只有一句话：“人的大彻大悟来自大灾大难。”由此看来，自己的那一点痛苦真的算不了什么。直到突然有一天，我发现自己对股票、对期货、对人生、人性都有了更为清醒的认识。而几乎与此同时，我也完成了技术上的突破，也才有了这些文字。正像作者所说的那样，“回过头想想，真正艰难困苦的时期其实很短暂。”。<br />      所以，现在我可以肯定的告诉你，书中关于炒股的观点 100％都是正确的。当然，我并不是说作者永远正确，更不会把他当作神仙。我从来都不是一个盲从和轻信的人，从不迷信权威，但也不是一个真正固执的人，如果我发现自己真的错了，会毫不犹豫的改正。说实话，在这本书中作者至少对一件事情判断失误，而且很严重。至于是什么，这个问题留给大家，请你在看书的留意一下。不过需要指出的是我现在说这件事并不是说我比作者高明，其实，我清醒的知道，自己还差的很远，很远。如果你怀疑我这样说有目的，我也只是想提醒大家，在相信书中观点的时候，你也不要忘了，作者不是神仙，也会犯错误，也不是不可超越的，虽然超越作者并不是一件容易的事情。不过，话又说回来，超越别人不难，难的是超越自己，大多数人即使付出毕生的努力也未必能做到。不过，也请你不要因此对作者关于投机的观点有任何的怀疑。当然，这本书肯定不是适合所有的人，如果你觉得这本书不适合你，你不一定就是错的，只要你能找到适合自己的方法，并能用实践证明那是正确的，就足够了。但是，如果你还没找到最适合自己的方法，也不知道什么才是正确的，我建议你还是老老实实的多读几遍这本书，你所要做的只是弄懂，然后照着做就可以了。<br />　　最后，真诚的祝你早日成功！
          <br/>
          <span style="color:red;">
            <a href="http://redsaga.group.javaeye.com/group/blog/176680#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 27 Mar 2008 11:38:23 +0800</pubDate>
        <link>http://redsaga.group.javaeye.com/group/blog/176680</link>
        <guid>http://redsaga.group.javaeye.com/group/blog/176680</guid>
      </item>
      <item>
        <title>泛型DAO设计</title>
        <author>yongtree</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yongtree.javaeye.com">yongtree</a>&nbsp;
          链接：<a href="http://redsaga.group.javaeye.com/group/blog/170449" style="color:red;">http://redsaga.group.javaeye.com/group/blog/170449</a>&nbsp;
          发表时间: 2008年03月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          泛型是JDK1.5的一个新的特性，使用泛型机制编写的程序代码要比那些杂乱的使用Object变量，然后再进行强制类型转换的代码具有更好的安全性和可读性。如果你的系统运行在JDK1.5以上的版本上，建议多使用泛型来代替无休止的对象转换。<br /><br />         在软件设计中我们开始对系统进行三层甚至是多层架构了，目的是职责更加的明确，功能更加的分离。而常常使用的三层架构就是将表现层、业务逻辑层和持久层进行分离，每一层关注点不同，职能更加的清晰。所以DAO的设计模式现在已经被我们所接受，下面就介绍一下泛型DAO的设计和实现。<br /><br />         这次的DAO例子是基于接口的.很多工具, 像Hibernate已经提供了数据库的便携访问,所以我们不是为持久层的轻便而设计接口. 然而, DAO接口在较为复杂的应用中更有意义, 当有几个持久化服务被封装到一个持久层的时候, 我想在很多情况下你应该直接使用Hibernate或者JPA, 而使用外加的DAO层最好的理由是为了实现更高的抽象化(例如:定义方法名findAll(String hql)而不是无数次地重复session.createQuery(...))<br /><br />通用DAO接口：<br /><br />package com.baiyyy.util.dao;<br /><br />import java.io.Serializable;<br />import java.util.Collection;<br />import java.util.Iterator;<br />import java.util.List;<br /><br />import org.hibernate.Criteria;<br />import org.hibernate.LockMode;<br />import org.hibernate.criterion.Criterion;<br />import org.hibernate.criterion.DetachedCriteria;<br /><br />/**<br /> * 承有业务数据的基础访问接口<br /> * &lt;p><br /> * 承有CRUD (创建，读取，修改和删陿)基本数据的操作在这个接口中都是独立的＿ 并且承有的DAO都可以使用这些基本实玿<br /> * <br /> * @author yongtree<br /> * <br /> * @date:2008-03-04<br /> */<br />public interface IBaseDAO&lt;T, ID extends Serializable> {<br /><br />  /***************************************************************************<br />   * -------------------基本棿索㿁增加㿁修改㿁删除操使---------------------------- *<br />   **************************************************************************/<br /><br />  // --------findById()方法是鿚过get(ID id)得到实体对象-----------------------<br />  /**<br />   * 通过ID来得到实体对豿<br />   * <br />   * @param id<br />   *            实体对象的标识符<br />   * @param lock<br />   *            使用的锁模式<br />   * @return 该主键忼对应的实体对象<br />   */<br />  public T findById(ID id, LockMode lock);<br /><br />  /**<br />   * 通过ID来得到实体对豿<br />   * <br />   * @param id<br />   * @return T<br />   */<br />  public T findById(ID id);<br /><br />  /**<br />   * 通过ID来得到实体对豿(为兼容其他开发成员的原有程序，保留使甿)<br />   * <br />   * @param c<br />   * @param id<br />   * @return T<br />   */<br />  public T findById(Class c, ID id);<br /><br />  // -------------loadById()是调用hibernate的load方法------------<br /><br />  public T loadById(ID id);<br /><br />  /**<br />   * 通过id load对象<br />   * <br />   * @param id<br />   * @param lock<br />   * @return<br />   */<br />  public T loadById(ID id, LockMode lock);<br /><br />  /**<br />   * 获取全部的实使<br />   * <br />   * @return<br />   */<br />  public List&lt;T> loadAll();<br /><br />  /**<br />   * 保存丿个实体对豿<br />   * <br />   * @param entity<br />   */<br />  public T saveEntity(T entity);<br /><br />  /**<br />   * 更新丿个实体对豿<br />   * <br />   * @param entity<br />   */<br />  public void updateEntity(T entity);<br /><br />  public void updateEntity(T entity, LockMode lock);<br /><br />  /**<br />   * 增加或更新集合中的全部实使<br />   * <br />   * @param entities<br />   */<br />  public void saveOrUpdateAll(Collection&lt;T> entities);<br /><br />  /**<br />   * 删除丿个实使<br />   * <br />   * @param entity<br />   * @throws Exception<br />   */<br />  public void deleteEntity(T entity);<br /><br />  public void deleteEntity(T entity, LockMode lock);<br /><br />  /**<br />   * 根据主键删除指定实体<br />   * <br />   * @param id<br />   */<br />  public void deleteEntityById(ID id);<br /><br />  public void deleteEntityById(ID id, LockMode lock);<br /><br />  /**<br />   * 批量删除<br />   * <br />   * @param entities<br />   */<br />  public void deleteAll(Collection&lt;T> entities);<br /><br />  /**<br />   * 通过合并的方式更新对豿<br />   * <br />   * @param entity<br />   *            void<br />   */<br />  public void merge(T entity);<br /><br />  /***************************************************************************<br />   * ------------------------------使用HQL语句-------------------------------- *<br />   **************************************************************************/<br /><br />  /**<br />   * 使用HQL语句进行对象的查诿<br />   * <br />   * @param hsql<br />   *            查询语句<br />   * @return 符合条件的对豿<br />   */<br /><br />  public T getEntity(String hsql);<br /><br />  /**<br />   * 使用HQL语句进行查询<br />   * <br />   * @param hsql<br />   *            查询语句<br />   * @return 符合条件的对象集吿<br />   */<br />  public List&lt;T> getEntities(String hsql);<br /><br />  /**<br />   * 使用带参数的HQL语句进行查询<br />   * <br />   * @param hsql<br />   * @param obj<br />   * @return<br />   */<br />  public List&lt;T> getEntities(String hsql, Object[] values);<br /><br />  public List&lt;T> getEntities(String hql, int start, int number);<br /><br />  public List&lt;T> getEntities(String hql, int start, int number,<br />      Object[] values);<br /><br />  /**<br />   * 使用命名的HQL语句棿索数捿<br />   * <br />   * @param queryName<br />   * @return<br />   */<br />  public List&lt;T> findByNamedQuery(String queryName);<br /><br />  /**<br />   * 使用带参数的命名HSQL语句棿索数捿<br />   * <br />   * @param queryName<br />   * @param values<br />   * @return<br />   */<br />  public List&lt;T> findByNamedQuery(String queryName, Object[] values);<br /><br />  /**<br />   * 使用带命名参数的命名HSQL语句棿索数捿<br />   * <br />   * @param queryName<br />   * @param paramNames<br />   * @param values<br />   * @return<br />   */<br />  public List&lt;T> findByNamedQuery(String queryName, String[] paramNames,<br />      Object[] values);<br /><br />  /**<br />   * 使用HQL语句棿索数据，返回 Iterator<br />   * <br />   * @param queryString<br />   * @return<br />   */<br />  public Iterator&lt;T> iterate(String queryString);<br /><br />  /**<br />   * 使用带参数HSQL语句棿索数据，返回 Iterator<br />   * <br />   * @param queryString<br />   * @param values<br />   * @return<br />   */<br />  public Iterator&lt;T> iterate(String queryString, Object[] values);<br /><br />  /***************************************************************************<br />   * -----------------------------Criteria动濁查诿---------------------------- *<br />   **************************************************************************/<br /><br />  /**<br />   * 创建与会话无关的棿索标准对豿<br />   */<br />  public DetachedCriteria createDetachedCriteria();<br /><br />  /**<br />   * 创建与会话绑定的棿索标准对豿<br />   * <br />   * @return<br />   */<br />  public Criteria createCriteria();<br /><br />  /**<br />   * 使用指定的检索标准检索数捿<br />   * <br />   * @param criteria<br />   * @return<br />   */<br />  public List&lt;T> findByCriteria(DetachedCriteria criteria);<br /><br />  /**<br />   * 使用指定的检索标准检索数据，返回部分记录<br />   * <br />   * @param criteria<br />   * @param firstResult<br />   * @param maxResults<br />   * @return<br />   */<br />  public List&lt;T> findByCriteria(DetachedCriteria criteria, int firstResult,<br />      int maxResults);<br /><br />  /**<br />   * 通过动濁查询条件进行查诿<br />   * <br />   * @param criterion<br />   * @return List&lt;T><br />   */<br />  @SuppressWarnings("unchecked")<br />  public List&lt;T> findByCriteria(Criterion... criterion);<br /><br />  /**<br />   * 使用指定的检索标准检索数据，返回指定范围的记彿<br />   * <br />   * @param criteria<br />   * @return<br />   */<br />  public Integer getRowCount(DetachedCriteria criteria);<br /><br />  /**<br />   * 使用指定的检索标准检索数据，返回指定统计倿<br />   * <br />   * @param criteria<br />   * @param propertyName<br />   * @param StatName<br />   *            (max,min,avg,sum)<br />   * @return<br />   */<br />  public Object getStatValue(DetachedCriteria criteria, String propertyName,<br />      String StatName);<br /><br />  /**<br />   * 通过给定的一个对象，查找与其匹配的对象，表关联比较多时，用户可以自己根据霿要扩展㿿<br />   * <br />   * @param entity<br />   * @return List&lt;T><br />   */<br />  public List&lt;T> findByExample(T entity);<br /><br />  /***************************************************************************<br />   * -------------------------Others ----------------------------------------*<br />   **************************************************************************/<br /><br />  /**<br />   * 加锁指定的实使<br />   * <br />   * @param entity<br />   * @param lockMode<br />   */<br />  public void lock(T entity, LockMode lockMode);<br /><br />  /**<br />   * 强制立即更新缓冲数据到数据库（否则仅在事务提交时才更新）<br />   */<br />  public void flush();<br /><br />  /**<br />   * 清空缓存<br />   * <br />   * void<br />   */<br />  public void clear();<br /><br />  /***************************************************************************<br />   * --------------------------------相关知识炿--------------------------------*<br />   * <br />   * 1、Session的load方法和get方法都是通过给定的ID从数据库中加载一个持久化的对象㿂但两个斿*<br />   * 法的区别在于：当数据库不存在于ID对应的记录时，load()方法抛出异常，迌get()方法返回null*<br />   ***************************************************************************/<br /><br />} <br /><br /> <br /><br />设计完接口，我们就要实现我们创建的接口，我们如果使用Hibernate，那么就做一个hibernate的实现，如果使用JPA，那么就做一个JPA实现。以下采用hibernate进行实现。<br /><br />通用Hibernate DAO实现：<br /><br />package com.baiyyy.util.dao;<br /><br />/**<br /> * @filename:BaseHibernateDAO.java<br /> */<br /><br />import java.io.Serializable;<br />import java.util.Collection;<br />import java.util.Iterator;<br />import java.util.List;<br /><br />import org.hibernate.Criteria;<br />import org.hibernate.LockMode;<br />import org.hibernate.Query;<br />import org.hibernate.Session;<br />import org.hibernate.criterion.Criterion;<br />import org.hibernate.criterion.DetachedCriteria;<br />import org.hibernate.criterion.Example;<br />import org.hibernate.criterion.MatchMode;<br />import org.hibernate.criterion.Projections;<br /><br />import com.baiyyy.workflow.pojo.TWfPackage;<br /><br />/**<br /> * 用Hibernate实现通用DAO接口<br /> * <br /> * @author yongtree<br /> * @date 2008-3-10<br /> * @param &lt;T><br /> * @param &lt;ID><br /> */<br />public class BaseHibernateDAO&lt;T, ID extends Serializable> implements<br />    IBaseDAO&lt;T, ID> {<br />  // 保持实体对象类的类型<br />  private Class&lt;T> persistentClass;<br /><br />  private Session session;<br /><br />  /**<br />   * 构鿠方泿<br />   */<br />  @SuppressWarnings("unchecked")<br />  public BaseHibernateDAO() {<br />    //下面这种方式丿直有错误，不能得到真正的T.class，迌是Object.class<br />    // this.persistentClass=GenericsUtils.getSuperClassGenricType(getClass());<br />    // System.out.println(obj.getClass().getName());<br />  }<br /><br />  @SuppressWarnings("unchecked")<br />  public BaseHibernateDAO(Class clazz) {<br />    this.persistentClass = clazz;<br />  }<br /><br />  /**<br />   * @param session<br />   *            the session to set<br />   */<br />  public void setSession(Session session) {<br />    this.session = session;<br />  }<br /><br />  /**<br />   * 得到当前线程的Session对象的实便<br />   * <br />   * @return<br />   */<br />  protected Session getSession() {<br />    System.out.println("get session");<br />    return HibernateUtil.getCurrentSession();<br />  }<br /><br />  /**<br />   * 得到持久化对象的类型<br />   * <br />   * @return 持久化类的类垿<br />   */<br />  protected Class&lt;T> getPersistentClass() {<br />    return persistentClass;<br />  }<br /><br />  @SuppressWarnings("unchecked")<br />  public T findById(ID id, LockMode lock) {<br />    // TODO Auto-generated method stub<br />    T entity = (T) getSession().get(getPersistentClass(), id, lock);<br />    if (entity != null) {<br />      this.flush();<br />    }<br /><br />    return entity;<br />  }<br /><br />  @SuppressWarnings("unchecked")<br />  public T findById(Class c, ID id) {<br />    // TODO Auto-generated method stub<br />    T entity;<br /><br />    entity = (T) getSession().get(c, id);<br /><br />    return entity;<br />  }<br /><br />  @SuppressWarnings("unchecked")<br />  public T findById(ID id) {<br />    // TODO Auto-generated method stub<br />    T entity = (T) getSession().get(getPersistentClass(), id);<br /><br />    return entity;<br />  }<br /><br />  @SuppressWarnings("unchecked")<br />  public T loadById(ID id) {<br />    // TODO Auto-generated method stub<br />    T entity = (T) getSession().load(getPersistentClass(), id);<br />    return entity;<br />  }<br /><br />  @SuppressWarnings("unchecked")<br />  public T loadById(Class c, ID id) {<br />    // TODO Auto-generated method stub<br />    T entity = (T) getSession().load(c, id);<br />    return entity;<br />  }<br /><br />  @SuppressWarnings("unchecked")<br />  public T loadById(ID id, LockMode lock) {<br />    // TODO Auto-generated method stub<br />    T entity = (T) getSession().load(getPersistentClass(), id, lock);<br />    return entity;<br />  }<br /><br />  @SuppressWarnings("unchecked")<br />  public List&lt;T> loadAll() {<br />    List&lt;T> list = getSession().createQuery(<br />        "from " + getPersistentClass().getName()).list();<br />    return list;<br />  }<br /><br />  public T saveEntity(T entity) {<br />    // TODO Auto-generated method stub<br /><br />    getSession().save(entity);<br />    this.flush();<br />    return entity;<br />  }<br /><br />  public void updateEntity(T entity) {<br />    // TODO Auto-generated method stub<br />    getSession().saveOrUpdate(entity);<br />    this.flush();<br />  }<br /><br />  /**<br />   * 该实现类暂时没有实现更新加锁的操使<br />   */<br />  public void updateEntity(T entity, LockMode lock) {<br />    // TODO Auto-generated method stub<br />    getSession().saveOrUpdate(entity);<br />    this.flush();<br />  }<br /><br />  public void saveOrUpdateAll(Collection&lt;T> entities) {<br />    getSession().saveOrUpdate(entities);<br />    this.flush();<br />  }<br /><br />  public void deleteEntity(T entity) {<br />    // TODO Auto-generated method stub<br />    getSession().delete(entity);<br />    this.flush();<br />  }<br /><br />  /**<br />   * 该实现没有实现加锁删除对象的操作，在spring的DAO实现中已经实玿<br />   */<br />  public void deleteEntity(T entity, LockMode lock) {<br />    // TODO Auto-generated method stub<br />    getSession().delete(entity);<br />    this.flush();<br />  }<br /><br />  public void deleteEntityById(ID id) {<br />    this.deleteEntity(this.loadById(id));<br />    this.flush();<br />  }<br /><br />  // 该实现没有实现加锁的删除，在spring的dao中已经实现了<br />  public void deleteEntityById(ID id, LockMode lock) {<br />    this.deleteEntity(this.loadById(id));<br />    this.flush();<br />  }<br /><br />  public void deleteAll(Collection&lt;T> entities) {<br />    this.flush();<br />    getSession().delete(entities);<br />  }<br />  <br />  public void merge(T entity){<br />    getSession().merge(entity);<br />    this.flush();<br />  }<br /><br />  @SuppressWarnings("unchecked")<br />  public T getEntity(String hsql) {<br />    T uniqueResult = (T) getSession().createQuery(hsql).uniqueResult();<br />    // TODO Auto-generated method stub<br />    return uniqueResult;<br />  }<br /><br />  @SuppressWarnings("unchecked")<br />  public List&lt;T> getEntities(String hsql) {<br />    // TODO Auto-generated method stub<br /><br />    List list = getSession().createQuery(hsql).list();<br />    return list;<br />  }<br /><br />  @SuppressWarnings("unchecked")<br />  public List&lt;T> getEntities(String hql, int start, int number,<br />      Object[] values) {<br />    // TODO Auto-generated method stub<br />    Query query = getSession().createQuery(hql);<br />    for (int i = 0; i &lt; values.length; i++) {<br />      query.setParameter(i, values[i]);<br />    }<br />    query.setFirstResult(start);<br />    query.setMaxResults(number);<br />    List list = query.list();<br />    return list;<br />  }<br /><br />  @SuppressWarnings("unchecked")<br />  public List&lt;T> getEntities(String hql, int start, int number) {<br />    // TODO Auto-generated method stub<br />    Query query = getSession().createQuery(hql);<br />    query.setFirstResult(start);<br />    query.setMaxResults(number);<br />    List list = query.list();<br />    return list;<br />  }<br /><br />  @SuppressWarnings("unchecked")<br />  public List&lt;T> getEntities(String hql, Object[] values) {<br />    // TODO Auto-generated method stub<br />    Query query = getSession().createQuery(hql);<br />    for (int i = 0; i &lt; values.length; i++) {<br />      query.setParameter(i, values[i]);<br />    }<br />    return query.list();<br />  }<br /><br />  @SuppressWarnings("unchecked")<br />  public List&lt;T> findByNamedQuery(String queryName) {<br />    // TODO Auto-generated method stub<br />    return getSession().getNamedQuery(queryName).list();<br />  }<br /><br />  @SuppressWarnings("unchecked")<br />  public List&lt;T> findByNamedQuery(String queryName, Object[] values) {<br />    // TODO Auto-generated method stub<br />    Query query = getSession().getNamedQuery(queryName);<br />    for (int i = 0; i &lt; values.length; i++) {<br />      query.setParameter(i, values);<br />    }<br />    return query.list();<br />  }<br /><br />  /**<br />   * 注意：该方法是鿚过设置参数来进行命名查询，承以在传参数时，一定要注意paramNames和values的长度，位置要一丿对应〿<br />   */<br />  @SuppressWarnings("unchecked")<br />  public List&lt;T> findByNamedQuery(String queryName, String[] paramNames,<br />      Object[] values) {<br />    // TODO Auto-generated method stub<br />    Query query = getSession().getNamedQuery(queryName);<br />    for (int i = 0; i &lt; paramNames.length; i++) {<br />      query.setParameter(paramNames[i], values[i]);<br />    }<br />    return query.list();<br />  }<br /><br />  @SuppressWarnings("unchecked")<br />  public Iterator&lt;T> iterate(String hql) {<br />    // TODO Auto-generated method stub<br />    return getSession().createQuery(hql).iterate();<br />  }<br /><br />  @SuppressWarnings("unchecked")<br />  public Iterator&lt;T> iterate(String hql, Object[] values) {<br />    // TODO Auto-generated method stub<br />    Query query = getSession().createQuery(hql);<br />    for (int i = 0; i &lt; values.length; i++) {<br />      query.setParameter(i, values[i]);<br />    }<br />    return query.iterate();<br />  }<br /><br />  public DetachedCriteria createDetachedCriteria() {<br />    // TODO Auto-generated method stub<br />    return DetachedCriteria.forClass(this.persistentClass);<br />  }<br /><br />  public Criteria createCriteria() {<br />    // TODO Auto-generated method stub<br />    return this.createDetachedCriteria().getExecutableCriteria(<br />        this.getSession());<br />  }<br /><br />  /**<br />   * 该方法没有经过验证，不能保证正确，在spring的实现中已经实现亿<br />   */<br />  @SuppressWarnings("unchecked")<br />  public List&lt;T> findByCriteria(DetachedCriteria criteria) {<br />    // TODO Auto-generated method stub<br />    return criteria.getExecutableCriteria(this.getSession()).list();<br />  }<br /><br />  @SuppressWarnings("unchecked")<br />  public List&lt;T> findByCriteria(DetachedCriteria criteria, int firstResult,<br />      int maxResults) {<br />    // TODO Auto-generated method stub<br />    return criteria.getExecutableCriteria(this.getSession())<br />        .setFirstResult(firstResult).setMaxResults(maxResults).list();<br /><br />  }<br /><br />  /**<br />   * 动濁查诿<br />   * <br />   * @param criterion<br />   * @return<br />   */<br />  public @SuppressWarnings("unchecked")<br />  List&lt;T> findByCriteria(Criterion... criterion) {<br />    Criteria crit = getSession().createCriteria(getPersistentClass());<br />    for (Criterion c : criterion) {<br /><br />      if (c != null) {<br /><br />        crit.add(c);<br /><br />      }<br />    }<br />    List list = crit.list();<br />    return list;<br />  }<br /><br />  @SuppressWarnings("unchecked")<br />  public Integer getRowCount(DetachedCriteria criteria) {<br />    // TODO Auto-generated method stub<br />    criteria.setProjection(Projections.rowCount());<br />    List list = this.findByCriteria(criteria, 0, 1);<br />    return (Integer) list.get(0);<br /><br />  }<br /><br />  @SuppressWarnings("unchecked")<br />  public Object getStatValue(DetachedCriteria criteria, String propertyName,<br />      String StatName) {<br />    // TODO Auto-generated method stub<br />    if (StatName.toLowerCase().equals("max"))<br />      criteria.setProjection(Projections.max(propertyName));<br />    else if (StatName.toLowerCase().equals("min"))<br />      criteria.setProjection(Projections.min(propertyName));<br />    else if (StatName.toLowerCase().equals("avg"))<br />      criteria.setProjection(Projections.avg(propertyName));<br />    else if (StatName.toLowerCase().equals("sum"))<br />      criteria.setProjection(Projections.sum(propertyName));<br /> 