﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-GodSpeed</title><link>http://www.cnblogs.com/GodSpeed/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 28 Aug 2008 20:48:45 GMT</lastBuildDate><pubDate>Thu, 28 Aug 2008 20:48:45 GMT</pubDate><ttl>60</ttl><item><title>白话设计模式--结构型模式之 适配器模式(Adapter)</title><link>http://www.cnblogs.com/GodSpeed/archive/2008/08/26/1276756.html</link><dc:creator>GodSpeed</dc:creator><author>GodSpeed</author><pubDate>Tue, 26 Aug 2008 07:46:00 GMT</pubDate><guid>http://www.cnblogs.com/GodSpeed/archive/2008/08/26/1276756.html</guid><wfw:comment>http://www.cnblogs.com/GodSpeed/comments/1276756.html</wfw:comment><comments>http://www.cnblogs.com/GodSpeed/archive/2008/08/26/1276756.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/GodSpeed/comments/commentRss/1276756.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/GodSpeed/services/trackbacks/1276756.html</trackback:ping><description><![CDATA[<p><br />
适配其实在生活中的例子很多。一个<strong>变压器</strong>就是最好的例子。<br />
我们不能要求供电局为了我们的随身听而把电压变成12V，只能使用一个变压器把220V的电转换成12V的。这就是个适配器的很好的</p>
<p>例子。新的需求就是我们要12V的电，而原来的电只能提供220V，那么我们就定义一个接口叫做"12V电源使用"，然后定一个Adapter</p>
<p>变压器，里面接收（组合）了220V的电源，在里面经过一系列的动作以后，实现了"12V电源使用"这个接口，传出12V电源。</p>
<p>&nbsp;</p>
<p>设计模式中的适配器模式可以分为<strong>对象适配器和类适配器</strong></p>
<p><strong>对象适配器中适配与被适配的对象是组合关系</strong>，符合面向对象设计原则：优先选择组合方案，而不是继承方案。</p>
<p><strong>类的适配器中适配与被适配的对象是继承关系</strong>，适配器要继承被适配对象和新的接口。由于C＃(vb.net)并不支持多继承，所以限制</p>
<p>了类适配器的使用，所以在dotnet中并<strong>不推荐</strong>使用这种适配方式。</p>
<p>当一个对象A不能满足新需求R时，就可以定义一个适配器Adaper，把A组合到新的Adaper中。在Adaper中使用A的功能和新功能以满</p>
<p>足新需求R。<br />
这句话就说明了适配器模式。适配器就是Adaper，被适配的对象就是A，新需求R可以定义一个接口，并用适配器实现这个接口。</p>
<p>&nbsp;</p>
<p>在软件设计过程中，也有很多不那么规范的Adapter模式，但是它们也是适配器的思想，也叫做适配器。<br />
如果我们现在存在一个Case类，代表工作。现在有个新的需求,要求对Case根据一些条件进行排序。而Case类本身是没有排序功能的</p>
<p>，这么办呢？ Aapter模式就有用了。在这种情况下，我们可以做个Adapter，它实现Icompareable接口。在使用时，直接为Case数</p>
<p>组调用Sort方法，并传入Case数组和刚才新建的adapter对象就可以了。但是这么实现呢？在适配器（CaseAdapter)里实现一个</p>
<p>Compare方法，传进去两个Case对象，根据Case的某个属性，返回一个数值。根据这个值就知道哪个该放在前面了。在这里，并没有</p>
<p>把被适配的对象Case放入Adapter中，而是直接通过参数传入。这并没有符合设计模式的结构，但是却使用了适配器模式的思想.调用代码如下:</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_153914" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_153914').style.display='none'; document.getElementById('Code_Open_Image_153914').style.display='inline'; document.getElementById('Code_Open_Text_153914').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_153914" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_153914').style.display='none'; getElementById('Code_Closed_Image_153914').style.display='inline'; getElementById('Code_Closed_Text_153914').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_153914">Code</span><span id="Code_Open_Text_153914" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_27_123_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_27_123_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_27_123_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_27_123_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_27_123_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_27_123_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_27_123_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_27_123_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"><span style="color: #000000">&nbsp;Case[]&nbsp;cases&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Case[]&nbsp;</span><span id="Codehighlighter1_27_123_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_27_123_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Case(</span><span style="color: #800080">1</span><span style="color: #000000">),&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Case(</span><span style="color: #800080">3</span><span style="color: #000000">),&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Case(</span><span style="color: #800080">5</span><span style="color: #000000">),&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Case(</span><span style="color: #800080">44</span><span style="color: #000000">),&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Case(</span><span style="color: #800080">8</span><span style="color: #000000">),&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Case(</span><span style="color: #800080">555</span><span style="color: #000000">),&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Case(</span><span style="color: #800080">8</span><span style="color: #000000">)&nbsp;}</span></span><span style="color: #000000">;<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #800000">"</span><span style="color: #800000">before&nbsp;sort</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;cases.Length;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img id="Codehighlighter1_235_305_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_235_305_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_235_305_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_235_305_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_235_305_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_235_305_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_235_305_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_235_305_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_235_305_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_235_305_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(cases[i].ItemCount);<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Array.Sort(cases,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CaseCompareAdapter());<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #800000">"</span><span style="color: #800000">after&nbsp;sort</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;cases.Length;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img id="Codehighlighter1_472_542_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_472_542_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_472_542_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_472_542_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_472_542_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_472_542_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_472_542_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_472_542_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_472_542_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_472_542_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(cases[i].ItemCount);<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadLine();</span></span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>那么，如果标准的适配器模式结构是怎么样的呢？<br />
假设我们现在要为Case加上一个TellAlerm的方法，但是却不能去修改Case类，这时就可以使用Adapter了。<br />
我们新建一个CaseAlermAdapterStandard类，然后在构造方法中初始化一个Case对象。然后定义一个方法叫做TellAlarm，返回一个字符串。定义一个ItemCount，返回构造函数中的Case的ItemCount。现在就可以调用了。</p>
<p>调用代码如下：</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_153841" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_153841').style.display='none'; document.getElementById('Code_Open_Image_153841').style.display='inline'; document.getElementById('Code_Open_Text_153841').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_153841" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_153841').style.display='none'; getElementById('Code_Closed_Image_153841').style.display='inline'; getElementById('Code_Closed_Text_153841').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_153841">Code</span><span id="Code_Open_Text_153841" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">standard&nbsp;structure&nbsp;for&nbsp;adapter&nbsp;design&nbsp;pattern</span><span style="color: #008000"><br />
</span><span style="color: #008080">2</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CaseAlarmAdapterStandard&nbsp;cAdapter&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CaseAlarmAdapterStandard(</span><span style="color: #800080">6</span><span style="color: #000000">);<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(cAdapter.ItemCount);<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cAdapter.ItemCount&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">788</span><span style="color: #000000">;<br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(cAdapter.ItemCount);<br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(cAdapter.TellAlarm(</span><span style="color: #800000">"</span><span style="color: #800000">due&nbsp;to&nbsp;deadline!</span><span style="color: #800000">"</span><span style="color: #000000">));<br />
</span><span style="color: #008080">7</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadLine();</span></span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>完整的适配器代码:<a title="Adapter design pattern" href="http://files.cnblogs.com/GodSpeed/AdapterDesignPattern.zip">Adapter design pattern</a></p>
<p>&nbsp;</p>
<p>我说完这些,自己却有个疑惑,所谓适配器,是不是就是被适配的对象的<strong style="color: red">所有功能+新功能</strong>呢?还是说根据需要选择被适配对象的功能?我个人觉得可能应该是根据需要选择被适配对象的功能.因为有可能我这个适配器不需要那么多功能,只需要被适配对象的一部分功能+新接口定义的功能,就可以满足要求了.</p>
<p>欢迎大家拍砖,我是学习设计模式的新手,希望大家多多指教.<br />
</p>
 <img src ="http://www.cnblogs.com/GodSpeed/aggbug/1276756.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41943/" target="_blank">[新闻]轮回－新浪推出Facebook模式的SNS</a>]]></description></item><item><title>白话设计模式--创建型设计模式总结</title><link>http://www.cnblogs.com/GodSpeed/archive/2008/08/20/1272289.html</link><dc:creator>GodSpeed</dc:creator><author>GodSpeed</author><pubDate>Wed, 20 Aug 2008 07:35:00 GMT</pubDate><guid>http://www.cnblogs.com/GodSpeed/archive/2008/08/20/1272289.html</guid><wfw:comment>http://www.cnblogs.com/GodSpeed/comments/1272289.html</wfw:comment><comments>http://www.cnblogs.com/GodSpeed/archive/2008/08/20/1272289.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/GodSpeed/comments/commentRss/1272289.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/GodSpeed/services/trackbacks/1272289.html</trackback:ping><description><![CDATA[<p>到今天为止把创建型的几种设计模式算是学完了,搞一段落.进行一下总结.</p>
