﻿<?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>博客园-程序人生</title><link>http://www.cnblogs.com/wxj1020/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 07 Sep 2008 18:27:30 GMT</lastBuildDate><pubDate>Sun, 07 Sep 2008 18:27:30 GMT</pubDate><ttl>60</ttl><item><title>打造属于自己的代码管理器之需求分析篇</title><link>http://www.cnblogs.com/wxj1020/archive/2008/06/01/1211699.html</link><dc:creator>鹰击长空</dc:creator><author>鹰击长空</author><pubDate>Sun, 01 Jun 2008 13:02:00 GMT</pubDate><guid>http://www.cnblogs.com/wxj1020/archive/2008/06/01/1211699.html</guid><wfw:comment>http://www.cnblogs.com/wxj1020/comments/1211699.html</wfw:comment><comments>http://www.cnblogs.com/wxj1020/archive/2008/06/01/1211699.html#Feedback</comments><slash:comments>25</slash:comments><wfw:commentRss>http://www.cnblogs.com/wxj1020/comments/commentRss/1211699.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/wxj1020/services/trackbacks/1211699.html</trackback:ping><description><![CDATA[<p>首先申明：我说的代码管理器不是版本管理器，也不是普通的资料管理器。</p>
<p><strong>背景：</strong></p>
<p>因为工作和学习的需要，我从网上下载了很多代码，但是代码越多，管理这些代码就越麻烦。问题主要有以下几点：</p>
<p>1、工作中急需的一些代码我以前写过或是我几个月前曾经下载过，但是一时就是找不到。</p>
<p>2、从网上下载需要的代码相当费时间，而且很难找到合适的。特别是做winform界面时，那些具有特定效果的控件的代码相当难找。</p>
<p>3、重装系统后，有些代码会被当作垃圾处理掉。</p>
<p>为了解决这些问题，也为了更好的学习，我想趁空闲时间编一个属于自己的代码管理器。我把自己的代码管理器的特点归纳为：<strong>快速精确的查找和快速的复制粘贴</strong>。下面是我和几位同行聊天后确定的一些需求，希望大家多多补充。</p>
<p><strong>需求：</strong></p>
<p><strong>1、类别管理（对代码进行分类）</strong></p>
<p>1）、类别可以增加、删除、重命名
<p>2）、类别与文件是多对多关系
<p>3）、 类别前有图标，显示类别属性，图标可以更改
<p>4）、支持文件夹的导入
<p><strong>2、 文件（存放代码的文件）管理</strong>
<p>1）、 有标题、文件大小、修改时间、重要程度等属性
<p>2）、标题前有图标，显示文件类型，图标可以更改
<p>3）、文件可以增加、删除，属性可以编辑
<p>4）、支持ClipBoard模式粘贴
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClipBoard模式：对指定的文件夹定义快捷键。按下快捷键，弹出上下文菜单，进行文件选择性粘贴。
<p>5）、 重要程度用图标显示
<p>6）、有导入导出功能
<p>7）、可以按时间、重要程度、喜好程度对文件进行归类
<p><strong>3、 代码管理</strong>
<p>1）、有代码、例子、评注部分
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 评注部分可以写一些代码的相关信息。
<p>2）、代码和例子部分支持关键字高亮显示，评注部分允许存放图片
<p>3）、 代码的复制、粘贴功能佷重要，必须提供快捷键
<p>4）、支持AutoText模式的复制粘贴
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AutoText模式：先对一些代码段定义几个字母，然后通过快捷键开启该模式，在文本编辑器（普通的记事本或vs2005等）输入预先定义的几个字母，实现代码段的快速粘贴。
<p>5）、代码需要有提示功能，在不打开代码时就能知道它的用途
<p>6）、有些代码最好可以看到执行效果（这个可能比较难实现）
<p><strong>4、 查找功能</strong>
<p>1）、可以对文件和代码内容进行查找
<p>2）、支持正则表达式查找
<p>3）、 可以在系统中嵌入浏览器进行上网查找
<p>4）、支持Auto Text模式进行上网查找
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Auto Text模式：先对一些URL定义几个字母，然后通过快捷键开启该模式，在文本编辑器中输入预先定义的几个字母，实现快速上网。
<p>5）、支持语言、方法、类、项目等分类进行上网查找，最好有自己的代码搜索引擎。
<p><strong>5、方便的复制粘贴功能</strong>
<p>1）、支持AutoText模式的快速粘贴
<p>2）、 支持ClipBoard模式粘贴
<p><strong>6、 导入导出</strong>
<p>1）、支持多个文件同时导入
<p>2）、 支持单个文件导出
<p>3）、导入代码时，支持项目和代码的关联
<p>4）、 支持导出时格式转换
<p><strong>7、 其他</strong>
<p>1）、支持多种语言的高亮显示
<p>2）、 支持语言的转换功能
<p>3）、对快捷键进行管理，可以自定义快捷键
<p>4）、不能用不提供源代码的第三方控件，该软件本身就应该是一个良好的代码库。
<p>5）、采用CS结构。
<p>最后，欢迎大家提出各种需求或好的建议，过几天我还会编一个简单的界面，方便大家提出更明确的需求。但是那些谈及这类软件已有，不用再编的言论将不予理睬。</p>
 <img src ="http://www.cnblogs.com/wxj1020/aggbug/1211699.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42134/" target="_blank">[新闻]JavaScript将成Silverlight的最大对手?</a>]]></description></item><item><title>《Head.First设计模式》的学习笔记（9）－－外观模式</title><link>http://www.cnblogs.com/wxj1020/archive/2008/05/16/1200714.html</link><dc:creator>鹰击长空</dc:creator><author>鹰击长空</author><pubDate>Fri, 16 May 2008 07:18:00 GMT</pubDate><guid>http://www.cnblogs.com/wxj1020/archive/2008/05/16/1200714.html</guid><wfw:comment>http://www.cnblogs.com/wxj1020/comments/1200714.html</wfw:comment><comments>http://www.cnblogs.com/wxj1020/archive/2008/05/16/1200714.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/wxj1020/comments/commentRss/1200714.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/wxj1020/services/trackbacks/1200714.html</trackback:ping><description><![CDATA[<p><strong>意图：</strong>为子系统中的一组接口提供一个一致的界面，Facade 模式定义了一个高层接口，这个接口使得这一子系统更加容易使用。</p> <p><strong>结构：</strong></p> <p><a href="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First9_D726/image_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="161" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First9_D726/image_thumb.png" width="409" border="0"></a> </p> <p><strong>例子：</strong></p> <p>假设你有一套杀手级的家庭影院系统，内含DVD播放器、投影仪、自动屏幕、环绕立体声等。那么当你想看一部DVD时，需要做哪些事情呢（用最土的方式）？</p> <p>1、将灯光调暗；</p> <p>2、放下屏幕；</p> <p>3、打开投影仪；</p> <p>4、将投影仪的输入切换到DVD；</p> <p>5、将投影仪设置成宽屏模式；</p> <p>6、打开功放；</p> <p>7、将功放的输入设置为DVD；</p> <p>8、将功放设置为环绕立体声；</p> <p>9、将功放音量调到中；</p> <p>10、打开DVD播放器；</p> <p>11、开始播放DVD。</p> <p>我想如果每次看DVD时都要进行这样一番折腾，那我宁愿不看了。上面的操作暴露了哪些<strong>问题</strong>呢？</p> <p>1、操作麻烦。具体体现在打开DVD、关闭DVD、改听CD或者广播。</p> <p>2、升级麻烦（就是耦合度太大）。如果我要升级系统，那么我还必须重新学习另一套操作流程。</p> <p>那么这些<strong>问题如何解决</strong>呢？</p> <p>使用外观模式，新建一个门户类（或管理类），暴露出一些方法，在这些方法里对这些子系统进行调用（这里的子系统具体指灯光、屏幕、投影仪、功放、DVD等）。具体代码很简单，略。</p> <p>外观模式的<strong>优点</strong>：</p> <p>1、对接口进行了简化，方便客户使用。</p> <p>2、可以实现客户与子系统解耦，易于维护。</p> <p><strong>缺点：</strong></p> <p>1、多了一个包装类，可能导致复杂度和开发时间的增加，并降低运行时的性能。</p> <p><strong>值得注意的地方：</strong></p> <p>1、外观模式对接口进行了简化，但这并不意味着对子系统进行彻底封装。如果有必要，这些子系统的接口还可以继续暴露给客户，这就是所谓的高级功能（或称为自定义）。</p> <p>2、外观模式不能新增功能，但他可以将某些功能按次序执行。例如先打开DVD，后播放DVD。</p> <p>3、子系统与外观不是一对一关系，是多对多关系。一个子系统可以拥有多个外观，一个外观可以调用多个子系统。</p> <p>4、外观模式与适配器模式的区别不是包装的类的多少，而是意图不一样。适配器模式也可以包装很多类，但他的意图是改变接口，符合客户的期望；外观模式是将接口进行简化，方便使用。</p>  <img src ="http://www.cnblogs.com/wxj1020/aggbug/1200714.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42133/" target="_blank">[新闻]没有谷歌就活不下去的四个网站</a>]]></description></item><item><title>《Head.First设计模式》的学习笔记（8）－－适配器模式</title><link>http://www.cnblogs.com/wxj1020/archive/2008/05/07/1187449.html</link><dc:creator>鹰击长空</dc:creator><author>鹰击长空</author><pubDate>Wed, 07 May 2008 14:17:00 GMT</pubDate><guid>http://www.cnblogs.com/wxj1020/archive/2008/05/07/1187449.html</guid><wfw:comment>http://www.cnblogs.com/wxj1020/comments/1187449.html</wfw:comment><comments>http://www.cnblogs.com/wxj1020/archive/2008/05/07/1187449.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/wxj1020/comments/commentRss/1187449.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/wxj1020/services/trackbacks/1187449.html</trackback:ping><description><![CDATA[摘要: 软件开发中经常遇到的问题：假设已有一个软件系统，你希望它能和一个新的厂商类库搭配使用，但是这个新厂商所设计出来的接口，不同于旧厂商的接口。如果你不想改变现有的代码，也不能改变厂商的代码，那么你该如何解决这个问题。&nbsp;&nbsp;<a href='http://www.cnblogs.com/wxj1020/archive/2008/05/07/1187449.html'>阅读全文</a><img src ="http://www.cnblogs.com/wxj1020/aggbug/1187449.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42132/" target="_blank">[新闻]Google 10周岁生日</a>]]></description></item><item><title>《Head.First设计模式》的学习笔记（7）－－命令模式</title><link>http://www.cnblogs.com/wxj1020/archive/2008/05/04/1182397.html</link><dc:creator>鹰击长空</dc:creator><author>鹰击长空</author><pubDate>Sun, 04 May 2008 15:21:00 GMT</pubDate><guid>http://www.cnblogs.com/wxj1020/archive/2008/05/04/1182397.html</guid><wfw:comment>http://www.cnblogs.com/wxj1020/comments/1182397.html</wfw:comment><comments>http://www.cnblogs.com/wxj1020/archive/2008/05/04/1182397.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cnblogs.com/wxj1020/comments/commentRss/1182397.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/wxj1020/services/trackbacks/1182397.html</trackback:ping><description><![CDATA[<p><strong>背景：</strong>有时候我们需要对方法进行封装，通过对这些封装的方法进行调用，我们可以很好的处理一些事情。比如，记录日志，或者重复使用这些封装实现撤销功能。</p>