<p>时间比较短,还好创建型的比较简单,以后估计不会这么顺利了.由于没有真正的实践在项目中,所以到现在为止,我认为我还没有掌握,仅仅是对设计模式有些了解而已.</p>
<p>人家说英语是说出来的,所以我也把我知道的关于创建型的设计模式的相关知识总结出来,供大家参考和讨论,希望能与各位同仁共同进步.</p>
<p>&nbsp;</p>
<p>创建型模式,主要用来解决new所带来的对象间的耦合关系,除了singleton和prototype之外,都需要使用factory来负责对象的实例化，prototype是通过原型（也就是抽象）来克隆对象。</p>
<p>&nbsp;</p>
<p>白话一点儿说，创建型模式就是把有可能经常变化的对象单独拎出来处理，使这些经常变化的部分在发生变化时不会影响整个系统。</p>
<p>&nbsp;</p>
<p>GOF设计模式有5种是创建模式.</p>
<p>其中Singleton模式用来控制对象创建的个数,一般是一个,可以通过变化创建指定数量的对象.</p>
<p>&nbsp;</p>
<p>factory method模式是最最基础的创建型模式，也是最基础的设计模式之一。既然是面向对象编程，当然要创建对象。factory method模式就是解决了对象的基本创建问题。对象通过自己的工厂创建实例，在<strong>创建点</strong>不依赖具体实现而仅仅依赖于对象自己的抽象。编译时只知道要创建哪种对象（抽象），运行时才知道具体会创建这种对象的哪个对象。反正一种对象的行为都是相似的，所以抽象也是一样的。只是具体实现不同。比如车都能转弯，只是摩托车和汽车转弯的具体实现不同，但抽象是相同的。这里编译时只说车要转弯，在运行时再具体告诉程序是哪个车要转弯。</p>
<p>&nbsp;</p>
<p>abstract factory模式是在factory method模式的基础上发展而来， factory method模式只解决了创建哪个对象的问题，而abstract factory解决了创建哪个系列对象的问题。这一系列对象之间可能有很多关联和交互。白话点而说就是，比如我们肯定都用床上用品，包括床单，被罩和枕巾等。我们不会一辈子都用一套吧，肯定要换洗的，有坏的还得换新的（这里假设整套整套坏/换）。那么abstract factory就用上了。一次创建一套床上用品，不用修改任何地方，只需要增加新的床单类，被罩类和枕巾类，然后在调用时告诉系统，我要用这个新的。就OK了，符合了面向对象的对修改关闭对扩展开放的原则。</p>
<p>&nbsp;</p>
<p>builder模式与factory method一样，都是创建一个对象。但是它却是创建了一个超级复杂的对象。它可以让我们通过相同的创建过程创建出不同的表示。在这里，创建对象的算法是稳定的，但是对象的各个部分却是不稳定的，经常会变。比如要建造一个房子，建造房子的过程，比如打地基，搭架子，垒砖这些骨干的过程是不变的，这是稳定的算法。但是在造门和窗户的时候却有可能经常发生变化。有可能这个房子要用A工厂的门，那个房子却要用B工厂的门。这是就要用到builder模式了。不管你用谁的门，但是造出来的肯定得是房子。</p>
<p>&nbsp;</p>
<p>prototype模式诠释了面向对象的依赖倒置原则。当一个Manager对象依赖某个具体实现时，我们把这个实现抽象出来（前提是这个对象是易变的），使Manager对象依赖于这个抽象，这样，以后扩展新的基于这个抽象的实现就会easy了。而manager里通过<strong>抽象</strong>的克隆创建需要数量的对象。这样，manager只依赖抽象。我想这也是我们提倡面向接口编程的原因。</p>
<p>&nbsp;</p>
<p>总之，创建型模式解决了软件设计中对象创建的问题，通常，往往是我们遇到了易变类，才会使用创建型模式，至于使用哪种，就要看易变类和系统的特性了。</p>
<p>&nbsp;</p>
<p>欢迎大家拍砖。我知道这文章简单浅显，只希望牛人飘过不留痕，菜鸟飞过有收获。</p>
<img src ="http://www.cnblogs.com/GodSpeed/aggbug/1272289.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41940/" target="_blank">[新闻]惠普139亿美元完成对EDS的收购</a>]]></description></item><item><title>关于sql server安装完毕后没有business intelligence development studio工具的问题</title><link>http://www.cnblogs.com/GodSpeed/archive/2008/08/13/1267009.html</link><dc:creator>GodSpeed</dc:creator><author>GodSpeed</author><pubDate>Wed, 13 Aug 2008 07:54:00 GMT</pubDate><guid>http://www.cnblogs.com/GodSpeed/archive/2008/08/13/1267009.html</guid><wfw:comment>http://www.cnblogs.com/GodSpeed/comments/1267009.html</wfw:comment><comments>http://www.cnblogs.com/GodSpeed/archive/2008/08/13/1267009.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/GodSpeed/comments/commentRss/1267009.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/GodSpeed/services/trackbacks/1267009.html</trackback:ping><description><![CDATA[<p>我相信很多同学在费了好多时间安装了sql server 2005之后,发现没办法使用，因为bids不见了.真晕.更奇怪的是,删除后重新安装，就有了.</p>
<p>经我研究发现,原来,在我们安装vs2005时,系统自动安装了一个sql server 2005 express,而在安装sql server 2005时,系统检查到已经安装了workstation,所以就不再装了.</p>
<p>&nbsp;</p>
<p>那怎么解决呢?最好的解决办法就是在安装vs2005时不要安装sql server 2005 express</p>
<p>如果已经装完了，那么最后用如下解决办法</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 在控制面版中更改sql server 安装,把最后那个项(好象是workstation组建)干掉,然后再安装一遍工具下面的setup.exe</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 如果还有问题,给我留言啊 </p>
<p>&nbsp;</p>
<p><span style="color: red">补充一下,在干掉了最后那个组件后我发现了个问题，各种service都不不见了。只好又再重新装一次实例，当然，这可比整个sqlserver都重新装可省好多时间了。</span></p>
<p><span style="color: red">不知道是我在第一次装的时候就忘了装service了还是卸载workstation时给卸掉了</span></p>
<p>&nbsp;</p>
<img src ="http://www.cnblogs.com/GodSpeed/aggbug/1267009.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41939/" target="_blank">[新闻]搜狗五笔输入法发布</a>]]></description></item><item><title>白话设计模式--抽象工厂（AbstractFactory）</title><link>http://www.cnblogs.com/GodSpeed/archive/2008/08/12/1266144.html</link><dc:creator>GodSpeed</dc:creator><author>GodSpeed</author><pubDate>Tue, 12 Aug 2008 08:50:00 GMT</pubDate><guid>http://www.cnblogs.com/GodSpeed/archive/2008/08/12/1266144.html</guid><wfw:comment>http://www.cnblogs.com/GodSpeed/comments/1266144.html</wfw:comment><comments>http://www.cnblogs.com/GodSpeed/archive/2008/08/12/1266144.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/GodSpeed/comments/commentRss/1266144.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/GodSpeed/services/trackbacks/1266144.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一直觉得设计模式是非常抽象的（事实上MS也是。。。），所以就想把它说的白话点儿，让人更容易理解。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关于抽象工厂（Abstract Factory)模式，网上一个非常流行的例子，麦当劳和肯德基的故事。具体怎么说的我已经忘了，但是我想自己描述一遍，希望能让自己加深对设计模式思想的理解，也希望对大家有所帮助。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 既然叫抽象工厂，那一定有工厂（废话）。那么我们可以认为麦当劳和肯德基就是生产食物的工厂，那么理所当然，汉堡和鸡腿是他们共同生产的两种食物，不管你去MDL还是KDJ，说：我要鸡腿，那肯定不会给你拿来烤羊腿。嘿嘿&nbsp;。这里，我们假定麦当劳和肯德基只生产这两种产品（这很重要，因为<span style="color: red">抽象工厂模式的一个很重要的场景就是产品相对稳定，如果要经常新增新产品，那么需要和另外的设计模式混合使用或寻求其它解决方案，这里不赘述</span>）。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;情况已经很明显了，我们是消费者，我们就是客户，就是产品的消费者，就是程序中对象的调用者。而麦当劳和肯德基，理所当然的，他们就是工厂，一个叫做麦当劳工厂，一个叫做肯德基工厂，他们是真正的生产者，而对于我们这些客户消费者（程序中对象的调用者）来说，不管是去麦当劳还是肯德基，我们都说一样的话（我们的要求是稳定的）：<span style="color: red"><strong>我要鸡腿。</strong><span style="color: #000000">只要我们提出这个请求，那么肯定会得到我们想要的。</span></span><span style="color: red"><span style="color: #000000">而作为工厂（生产者），麦当劳和肯德基都生产鸡腿和汉堡，所以抽象出来的抽象工厂都具有生产鸡腿和生产汉堡的功能，这是接口中的两个方法。因为在这个接口中，还不知道到底要生产谁家的产品，所以只能返回个抽象的鸡腿或汉堡，等到麦当劳或者肯德基工厂生产出来，就知道是谁家的了。（有标志嘛，哈哈，这就是动态创建对象）</span></span></p>
<p><span style="color: red"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不管是麦当劳还是肯德基的鸡腿或汉堡，它的本质都是鸡腿或汉堡，所以可以抽象出来。那么鸡腿就派生出麦当劳的鸡腿和肯德基的鸡腿，而汉堡就派生出麦当劳的汉堡和肯德基的汉堡。而对于我们这些客户消费者（程序中对象的调用者）来说，不管是去麦当劳还使肯德基，我们都说一样的话（我们的要求是稳定的）：我要鸡腿。只要我们提出这个要求，那么肯定会得到我们想要的。不管是谁家的鸡腿，肯定是鸡腿不会是羊腿。所以，我们只要规定好是鸡腿（接口）就行了，而让工厂去绝对具体的制作过程。我们只伸手接过来一个鸡腿，狠狠的咬一口，恩，真香~：）</span></span></p>
<p><span style="color: red"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 到现在为止，我们只和鸡腿（抽象的接口）还有抽象工厂（因为我们不管是麦当劳还是肯德基，我们只要鸡腿）打交道。</span></span></p>
<p><span style="color: red"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当我们走向一个快餐店，这个过程就决定了我们到底要哪个工厂来生产鸡腿和汉堡。我们可以把我们消费的习惯存入大脑，每次出门直接取出来，就只管走就行了。也不用看到底是走向了哪里，反正最后吃了好多鸡腿和汉堡，饱饱的走了。：）哈哈&nbsp;&nbsp; 理论讲解完毕，那么现在看看UML图。</span></span></p>
<p><span style="color: red"><span style="color: #000000"><img style="width: 606px; height: 567px" height="567" alt="" src="http://images.cnblogs.com/cnblogs_com/godspeed/AbstractFactory.JPG" width="606" border="0" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span style="color: red"></span>&nbsp;</p>
<p><span style="color: red"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那么，现在，大家应该已经看清楚。这张图是我自己随手画的，画完之后发现，哇，这不就是经典的AbstractFactory模式的那张图吗？现在，你了解吗？</span></span></p>
<p><span style="color: red"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 必胜客来了，也做汉堡和鸡腿。那么怎么办呢？非常容易，我们消费者根本不管这些，只管把必胜客加入我们的大脑（配置文件），需要的时候，直接走进去就行了。仅仅需要添加一个必胜客工厂，必胜客汉堡，必胜客鸡腿，OK，一切搞定。那么又有人问了，我要喝汽水怎么办呢？我偷偷告诉你，这里不卖~：）哈哈，希望大家学习愉快，工作愉快</span></span></p>
<img src ="http://www.cnblogs.com/GodSpeed/aggbug/1266144.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41938/" target="_blank">[新闻]新学年开始 大学生适用的十大互联网应用</a>]]></description></item><item><title>一个批量更新的sql语句引发的关于创业者心态的思考</title><link>http://www.cnblogs.com/GodSpeed/archive/2008/08/05/1261289.html</link><dc:creator>GodSpeed</dc:creator><author>GodSpeed</author><pubDate>Tue, 05 Aug 2008 09:59:00 GMT</pubDate><guid>http://www.cnblogs.com/GodSpeed/archive/2008/08/05/1261289.html</guid><wfw:comment>http://www.cnblogs.com/GodSpeed/comments/1261289.html</wfw:comment><comments>http://www.cnblogs.com/GodSpeed/archive/2008/08/05/1261289.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/GodSpeed/comments/commentRss/1261289.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/GodSpeed/services/trackbacks/1261289.html</trackback:ping><description><![CDATA[<p><font face="Verdana"></font>&nbsp;</p>
<p>因为以前做过一段时间reporting service,一直觉得自己的sql 语句已经炉火纯青了，今天大挫。</p>
<p>&nbsp;</p>
<p>一个很简单的东西，让我想了一个上午。</p>
<p>&nbsp;</p>
<p>当需要<span style="color: red">批量更新某现存表的某个字段</span>时，咱们办呢，我开始以为很简单，拿到手中一做，问题一大堆。</p>
<p>&nbsp;</p>
<p>出了问题不是重点，重点是我对待问题的态度是不对的，所以要记录下来，以备将来反省。</p>
<p>&nbsp;</p>
<p>人应该谦虚，不能骄傲，有点儿成就就不知道天高地厚了，以为天老大地老二我老三了。必要的自我激励是需要的，但也要避免使自己陷入自大的误区。</p>
<p>&nbsp;</p>
<p>要时刻提醒自己我是最好的，心理同时也要时刻警醒自己不能自大，还有很多东西要学。</p>
<p>&nbsp;</p>
<p>最后，把这个小问题贴出来：</p>
<p><font face="Verdana">&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_174541" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_174541').style.display='none'; document.getElementById('Code_Open_Image_174541').style.display='inline'; document.getElementById('Code_Open_Text_174541').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_174541" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_174541').style.display='none'; getElementById('Code_Closed_Image_174541').style.display='inline'; getElementById('Code_Closed_Text_174541').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_174541">Code</span><span id="Code_Open_Text_174541" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">UPDATE&nbsp;table1<br />
SET&nbsp;Col</span><span style="color: #000000">=</span><span style="color: #000000">t2.ColValue&nbsp;<br />
from&nbsp;table1<br />
inner&nbsp;join&nbsp;&nbsp;(select&nbsp;table2.idkey,table2.ColValue<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;table2)&nbsp;t2&nbsp;<br />
on&nbsp;table1.idkey&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;t2.idkey</span></span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>在一个人的创业路程中，我们会有很多成就，如何对待这些成就，是值得注意的问题。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 我们得肯定它。因为肯定了自己，才会更加自信，才有信心有动力去迎接更大的挑战。但是同时，要提醒自己，这仅仅是个开始，还有很多事情要做，路还很</p>
<p>&nbsp;</p>
<p>长。避免自己陷入安逸的状况，自大自满是前进中最大的阻力。这其实是个小问题，也因此没人去注意它。一旦没有注意调整心态，有可能改变很多事情，要是知道</p>
<p>&nbsp;</p>
<p>创业路途遥远，我们需要尽量使自己少犯小错误，不犯大错误。心态很大程度上影响着人的决断。可能因为一时的意气风发，发起一个不充分的战斗；可能因为一时</p>
<p>&nbsp;</p>
<p>的沮丧，丧失一个绝好的商业机会。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 血色浪漫大家看了，也知道，&#8220;胸有激雷而面如平湖者，可拜上将军&#8221;。</p>
<p></font>&nbsp;</p>
<img src ="http://www.cnblogs.com/GodSpeed/aggbug/1261289.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41937/" target="_blank">[新闻]Google拟在9月发布自有浏览器 或采用火狐内核</a>]]></description></item><item><title>浅谈项目经理的项目管理</title><link>http://www.cnblogs.com/GodSpeed/archive/2008/07/22/1248787.html</link><dc:creator>GodSpeed</dc:creator><author>GodSpeed</author><pubDate>Tue, 22 Jul 2008 07:53:00 GMT</pubDate><guid>http://www.cnblogs.com/GodSpeed/archive/2008/07/22/1248787.html</guid><wfw:comment>http://www.cnblogs.com/GodSpeed/comments/1248787.html</wfw:comment><comments>http://www.cnblogs.com/GodSpeed/archive/2008/07/22/1248787.html#Feedback</comments><slash:comments>27</slash:comments><wfw:commentRss>http://www.cnblogs.com/GodSpeed/comments/commentRss/1248787.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/GodSpeed/services/trackbacks/1248787.html</trackback:ping><description><![CDATA[<p>作为一个即将转型的程序员，我也谈谈我对项目管理的一些看法，这些看法极有可能非常的不成熟，所以请大家尽管排砖，使劲儿拍，越使劲儿我越高兴。：）</p>
<p>&nbsp;</p>
<p>我认为一个合格的项目经理在项目管理过程中应该主要关注以下几方面的东西：</p>
<p>1，以验收项目为目的。所以，一切都应该是可验证的。把项目划分为若干个任务的同时，也应该已经为这些任务制定好了完成的标准，即做到什么程度为止。</p>
<p>&nbsp;&nbsp;&nbsp; 我们做项目，为的是什么？你要非说我为社会主义祖国信息化建设做出贡献我也不反对，但是我要说，如果最后不能验收，或者验收过程出现问题，那么项目就要面临失败了，项目经理就要面临走人了。<strong style="color: red">所以，制定项目计划时，划分任务和制定任务的完成标准一样重要，这些标准可以是一些测试用例，也可以是其它一些可度量的标准</strong>。我还想说，要尽量给客户灌输一种标准：&#8220;<span style="color: red">验收就是跑完客户已经签字的测试用例，系统出现的错误在可以接受的范围&#8221;。</span></p>
<p>&nbsp;</p>
<p><span style="color: #000000">2，<font style="color: #000000" color="#ff0000">全员参与。作为一个新手项目经理，不可避免的会出现一些判断失误或者理解错误。怎么才能最大程度减少项目的风险呢？我的想法是如果是项目组比较小，则可以全员参与项目需求的分析和计划的讨论；如果项目组较大，则可以采取分组和骨干讨论的办法。在得到项目组成员的建议以后，项目经理更容易全面的思考，掌控项目的每一个风险，再独力做出项目计划并提交领导供审核。在这个过程中，项目组成员得以参与，提高了团队的凝聚力和主人翁意识，提高了开发的积极性；同时也是一次学习，对项目组成员的提高又莫大的好处。但是，全员参与有些问题不得不注意，在讨论过程中，项目经理应尽量避免发表意见，只应多意见提得好的组员予以鼓励，避免陷入无谓的争吵。总之，我认为，<strong style="color: #ff6600">全员参与的项目管理有利于减小风险，提高项目成员的积极性和全局观，对项目成功有重大作用。</strong></font></span></p>
<p><span style="color: #000000"><strong><font color="#ff6600"></font></strong></span>&nbsp;</p>
<p><span style="color: #000000"><font style="color: #000000" color="#ff6600">3，沟通。沟通是个谈不完的话题，项目经理的绝大多数难题都可以通过沟通来解决，所以<span style="color: #ff6600"><strong>沟通是重中之重</strong></span>。和项目组沟通，确保计划的按期执行，了解项目组成员的困难（包括日常生活上的困惑，这也会影响到项目），协调和组织资源；和领导沟通，让他知道你在干什么，都干了什么，将要干什么。领导和客户一样非常重要，因为他发工资！~_~ 和客户沟通，尽可能的去勾引它说出真正的想法，使项目的开发运行在正确的轨道。总之，<strong>沟通比任何事情都重要。</strong></font></span></p>
<p>&nbsp;</p>
<p><span style="color: #000000">4，客户管理。我已经看到臭鸡蛋飞过来了，你个小小的项目经理，还是初级的，客户会归你管吗？确实是这样，客户怎么会归项目经理管呢。在我经历的一个外包项目中，那个客户甚至自己雇佣项目经理，来管理我们当时的开发团队进行工作。但是，我们不能放弃，明知山有虎，偏向虎山行。不屈不挠不怕斗争才是我们新世纪大好青年的本色。。。（省略5000字），那么，怎么斗争呢？我认为，只要仔细的想，办法还是有的。首先，要和客户明确需求，避免无意义的变更。从项目开始的那天起，凡是重要的与需求相关的<span style="color: #ff6600">文档，都要客户签字确认</span>。这样能避免客户拍大腿出需求，那样会累死我们，还不讨好。当客户需要签自己名字的时候，一般它就会仔细思考一下，这样就能省去很多不必要的反复。其次，<span style="color: #ff6600">要让客户的工作计划中有你的项目</span>。否则你发出的request不能及时得到回复，那么，项目延期是必然的。</span></p>
<p><span style="color: #000000">最后，<span style="color: #000000">要经常保持沟通，让客户了解你的进展。他非常的希望也非常的愿意知道你在干什么，干到什么程度了，将要怎么干，否则他付钱也不心甘情愿。当然，我们也不能什么都跟客户说阿，挑些客户容易理解的，重点关键的"点"，以及项目需求模糊的地方。这样能最大程度上给客户一种安全感，也能尽快明确需求，引导客户说出真正想要的东西。</span></span></p>
<p><span style="color: #000000"></span>&nbsp;</p>
<p><span style="color: #000000"><span style="color: #000000">5，项目成员的培养。作为一个新手项目来说，我们可能没有太多的东西去教给项目组成员，甚至有些成员在技术上要比我们厉害得多。但是，我们可以为项目组成员提供一个成长和学习的机会，同时也是我们自己的学习机会。利用一切会议，讨论甚至吃饭，让项目组成员参与到项目中来，让他们了解整个项目，培养一种学习的氛围。我始终认为，<span style="color: #ff6600">相对于技术能力来说，一个程序员对项目的理解更为重要一些，理解的越好，对项目的贡献就越大</span>。而<span style="color: #ff6600"><strong>学习是一个个人或者一个组织优秀或者将要走向优秀的基本特征。</strong></span>在项目组成员能力提高的同时，我相信项目的成功就在眼前。</span></span></p>
<p><span style="color: #000000"></span>&nbsp;</p>
<p><span style="color: #000000"><span style="color: #000000">最后，我想说的是，<span style="color: #0000ff"><strong style="font-size: 18pt">做正确的事情永远都比正确的做事情重要。<span style="font-size: 10pt">这是我的座右铭。</span></strong></span></span></span><span style="color: #000000"><span style="color: #000000">预祝所有的新手项目经理都能达到公司要求，满足客户期望，带领项目组成员共同前进。</span></span></p>
<img src ="http://www.cnblogs.com/GodSpeed/aggbug/1248787.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41936/" target="_blank">[新闻]微软正在构思将Wi-Fi带入汽车</a>]]></description></item><item><title>常用JS方法</title><link>http://www.cnblogs.com/GodSpeed/archive/2008/05/21/1203937.html</link><dc:creator>GodSpeed</dc:creator><author>GodSpeed</author><pubDate>Wed, 21 May 2008 04:24:00 GMT</pubDate><guid>http://www.cnblogs.com/GodSpeed/archive/2008/05/21/1203937.html</guid><wfw:comment>http://www.cnblogs.com/GodSpeed/comments/1203937.html</wfw:comment><comments>http://www.cnblogs.com/GodSpeed/archive/2008/05/21/1203937.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/GodSpeed/comments/commentRss/1203937.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/GodSpeed/services/trackbacks/1203937.html</trackback:ping><description><![CDATA[有些js方法，我们经常用，却也经常忘记，所以我就写下来<br />
<br />
1，关闭子窗口，给父窗口返回一个值 window.returnValue = "";<br />
2，在子窗口中得到父窗口传过来的参数<font face="Verdana">&nbsp; var result = window.dialogArguments;<br />
</font>3，弹出一个模态窗口 <font face="Verdana">window.showModalDialog(url,agruments,sFeatures),非模态用showModelessDialog，参数相同。url为要转到的页面，agruments是参数（随便什么都行），sFeatures是窗口大小一类的东西，具体有：<br />
（1）dialogHeight:&nbsp;&nbsp;&nbsp;对话框高度，不小于100px<br />
（2）&nbsp;dialogWidth:&nbsp;&nbsp;&nbsp;对话框宽度。<br />
（3）&nbsp;dialogLeft:&nbsp;&nbsp;&nbsp;&nbsp;离屏幕左的距离。<br />
（4）dialogTop:&nbsp;&nbsp;&nbsp;&nbsp;离屏幕上的距离。<br />
（5）center:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;yes&nbsp;|&nbsp;no&nbsp;|&nbsp;1&nbsp;|&nbsp;0&nbsp;}&nbsp;：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否居中，默认yes，但仍可以指定高度和宽度。<br />
（6）help:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{yes&nbsp;|&nbsp;no&nbsp;|&nbsp;1&nbsp;|&nbsp;0&nbsp;}：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否显示帮助按钮，默认yes。<br />
（7）resizable:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{yes&nbsp;|&nbsp;no&nbsp;|&nbsp;1&nbsp;|&nbsp;0&nbsp;}&nbsp;[IE5+]：&nbsp;&nbsp;&nbsp;&nbsp;是否可被改变大小。默认no。<br />
（8）status:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{yes&nbsp;|&nbsp;no&nbsp;|&nbsp;1&nbsp;|&nbsp;0&nbsp;}&nbsp;[IE5+]：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否显示状态栏。默认为yes[&nbsp;Modeless]或no[Modal]。<br />
（9）scroll:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;yes&nbsp;|&nbsp;no&nbsp;|&nbsp;1&nbsp;|&nbsp;0&nbsp;|&nbsp;on&nbsp;|&nbsp;off&nbsp;}：是否显示滚动条。默认为yes。</font><br />
4，onload在后台的Page_Load执行后才开始执行<br />
5，str.substring(start,end),截取字符串，如果只有start，则直接截取到结尾。<br />
6，str.indexOf("a"),判断a在字符串中最先出现的位置，如果没有则为-1。这个方法大多被用来判断字符串中是否包含该子串。<br />
7，location.href：js中的转向其它页面的属性。 <br />
8，除法取整&nbsp; var a<font face="Verdana">= 9/2|0;</font>
<img src ="http://www.cnblogs.com/GodSpeed/aggbug/1203937.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41935/" target="_blank">[新闻]对比测试：IE8 Beta 2 VS Firefox 3.0.1</a>]]></description></item><item><title>Asp.net AJAX 返回从服务器端返回DataTable</title><link>http://www.cnblogs.com/GodSpeed/archive/2008/05/14/1197093.html</link><dc:creator>GodSpeed</dc:creator><author>GodSpeed</author><pubDate>Wed, 14 May 2008 10:10:00 GMT</pubDate><guid>http://www.cnblogs.com/GodSpeed/archive/2008/05/14/1197093.html</guid><wfw:comment>http://www.cnblogs.com/GodSpeed/comments/1197093.html</wfw:comment><comments>http://www.cnblogs.com/GodSpeed/archive/2008/05/14/1197093.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/GodSpeed/comments/commentRss/1197093.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/GodSpeed/services/trackbacks/1197093.html</trackback:ping><description><![CDATA[摘要:  在CTP版中,只要在web config中配置如下即可: &lt;jsonSerializationmaxJsonLength="500"&gt; &lt;converters&gt; &lt;addname="DataSetConverter"type="Microsoft.Web.Preview.Script.Serialization.Converters.DataSetConverter&nbsp;&nbsp;<a href='http://www.cnblogs.com/GodSpeed/archive/2008/05/14/1197093.html'>阅读全文</a><img src ="http://www.cnblogs.com/GodSpeed/aggbug/1197093.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41934/" target="_blank">[新闻]iPhone存在严重密码安全漏洞</a>]]></description></item><item><title>Reporting Service 钻取</title><link>http://www.cnblogs.com/GodSpeed/archive/2008/05/14/1196455.html</link><dc:creator>GodSpeed</dc:creator><author>GodSpeed</author><pubDate>Wed, 14 May 2008 03:28:00 GMT</pubDate><guid>http://www.cnblogs.com/GodSpeed/archive/2008/05/14/1196455.html</guid><wfw:comment>http://www.cnblogs.com/GodSpeed/comments/1196455.html</wfw:comment><comments>http://www.cnblogs.com/GodSpeed/archive/2008/05/14/1196455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/GodSpeed/comments/commentRss/1196455.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/GodSpeed/services/trackbacks/1196455.html</trackback:ping><description><![CDATA[<p>今天研究了 Reporting Service的钻取功能.我觉得分为两种,一是链接到另外一张报表,一种是直接在本报表中显示子项目.</p>
<p>&nbsp;</p>
<p>第一种主要靠设置单元格的Navigation属性里的HaperLInk action,太简单我就不详细说了。</p>
<p>第二种主要靠设置组的Visibility属性,Init Visibility为hidden,by another item选为依赖项,就OK了。</p>
<p>忘了说了还有种就是把子报表直接加到父报表中.也挺简单的，大家研究一下就OK了。</p>
<img src ="http://www.cnblogs.com/GodSpeed/aggbug/1196455.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41934/" target="_blank">[新闻]iPhone存在严重密码安全漏洞</a>]]></description></item><item><title>用C#.net发送邮件</title><link>http://www.cnblogs.com/GodSpeed/archive/2008/05/13/1195514.html</link><dc:creator>GodSpeed</dc:creator><author>GodSpeed</author><pubDate>Tue, 13 May 2008 09:33:00 GMT</pubDate><guid>http://www.cnblogs.com/GodSpeed/archive/2008/05/13/1195514.html</guid><wfw:comment>http://www.cnblogs.com/GodSpeed/comments/1195514.html</wfw:comment><comments>http://www.cnblogs.com/GodSpeed/archive/2008/05/13/1195514.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/GodSpeed/comments/commentRss/1195514.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/GodSpeed/services/trackbacks/1195514.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_0_54_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_0_54_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_0_54_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_0_54_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_0_54_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_0_54_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_0_54_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_0_54_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span id="Codehighlighter1_0_54_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_0_54_Open_Text"><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;发送邮件<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span></span><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">internal</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Send()<br />
<img id="Codehighlighter1_91_914_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_91_914_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_91_914_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_91_914_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_91_914_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_91_914_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_91_914_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_91_914_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_91_914_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_91_914_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Web.Mail.MailMessage&nbsp;mailmessage&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MailMessage();<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailmessage.From&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">fmzzs@126.com</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailmessage.To&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">张大伟</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailmessage.Subject&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">我是主题</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailmessage.Body&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">我是内容</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailmessage.Cc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">张明</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailmessage.Fields.Add(</span><span style="color: #800000">"</span><span style="color: #800000">http://schemas.microsoft.com/cdo/configuration/smtpauthenticate</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">1</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailmessage.Fields.Add<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #800000">"</span><span style="color: #800000">http://schemas.microsoft.com/cdo/configuration/sendusername</span><span style="color: #800000">"</span><span style="color: #000000">,myEmailUserName);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">自己邮箱的用户名&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailmessage.Fields.Add(</span><span style="color: #800000">"</span><span style="color: #800000">http://schemas.microsoft.com/cdo/configuration/sendpassword</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;myEmailPassword);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">自己邮箱的密码&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Web.Mail.SmtpMail.SmtpServer&nbsp;</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">smtp.126.com</span><span style="color: #800000">"</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">SMTP&nbsp;Server</span><span style="color: #008000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Web.Mail.SmtpMail.Send(mailmessage);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p><br />
这个方法发送邮件有点儿老了，dotnet 2.0 的System.Net空间下有新的发送方式，因为着急,所以没看.这个就当是学习笔记了，下次再研究新的。</p>
<img src ="http://www.cnblogs.com/GodSpeed/aggbug/1195514.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41931/" target="_blank">[新闻]GC2008：星际争霸2进程报告 微调进程延续</a>]]></description></item></channel></rss>