<p><strong>意图：</strong>将一个请求封装为一个对象，从而使你可用不同的请求对客户进行参数化；对请求排队或记录请求日志，以及支持可撤消的操作。</p>
<p><strong>结构：</strong></p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First7_136AC/image_2.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="199" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First7_136AC/image_thumb.png" width="576" border="0" /></a> </p>
<p><strong>例子：</strong>这次我们将设计一个家电自动化遥控器的ＡＰＩ</p>
<p><strong>需求分析：</strong></p>
<p>遥控器的图：<a href="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First7_136AC/image_4.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First7_136AC/image_thumb_1.png" width="207" border="0" /></a> </p>
<p>１）、遥控器上具有七个可编程的插槽、七个开关按钮和一个整体撤销按钮。</p>
<p>２）、通过创建一组ＡＰＩ，使插槽可以控制一个或一组家电装置，这些装置指电灯、电风扇、热水器等。</p>
<p>３）、插槽还可以控制未来可能出现的家电装置。</p>
<p>４）、整体撤销按钮具有撤销上一个命令的功能。</p>
<p><strong>初步思考：</strong></p>
<p>１）、我们将设计一系列类，这些类都具有ＯＮ（）和Ｏｆｆ（）方法。</p>
<p>２）、当遥控器上的ｏｎ或ｏｆｆ开关被按下时，某些类的ｏｎ或ｏｆｆ方法被调用，进而控制家电装置，但这些被调用的类是可以被改变的（因为插槽上的东西可以改变）。</p>
<p>３）、当ｏｎ或ｏｆｆ开关被按下时，如果我们通过ｉｆ－－ｅｌｓｅ语句加以选择判断，那么第三点需求我们将难以满足。</p>
<p>４）撤销功能如何实现，上一个按钮是什么？针对的是哪一个装置？</p>
<p><strong>进一步思考：</strong></p>
<p>这次设计中不变的是遥控器（或者说是遥控器的按钮），变化的是家电装置，例如第一排开关可以控制电灯，也可以控制电风扇，或者未来可能出现的家电。所以我们需要对遥控器和家电装置进行解耦。此时我们想到了命令模式：遥控器（或者说遥控器上的按钮）就是命令的请求者，家电装置就是命令的执行者，我们所要做的就是将命令的请求者和命令的执行者解耦。</p>
<p><strong>具体的过程：</strong></p>
<p>１）、客户创建命令。</p>
<p>２）、客户将命令的执行者封装进命令对象里。</p>
<p>３）、命令的请求者调用命令。</p>
<p>４）、命令的执行者执行命令。</p>
<p>下面我们实现只有一组开关按钮的遥控器，类图如下：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First7_136AC/image_6.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="240" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First7_136AC/image_thumb_2.png" width="475" border="0" /></a> </p>
<p><strong>代码如下：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;RemoteLodder<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_23_407_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_23_407_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_23_407_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_23_407_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_23_407_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_23_407_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_23_407_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_23_407_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_23_407_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_23_407_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;3</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;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Main(</span><span style="color: #0000ff">string</span><span style="color: #000000">[]&nbsp;args)<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img id="Codehighlighter1_73_401_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_73_401_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_73_401_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_73_401_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_73_401_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_73_401_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_73_401_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_73_401_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_73_401_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_73_401_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;5</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;SimpleRemoteControl&nbsp;remoteControl&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleRemoteControl();<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;Light&nbsp;light&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Light();<br />
</span><span style="color: #008080">&nbsp;7</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;LightOnCommand&nbsp;lightOnCommand&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;LightOnCommand(light);<br />
</span><span style="color: #008080">&nbsp;8</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;remoteControl.SetCommand(lightOnCommand);<br />
</span><span style="color: #008080">&nbsp;9</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;remoteControl.ButtonWasPressed();<br />
</span><span style="color: #008080">10</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;Console.ReadLine();<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Light<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img id="Codehighlighter1_432_624_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_432_624_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_432_624_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_432_624_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_432_624_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_432_624_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_432_624_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_432_624_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_432_624_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_432_624_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">15</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;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;On()<br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img id="Codehighlighter1_467_524_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_467_524_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_467_524_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_467_524_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_467_524_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_467_524_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_467_524_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_467_524_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_467_524_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_467_524_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">17</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;Console.WriteLine(</span><span style="color: #800000">"</span><span style="color: #800000">Light&nbsp;is&nbsp;on</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">20</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;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Off()<br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img id="Codehighlighter1_560_618_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_560_618_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_560_618_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_560_618_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_560_618_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_560_618_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_560_618_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_560_618_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_560_618_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_560_618_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">22</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;Console.WriteLine(</span><span style="color: #800000">"</span><span style="color: #800000">Light&nbsp;is&nbsp;off</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;LightOnCommand&nbsp;:&nbsp;Command<br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img id="Codehighlighter1_667_876_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_667_876_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_667_876_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_667_876_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_667_876_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_667_876_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_667_876_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_667_876_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_667_876_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_667_876_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">27</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;Light&nbsp;light;<br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">29</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;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;LightOnCommand(Light&nbsp;paramLight)<br />
</span><span style="color: #008080">30</span><span style="color: #000000"><img id="Codehighlighter1_747_795_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_747_795_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_747_795_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_747_795_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_747_795_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_747_795_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_747_795_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_747_795_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_747_795_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_747_795_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">31</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;</span><span style="color: #0000ff">this</span><span style="color: #000000">.light&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;paramLight;<br />
</span><span style="color: #008080">32</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">33</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">34</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;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Execute()<br />
</span><span style="color: #008080">35</span><span style="color: #000000"><img id="Codehighlighter1_835_870_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_835_870_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_835_870_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_835_870_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_835_870_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_835_870_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_835_870_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_835_870_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_835_870_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_835_870_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">36</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;light.On();<br />
</span><span style="color: #008080">37</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">38</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">39</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Command<br />
</span><span style="color: #008080">40</span><span style="color: #000000"><img id="Codehighlighter1_906_938_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_906_938_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_906_938_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_906_938_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_906_938_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_906_938_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_906_938_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_906_938_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_906_938_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_906_938_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">41</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;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Execute();<br />
</span><span style="color: #008080">42</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">43</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SimpleRemoteControl<br />
</span><span style="color: #008080">44</span><span style="color: #000000"><img id="Codehighlighter1_976_1205_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_976_1205_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_976_1205_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_976_1205_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_976_1205_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_976_1205_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_976_1205_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_976_1205_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_976_1205_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_976_1205_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">45</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;Command&nbsp;slot;<br />
</span><span style="color: #008080">46</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">47</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;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;SetCommand(Command&nbsp;paramCommand)<br />
</span><span style="color: #008080">48</span><span style="color: #000000"><img id="Codehighlighter1_1062_1111_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1062_1111_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1062_1111_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1062_1111_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1062_1111_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1062_1111_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1062_1111_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1062_1111_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1062_1111_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_1062_1111_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">49</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;</span><span style="color: #0000ff">this</span><span style="color: #000000">.slot&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;paramCommand;<br />
</span><span style="color: #008080">50</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">51</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">52</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;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ButtonWasPressed()<br />
</span><span style="color: #008080">53</span><span style="color: #000000"><img id="Codehighlighter1_1160_1199_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1160_1199_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1160_1199_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1160_1199_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1160_1199_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1160_1199_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1160_1199_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1160_1199_Open_Text').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1160_1199_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_1160_1199_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">54</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;slot.Execute();<br />
</span><span style="color: #008080">55</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">56</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p><br />
</strong></p>
<p><strong>注释：</strong>命令的请求者：<font face="Verdana">SimpleRemoteControl</font><br />
　　　命令的执行者：<font face="Verdana">Light</font><br />
　　　命令接口：<font face="Verdana">Command</font><br />
　　　具体的命令：<font face="Verdana">LightOnCommand</font>　　<br />
　　　客户（封装命令的）：<font face="Verdana">RemoteLodde</font>　　<br />
我们的遥控器共有七个插槽，可以用数组来实现，这里不写了。撤销按钮的功能可以通过栈来实现（对Command进行入栈，出栈即可）。<br />
<strong>补充：</strong><br />
<strong>１）NoCommand模式</strong><br />
代码：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;NoCommand&nbsp;:&nbsp;Command<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img id="Codehighlighter1_37_94_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_37_94_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_37_94_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_37_94_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_37_94_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_37_94_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_37_94_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_37_94_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_37_94_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 alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_37_94_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Execute()<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img id="Codehighlighter1_77_88_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_77_88_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_77_88_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_77_88_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_77_88_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_77_88_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_77_88_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_77_88_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_77_88_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 alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_77_88_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
用途：当你不想返回一个有意义的对象时，就可以用空对象。客户也可以将处理null的责任转移给空对象。举例来说，遥控器出厂时可以用NoCommand对象对他进行初始化。<br />
<strong>２）、宏命令</strong><br />
代码：
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MacroCommand:Command<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_38_352_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_38_352_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_38_352_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_38_352_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_38_352_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_38_352_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_38_352_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_38_352_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_38_352_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 alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_38_352_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Command</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;commands;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;MacroCommand(List</span><span style="color: #000000">&lt;</span><span style="color: #000000">Command</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;commands)<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img id="Codehighlighter1_133_182_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_133_182_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_133_182_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_133_182_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_133_182_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_133_182_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_133_182_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_133_182_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_133_182_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 alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_133_182_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.commands&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;commands;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Execute()<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img id="Codehighlighter1_222_346_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_222_346_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_222_346_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_222_346_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_222_346_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_222_346_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_222_346_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_222_346_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_222_346_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 alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_222_346_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">foreach</span><span style="color: #000000">&nbsp;(Command&nbsp;command&nbsp;</span><span style="color: #0000ff">in</span><span style="color: #000000">&nbsp;commands)<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img id="Codehighlighter1_286_336_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_286_336_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_286_336_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_286_336_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_286_336_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_286_336_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_286_336_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_286_336_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_286_336_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 alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_286_336_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;command.Execute();<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
用途：可以请求一次，执行多个命令。例如，按下一个按钮，实现打开电灯、电风扇、电视等功能。<br />
<strong>应用：</strong><br />
<strong>１）、队列请求</strong><br />
想象有一个工作队列；你在某一端添加命令，然后另一端则是线程。线程进行下面的动作：从队列中取出一个命令，调用他的execute()方法，等待这个命令完成，然后将此命令丢弃，再取出下一个命令．．．此时，工作队列类和进行计算的对象之间完全解耦。当时线程可能进行财务运算，下一刻可能读取网络数据。<br />
<strong>２）、日志请求</strong><br />
这需要我们将所有的动作（命令）记录在日志中，并能在系统死机后，对这些命令对象重新加载，成批的依次调用这些对象的execute（）方法，恢复到之前的状态。比方说，对于电子表格的应用，我们可能想要实现的错误恢复方式是将电子表格的操作记录在日志中，而不是每次电子表格一有变化就记录整个电子表格。 
<img src ="http://www.cnblogs.com/wxj1020/aggbug/1182397.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42131/" target="_blank">[新闻]祝Google 10周岁生日快乐</a>]]></description></item><item><title>从Excel中导数据到DataGridView</title><link>http://www.cnblogs.com/wxj1020/archive/2008/04/28/1174072.html</link><dc:creator>鹰击长空</dc:creator><author>鹰击长空</author><pubDate>Mon, 28 Apr 2008 02:12:00 GMT</pubDate><guid>http://www.cnblogs.com/wxj1020/archive/2008/04/28/1174072.html</guid><wfw:comment>http://www.cnblogs.com/wxj1020/comments/1174072.html</wfw:comment><comments>http://www.cnblogs.com/wxj1020/archive/2008/04/28/1174072.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/wxj1020/comments/commentRss/1174072.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/wxj1020/services/trackbacks/1174072.html</trackback:ping><description><![CDATA[摘要: 最近项目中需要从Excel中导数据到DataGridView中，所以写了一个通用类,代码如下：1publicclassExcelToDatableHelper2{3privatestaticExcelToDatableHelperinstance=null;4privatestaticObjectlocker=newObject();56publicstaticExcelToDatableHelp&nbsp;&nbsp;<a href='http://www.cnblogs.com/wxj1020/archive/2008/04/28/1174072.html'>阅读全文</a><img src ="http://www.cnblogs.com/wxj1020/aggbug/1174072.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42130/" target="_blank">[新闻]Google十年市值达1500亿美元 创造奇迹</a>]]></description></item><item><title>SQL语句优化技术分析</title><link>http://www.cnblogs.com/wxj1020/archive/2008/04/27/1173638.html</link><dc:creator>鹰击长空</dc:creator><author>鹰击长空</author><pubDate>Sun, 27 Apr 2008 14:24:00 GMT</pubDate><guid>http://www.cnblogs.com/wxj1020/archive/2008/04/27/1173638.html</guid><wfw:comment>http://www.cnblogs.com/wxj1020/comments/1173638.html</wfw:comment><comments>http://www.cnblogs.com/wxj1020/archive/2008/04/27/1173638.html#Feedback</comments><slash:comments>28</slash:comments><wfw:commentRss>http://www.cnblogs.com/wxj1020/comments/commentRss/1173638.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/wxj1020/services/trackbacks/1173638.html</trackback:ping><description><![CDATA[<p>最近几周一直在进行数据库培训，老师精湛的技术和生动的讲解使我受益匪浅。为了让更多的新手受益，我抽空把SQL语句优化部分进行了整理，希望大家一起进步。</p> <p><strong>一、操作符优化</strong></p> <p><strong>1、IN 操作符</strong> <p>用IN写出来的SQL的优点是比较容易写及清晰易懂，这比较适合现代软件开发的风格。但是用IN的SQL性能总是比较低的，从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别：</p> <p>ORACLE试图将其转换成多个表的连接，如果转换不成功则先执行IN里面的子查询，再查询外层的表记录，如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功，但对于含有分组统计等方面的SQL就不能转换了。</p> <p><strong>推荐方案：</strong>在业务密集的SQL当中尽量不采用IN操作符，用EXISTS 方案代替。</p> <p><strong>2、NOT IN操作符</strong> <p>此操作是强列不推荐使用的，因为它不能应用表的索引。 <p><strong>推荐方案：</strong>用NOT EXISTS 方案代替 <p><strong>3、IS NULL 或IS NOT NULL操作</strong>（判断字段是否为空） <p>判断字段是否为空一般是不会应用索引的，因为索引是不索引空值的。<br> <p><strong>推荐方案</strong>：用其它相同功能的操作运算代替，如：a is not null 改为 a&gt;0 或a&gt;&#8217;&#8217;等。不允许字段为空，而用一个缺省值代替空值，如申请中状态字段不允许为空，缺省为申请。 <p><strong>4、&gt; 及 &lt; 操作符（大于或小于操作符）</strong> <p>大于或小于操作符一般情况下是不用调整的，因为它有索引就会采用索引查找，但有的情况下可以对它进行优化，如一个表有100万记录，一个数值型字段A，30万记录的A=0，30万记录的A=1，39万记录的A=2，1万记录的A=3。那么执行A&gt;2与A&gt;=3的效果就有很大的区别了，因为A&gt;2时ORACLE会先找出为2的记录索引再进行比较，而A&gt;=3时ORACLE则直接找到=3的记录索引。  <p><strong>5、LIKE操作符</strong> <p>LIKE操作符可以应用通配符查询，里面的通配符组合可能达到几乎是任意的查询，但是如果用得不好则会产生性能上的问题，如LIKE &#8216;%5400%&#8217; 这种查询不会引用索引，而LIKE &#8216;X5400%&#8217;则会引用范围索引。 <p>一个实际例子：用YW_YHJBQK表中营业编号后面的户标识号可来查询营业编号 YY_BH LIKE &#8216;%5400%&#8217; 这个条件会产生全表扫描，如果改成YY_BH LIKE &#8217;X5400%&#8217; OR YY_BH LIKE &#8217;B5400%&#8217; 则会利用YY_BH的索引进行两个范围的查询，性能肯定大大提高。 <p><strong>6、UNION操作符</strong> <p>UNION在进行表链接后会筛选掉重复的记录，所以在表链接后会对所产生的结果集进行排序运算，删除重复的记录再返回结果。实际大部分应用中是不会产生重复的记录，最常见的是过程表与历史表UNION。如：<br>select * from gc_dfys<br>union<br>select * from ls_jg_dfys<br>这个SQL在运行时先取出两个表的结果，再用排序空间进行排序删除重复的记录，最后返回结果集，如果表数据量大的话可能会导致用磁盘进行排序。 <p><strong>推荐方案：</strong>采用UNION ALL操作符替代UNION，因为UNION ALL操作只是简单的将两个结果合并后就返回。</p> <p>select * from gc_dfys<br>union all<br>select * from ls_jg_dfys</p> <p><strong>二、SQL书写的影响</strong></p> <p><strong>1、同一功能同一性能不同写法SQL的影响。</strong></p> <p>如一个SQL在A程序员写的为&nbsp; Select * from zl_yhjbqk</p> <p>B程序员写的为 Select * from dlyx.zl_yhjbqk（带表所有者的前缀） <p>C程序员写的为 Select * from DLYX.ZLYHJBQK（大写表名） <p>D程序员写的为 Select *&nbsp; from DLYX.ZLYHJBQK（中间多了空格） <p>以上四个SQL在ORACLE分析整理之后产生的结果及执行的时间是一样的，但是从ORACLE共享内存SGA的原理，可以得出ORACLE对每个SQL 都会对其进行一次分析，并且占用共享内存，如果将SQL的字符串及格式写得完全相同，则ORACLE只会分析一次，共享内存也只会留下一次的分析结果，这不仅可以减少分析SQL的时间，而且可以减少共享内存重复的信息，ORACLE也可以准确统计SQL的执行频率。  <p><strong>2、WHERE后面的条件顺序影响</strong> <p>WHERE子句后面的条件顺序对大数据量表的查询会产生直接的影响。如：<br>Select * from zl_yhjbqk where dy_dj = '1KV以下' and xh_bz=1<br>Select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1KV以下'<br>以上两个SQL中dy_dj（电压等级）及xh_bz（销户标志）两个字段都没进行索引，所以执行的时候都是全表扫描，第一条SQL的dy_dj = '1KV以下'条件在记录集内比率为99%，而xh_bz=1的比率只为0.5%，在进行第一条SQL的时候99%条记录都进行dy_dj及xh_bz的比较，而在进行第二条SQL的时候0.5%条记录都进行dy_dj及xh_bz的比较，以此可以得出第二条SQL的CPU占用率明显比第一条低。 <p><strong>3、查询表顺序的影响</strong> <p>在FROM后面的表中的列表顺序会对SQL执行性能影响，在没有索引及ORACLE没有对表进行统计分析的情况下，ORACLE会按表出现的顺序进行链接，由此可见表的顺序不对时会产生十分耗服物器资源的数据交叉。（注：如果对表进行了统计分析，ORACLE会自动先进小表的链接，再进行大表的链接）  <p><strong>三、SQL语句索引的利用</strong> <p><strong>1、操作符优化（同上）</strong> <p><strong>2、对条件字段的一些优化</strong> <p><strong>采用函数处理的字段不能利用索引，</strong>如： <p>substr(hbs_bh,1,4)=&#8217;5400&#8217;，优化处理：hbs_bh like &#8216;5400%&#8217; <p>trunc(sk_rq)=trunc(sysdate)， 优化处理：sk_rq&gt;=trunc(sysdate) and sk_rq&lt;trunc(sysdate+1) <p>进行了显式或隐式的运算的字段不能进行索引，如：ss_df+20&gt;50，优化处理：ss_df&gt;30 <p>&#8216;X&#8217; || hbs_bh&gt;&#8217;X5400021452&#8217;，优化处理：hbs_bh&gt;&#8217;5400021542&#8217;<br> <p>sk_rq+5=sysdate，优化处理：sk_rq=sysdate-5  <p>hbs_bh=5401002554，优化处理：hbs_bh=&#8217; 5401002554&#8217;，注：此条件对hbs_bh 进行隐式的to_number转换，因为hbs_bh字段是字符型。 <p><strong>条件内包括了多个本表的字段运算时不能进行索引</strong>，如：ys_df&gt;cx_df，无法进行优化<br>qc_bh || kh_bh=&#8217;5400250000&#8217;，优化处理：qc_bh=&#8217;5400&#8217; and kh_bh=&#8217;250000&#8217;</p> <p><strong>四、其他</strong></p> <p>ORACLE的提示功能是比较强的功能，也是比较复杂的应用，并且提示只是给ORACLE执行的一个建议，有时如果出于成本方面的考虑ORACLE也可能不会按提示进行。根据实践应用，一般不建议开发人员应用ORACLE提示，因为各个数据库及服务器性能情况不一样，很可能一个地方性能提升了，但另一个地方却下降了，ORACLE在SQL执行分析方面已经比较成熟，如果分析执行的路径不对首先应在数据库结构（主要是索引）、服务器当前性能（共享内存、磁盘文件碎片）、数据库对象（表、索引）统计信息是否正确这几方面分析。 </p> <img src ="http://www.cnblogs.com/wxj1020/aggbug/1173638.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42129/" target="_blank">[新闻]GMail:回过头来支持IE6</a>]]></description></item><item><title>《Head.First设计模式》的学习笔记（6）－－单件模式</title><link>http://www.cnblogs.com/wxj1020/archive/2008/04/15/1154593.html</link><dc:creator>鹰击长空</dc:creator><author>鹰击长空</author><pubDate>Tue, 15 Apr 2008 08:30:00 GMT</pubDate><guid>http://www.cnblogs.com/wxj1020/archive/2008/04/15/1154593.html</guid><wfw:comment>http://www.cnblogs.com/wxj1020/comments/1154593.html</wfw:comment><comments>http://www.cnblogs.com/wxj1020/archive/2008/04/15/1154593.html#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://www.cnblogs.com/wxj1020/comments/commentRss/1154593.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/wxj1020/services/trackbacks/1154593.html</trackback:ping><description><![CDATA[摘要: 背景：有一些对象其实我们只需要一个，比方说：线程池（threadpool）、缓存（cache）、对话框、处理偏好设置和注册表（registry）的对象、日志对象，充当打印机、显卡等设备的驱动程序的对象。事实上，这类对象只能有一个实例，如果制造出多个实例，就会导致许多问题产生，例如：程序的行为异常、资源使用过量，或者是不一致的结果。因此，我们设计这种类时必须确保只有一个实例，单件模式应运而生。单件模&nbsp;&nbsp;<a href='http://www.cnblogs.com/wxj1020/archive/2008/04/15/1154593.html'>阅读全文</a><img src ="http://www.cnblogs.com/wxj1020/aggbug/1154593.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42128/" target="_blank">[新闻]Google十年大变样</a>]]></description></item><item><title>《Head.First设计模式》的学习笔记（5）－－工厂方法模式</title><link>http://www.cnblogs.com/wxj1020/archive/2008/04/09/1143913.html</link><dc:creator>鹰击长空</dc:creator><author>鹰击长空</author><pubDate>Wed, 09 Apr 2008 00:29:00 GMT</pubDate><guid>http://www.cnblogs.com/wxj1020/archive/2008/04/09/1143913.html</guid><wfw:comment>http://www.cnblogs.com/wxj1020/comments/1143913.html</wfw:comment><comments>http://www.cnblogs.com/wxj1020/archive/2008/04/09/1143913.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/wxj1020/comments/commentRss/1143913.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/wxj1020/services/trackbacks/1143913.html</trackback:ping><description><![CDATA[摘要: 意图：定义一个用于创建对象的接口，让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。结构： 实例：下面我们以Pizza店的例子来谈谈&#8220;工厂方法模式&#8221;的来龙去脉，我们学习的思路是&#8220;原始设计－－&gt;简单工厂－－&gt;工厂方法&#8221;。情景分析：假如你有一个Pizza店，那么你的Pizza订单可能会写成如下代码（这段代码&nbsp;&nbsp;<a href='http://www.cnblogs.com/wxj1020/archive/2008/04/09/1143913.html'>阅读全文</a><img src ="http://www.cnblogs.com/wxj1020/aggbug/1143913.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42127/" target="_blank">[新闻]谷歌十年创新路</a>]]></description></item><item><title>《Head.First设计模式》的学习笔记（4）－－装饰者模式</title><link>http://www.cnblogs.com/wxj1020/archive/2008/03/31/1130531.html</link><dc:creator>鹰击长空</dc:creator><author>鹰击长空</author><pubDate>Mon, 31 Mar 2008 00:31:00 GMT</pubDate><guid>http://www.cnblogs.com/wxj1020/archive/2008/03/31/1130531.html</guid><wfw:comment>http://www.cnblogs.com/wxj1020/comments/1130531.html</wfw:comment><comments>http://www.cnblogs.com/wxj1020/archive/2008/03/31/1130531.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.cnblogs.com/wxj1020/comments/commentRss/1130531.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/wxj1020/services/trackbacks/1130531.html</trackback:ping><description><![CDATA[<p><strong>意图：</strong>动态地将责任附加到对象上。若要扩展功能，装饰者提供了比继承更有弹性的替代方案。</p>
<p><strong>结构</strong>：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First4_11627/image_2.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="270" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First4_11627/image_thumb.png" width="600" border="0" /></a> </p>
<p><strong>例子</strong>：</p>
<p>下面我们以星巴兹（Starbuzz）的订单系统为例加以说明。</p>
<p><strong>需求分析：</strong></p>
<p>1）、星巴兹的饮料（Beverage）种类繁多，主要有HouseBlend、DarkRoast、Decaf、Espresso。</p>
<p>2）、星巴兹的调料很多，主要有Steamed Milk、Soy、Mocha、Whip。</p>
<p>3）、星巴兹的饮料价格是根据饮料的基础价和所加入的调料的价格相加得到。</p>
<p><strong>错误设计：</strong></p>
<p>根据以上的简单分析，<strong>第一种类图</strong>设计出炉：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First4_11627/image_6.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="443" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First4_11627/image_thumb_2.png" width="555" border="0" /></a> </p>
<p>其中getDescription（）用来描述饮料，cost（）用来计算价格。</p>
<p>显而易见，这个类图设计的最大缺点就是类太多，系统难以维护。所以我们需要另外的解决方案，而且新方案必须避免&#8220;类爆炸&#8221;。此时我们想到了实例变量和继承。先从Beverage基类下手，加上实例变量代表是否加上调料（Steamed Milk、Soy、Mocha、Whip等），Beverage基类的cost（）计算调料的价钱，而各种具体的饮料（HouseBlend、DarkRoast、Decaf、Espresso等）的cost（）将把基础饮料的价钱和调料的价钱相加得到饮料的价钱。由此可以设计出<strong>第二种类图</strong>。</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First4_11627/image_8.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="352" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First4_11627/image_thumb_3.png" width="580" border="0" /></a> </p>
<p>对这个类图设计的<strong>评价</strong>：如果需求不再变化，那么这个类图设计没有错；但是需求发生了变化，这个设计就会难以招架。经过进一步的分析，我们发现部分需求被我们遗漏了。</p>
<p><strong>新增加的需求：</strong></p>
<p>1）、调料的价格可能发生变化。</p>
<p>2）、调料的种类可能发生变化。</p>
<p>3）、饮料的种类可能增加，不只HouseBlend、DarkRoast、Decaf、Espresso四种。</p>
<p>4）、顾客可能在一种饮料里加双份的同种饮料。</p>
<p>显然，第二种类图设计难以满足新的需求，而且对新增加的饮料而言，有可能存在不适合的调料。例如，茶子类将继承hasWhip（）（加奶泡）等方法。因此，我们应该对类图设计进行改进。此时我们想到了装饰者模式，那么如何应用装饰者模式呢？</p>
<p><strong>以装饰者模式构造饮料订单：</strong></p>
<p>1）、以DarkRoast对象开始。<a href="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First4_11627/image_10.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="101" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First4_11627/image_thumb_4.png" width="120" border="0" /></a> </p>
<p>2）、顾客想要Mocha，所以建立一个Mocha对象，并用它将DarkRoast对象包装起来。<a href="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First4_11627/image_14.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="155" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First4_11627/image_thumb_6.png" width="244" border="0" /></a> </p>
<p>3）、顾客也想要Whip，所以需要建立一个Whip装饰者，并用它将Mocha对象包起来。<a href="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First4_11627/image_16.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="175" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First4_11627/image_thumb_7.png" width="244" border="0" /></a> </p>
<p>4）、现在，该是为顾客算钱的时候了。通过最外圈装饰者（Whip)的cost（）就可以办得到。Whip的cost（）会先委托它装饰的对象（Mocha）计算出价钱，然后再加上Whip的价钱。</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First4_11627/image_18.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="374" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First4_11627/image_thumb_8.png" width="638" border="0" /></a> </p>
<p>根据以上的分析，应用装饰者模式，我们可以打造一个全新的类图。</p>
<p><strong>第三种类图设计（正确的类图）：</strong></p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First4_11627/image_20.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="353" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First4_11627/image_thumb_9.png" width="659" border="0" /></a> </p>
<p>部分代码为：<br />
<span class="lnum"></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;DarkRoast&nbsp;:&nbsp;Beverage<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_38_219_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_38_219_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_38_219_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_38_219_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_38_219_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_38_219_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_38_219_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_38_219_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_38_219_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_38_219_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;3</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;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;DarkRoast()<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img id="Codehighlighter1_75_126_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_75_126_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_75_126_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_75_126_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_75_126_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_75_126_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_75_126_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_75_126_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_75_126_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_75_126_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;5</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;description&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">Dark&nbsp;Roast</span><span style="color: #800000">"</span><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/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;7</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;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;Cost()<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img id="Codehighlighter1_177_213_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_177_213_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_177_213_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_177_213_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_177_213_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_177_213_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_177_213_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_177_213_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_177_213_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_177_213_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;9</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;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">1.22</span><span style="color: #000000">;<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></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/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Mocha&nbsp;:&nbsp;CondimentDecorator<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img id="Codehighlighter1_264_646_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_264_646_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_264_646_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_264_646_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_264_646_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_264_646_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_264_646_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_264_646_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_264_646_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_264_646_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">14</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;Beverage&nbsp;myBeverage;<br />
</span><span style="color: #008080">15</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;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Mocha(Beverage&nbsp;paramBeverage)<br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img id="Codehighlighter1_348_404_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_348_404_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_348_404_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_348_404_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_348_404_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_348_404_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_348_404_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_348_404_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_348_404_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_348_404_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">17</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;</span><span style="color: #0000ff">this</span><span style="color: #000000">.myBeverage&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;paramBeverage;<br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">20</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;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;GetDescription()<br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img id="Codehighlighter1_462_532_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_462_532_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_462_532_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_462_532_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_462_532_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_462_532_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_462_532_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_462_532_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_462_532_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_462_532_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">22</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;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;myBeverage.GetDescription()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">,Mocha</span><span style="color: #800000">"</span><span style="color: #000000">;<br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">25</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;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;Cost()<br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img id="Codehighlighter1_585_640_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_585_640_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_585_640_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_585_640_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_585_640_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_585_640_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_585_640_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_585_640_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_585_640_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_585_640_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">27</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;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0.5</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;myBeverage.Cost();<br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">29</span><span style="color: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">30</span><span style="color: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;StarbuzzCoffee<br />
</span><span style="color: #008080">31</span><span style="color: #000000"><img id="Codehighlighter1_672_1200_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_672_1200_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_672_1200_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_672_1200_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_672_1200_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_672_1200_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_672_1200_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_672_1200_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_672_1200_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_672_1200_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">32</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;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Main(</span><span style="color: #0000ff">string</span><span style="color: #000000">[]&nbsp;args)<br />
</span><span style="color: #008080">33</span><span style="color: #000000"><img id="Codehighlighter1_722_1194_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_722_1194_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_722_1194_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_722_1194_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_722_1194_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_722_1194_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_722_1194_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_722_1194_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_722_1194_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_722_1194_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">34</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;Beverage&nbsp;myBeverage&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Espresso();<br />
</span><span style="color: #008080">35</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;Console.WriteLine(myBeverage.GetDescription()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">&nbsp;$</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;myBeverage.Cost());<br />
</span><span style="color: #008080">36</span><span style="color: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">37</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;Beverage&nbsp;myBeverage2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DarkRoast();<br />
</span><span style="color: #008080">38</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;myBeverage2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Mocha(myBeverage2);<br />
</span><span style="color: #008080">39</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;myBeverage2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Mocha(myBeverage2);<br />
</span><span style="color: #008080">40</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;myBeverage2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Whip(myBeverage2);<br />
</span><span style="color: #008080">41</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;Console.WriteLine(myBeverage2.GetDescription()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">&nbsp;$</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;myBeverage2.Cost());<br />
</span><span style="color: #008080">42</span><span style="color: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">43</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;Console.ReadLine();<br />
</span><span style="color: #008080">44</span><span style="color: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">45</span><span style="color: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p>&nbsp;&nbsp;</span><span class="lnum"> </span>
<style type="text/css">.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</p>
<p>&nbsp;<strong>装饰模式的适用情况：</strong></p>
<p>1）、需要扩展一个类的功能，或给一个类增加附加责任。</p>
<p>2）、需要动态地给一个对象增加功能，这些功能可以再动态地撤销。</p>
<p>3）、需要增加由一些基本功能的排列组合而产生的非常大量的功能，从而使继承关系变得不现实。</p>
<p><strong>使用装饰模式主要有以下的优点：</strong></p>
<p>1）、装饰模式与继承关系的目的都是要扩展对象的功能，但是装饰模式可以提供比继承更多的灵活性。</p>
<p>2）、通过使用不同的具体装饰类以及这些装饰类的排列组合，设计师可以创造出很多不同行为的组合。</p>
<p><strong>使用装饰模式主要有以下的缺点：</strong></p>
<p>由于使用装饰模式，可以比使用继承关系需要较少数目的类。使用较少的类，当然使设计比较易于进行。但是，在另一方面，使用装饰模式会产生比使用继承关系更多的对象。更多的对象会使得查错变得困难，特别是这些对象看上去都很相像。
<p><strong>参考文献：</strong>&nbsp;</p>
<p>《Head.First设计模式》</p>
<p>&nbsp; 吕震宇&nbsp; 设计模式系列</p>
<p><strong>源代码下载：<a href="/Files/wxj1020/StarbuzzCoffee.rar">/Files/wxj1020/StarbuzzCoffee.rar</a></strong></p>
<img src ="http://www.cnblogs.com/wxj1020/aggbug/1130531.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42126/" target="_blank">[新闻]十年回顾：Google的互联网经济</a>]]></description></item><item><title>《Head.First设计模式》的学习笔记（3）－－观察者模式</title><link>http://www.cnblogs.com/wxj1020/archive/2008/03/24/1119703.html</link><dc:creator>鹰击长空</dc:creator><author>鹰击长空</author><pubDate>Mon, 24 Mar 2008 07:22:00 GMT</pubDate><guid>http://www.cnblogs.com/wxj1020/archive/2008/03/24/1119703.html</guid><wfw:comment>http://www.cnblogs.com/wxj1020/comments/1119703.html</wfw:comment><comments>http://www.cnblogs.com/wxj1020/archive/2008/03/24/1119703.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.cnblogs.com/wxj1020/comments/commentRss/1119703.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/wxj1020/services/trackbacks/1119703.html</trackback:ping><description><![CDATA[<p><strong>意图：</strong>定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。</p>
<p><strong>结构：</strong></p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First3_138A2/image_4.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="222" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First3_138A2/image_thumb.png" width="538" border="0" /></a> </p>
<p><strong>例子：</strong></p>
<p>下面以模拟气象站系统来加以说明。</p>
<p><strong>需求分析：</strong></p>
<p>该系统的需求如下：</p>
<p>1、气象站能够追踪目前的天气状况，包括温度、湿度、气压、</p>
<p>2、气象站能够提供三种布告板，分别显示目前天气状况、气象统计和简单的预报。</p>
<p>3、布告板上的数据必须实时更新。</p>
<p>4、气象站必须提供一组API，供其他开发人员开发其他的布告板。</p>
<p><strong>设计部分：</strong></p>
<p>基于以上需求，该系统可以设计成3部分：气象站（获取实际气象数据的物理装置）、WeatherData对象（追踪来自气象站的数据，并更新布告板）和布告板（显示目前的天气状况给用户看）。效果图如下：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First3_138A2/image_6.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="250" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First3_138A2/image_thumb_2.png" width="638" border="0" /></a> </p>
<p><strong>错误的类图设计</strong>（即没有学过设计模式时的第一感觉）可能如下：</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First3_138A2/image_10.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="294" alt="image" src="http://www.cnblogs.com/images/cnblogs_com/wxj1020/WindowsLiveWriter/Head.First3_138A2/image_thumb_1.png" width="450" border="0" /></a> </p>
<p><strong>相应的代码实现部分：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;MeasurementsChanged()<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_42_531_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_42_531_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_42_531_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_42_531_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_42_531_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_42_531_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_42_531_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_42_531_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_42_531_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 alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_42_531_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temperature&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.GetTemperature();&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;获得温度</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;humidity&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.GetHumidity();&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 />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pressure&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.GetPressure();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;获得气压&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyCurrentConditionsDisplay.Update(temperature,&nbsp;humidity,&nbsp;pressure);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;更新目前天气状态板</span><span style="color: #008000"><br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyStatisticsDisplay.Update(temperature,&nbsp;humidity,&nbsp;pressure);&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 />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyForcastDisplay.Update(temperature,&nbsp;humidity,&nbsp;pressure);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;更新天气预报板&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #008080">10</span><span style="color: #008000"><img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p></strong><strong>这个类图设计的缺点：</strong> </p>
<p>1）、该设计是针对具体实现编程，而非针对接口。
<p>2）、对于每个新的布告板，我们都得修改代码。
<p>3）、我们无法在运动时动态得增加或删除布告板。
<p>4）、我们尚未封装改变的部分。</p>
<p><strong>那么如何改正这些缺点呢？</strong></p>
<p>首先我们必须明白这些缺点的根源在哪里。很明显，我们在类图设计时依赖关系错了，应该依赖倒置。CurrrentConditionsDisplay类、StatisticsDisplay类和ForcastDisplay类应该依赖WeatherData类，而不是相反,这样就可以起到解耦的目的。</p>
<p>其次，CurrrentConditionsDisplay类、StatisticsDisplay类和ForcastDisplay类都有一个Update（）方法，因此应该提炼一个接口，这样可以实现&#8220;针对接口编程&#8221;，使代码更加灵活，也方便其他开发人员开发其他的布告板。</p>
<p><strong>进一步思考：</strong></p>
<p>1）、改正这些缺点后，我们的类图已经与观察者模式的结构有点类似了。</p>
<p>2）、我们的气象站系统的最大问题其实就是一对多的依赖引起的，而观察者模式正是解除一对多关系的不二法门，因此我们有必要采用观察者模式。</p>
<p>采用了观察者模式后设计的类图应该是这样：<br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/wxj1020/weather.GIF" border="0" /><br />
WeatherDatea实现ISubject接口，CurrentConditionsDisplay、ForcastDisplay、StatisticsDisplay实现IObserver接口，ISubject调用IObserver，CurrentConditionsDisplay、ForcastDisplay、StatisticsDisplay调用ISubject。<br />
<br />
<strong>相应的代码实现部分：<br />
</strong></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;WeatherData&nbsp;:&nbsp;ISubject<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_40_1047_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_40_1047_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_40_1047_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_40_1047_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_40_1047_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_40_1047_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_40_1047_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_40_1047_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_40_1047_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_40_1047_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;3</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;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">float</span><span style="color: #000000">&nbsp;temperature;<br />
</span><span style="color: #008080">&nbsp;4</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;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">float</span><span style="color: #000000">&nbsp;humidity;<br />
</span><span style="color: #008080">&nbsp;5</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;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">float</span><span style="color: #000000">&nbsp;pressure;<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;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">IObserver</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;myList&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;List</span><span style="color: #000000">&lt;</span><span style="color: #000000">IObserver</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
</span><span style="color: #008080">&nbsp;8</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;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;SetWeatherData(</span><span style="color: #0000ff">float</span><span style="color: #000000">&nbsp;paramTemp,&nbsp;</span><span style="color: #0000ff">float</span><span style="color: #000000">&nbsp;paramHumidity,&nbsp;</span><span style="color: #0000ff">float</span><span style="color: #000000">&nbsp;paramPressure)<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img id="Codehighlighter1_308_482_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_308_482_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_308_482_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_308_482_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_308_482_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_308_482_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_308_482_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_308_482_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_308_482_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_308_482_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">10</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;</span><span style="color: #0000ff">this</span><span style="color: #000000">.temperature&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;paramTemp;<br />
</span><span style="color: #008080">11</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;</span><span style="color: #