﻿<?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>C++博客-黎明的剔透里伸出了你沁清的暧昧-随笔分类-SoftwareEngine</title><link>http://www.cppblog.com/init/category/17180.html</link><description>Graphics|EngineDev|GameDev|2D&amp;3D Art            
                                 </description><language>zh-cn</language><lastBuildDate>Fri, 03 May 2013 19:10:22 GMT</lastBuildDate><pubDate>Fri, 03 May 2013 19:10:22 GMT</pubDate><ttl>60</ttl><item><title>Some Design Pattern Ⅰ</title><link>http://www.cppblog.com/init/archive/2012/11/10/195023.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Sat, 10 Nov 2012 11:37:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2012/11/10/195023.html</guid><wfw:comment>http://www.cppblog.com/init/comments/195023.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2012/11/10/195023.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/195023.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/195023.html</trackback:ping><description><![CDATA[<p><font size="3">设计模式是关于形式化一些通用软件解决方案，为日常工程任务的讨论提供可供参考的通用框架。</font></p>
<p><font size="3"><strong>一、Singleton单件模式</strong> -创建型</font></p>
<p><font size="3">《设计模式》中指出：Singleton模式的意图：保证一个类仅有一个实例，并提供一个访问它的全局访问点。</font></p>
<p><font size="3">对一些类来说，只有一个实例是很重要的，怎么才能保证一个类只有一个实例并且这个实例易于被访问，首先，一个全局变量使得一个对象可以被访问，其次就是怎么保证只有 一个实例，一个更好的方法时让类自身负责保存它的唯一实例，这个类可以保证没有其他实例可以被创建，并且他提供一个访问该实例的方法。这个就是Singleton模式。</font></p>
<p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当大量的类或者模块需要访问一个全局对象时，使用单间模式，</font></p>
<p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当这个唯一的实例应该是通过子类化可扩展的，并且客户应该无需更该改代码就能使用一个扩展的实例时，使用单间模式</font></p>
<p><font size="3">一般结构:</font><a href="file:///C:/Users/init/AppData/Local/Temp/WindowsLiveWriter-429641856/supfiles8DD692/12.jpg"><font size="3"><a href="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/7410006a494d_D694/1_thumb_2.jpg"><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="1_thumb" border="0" alt="1_thumb" src="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/7410006a494d_D694/1_thumb_thumb.jpg" width="587" height="209" /></a></font></a></p>
<p><font size="3">类包含了指向它唯一实例的指针，定义一个Instance操作，允许客户访问它的唯一实例，Instance是一个类操作,通过提供一个static的接口来获取实例。</font></p>
<p><font size="3"></font>&nbsp;</p>
<p><font size="3">在设计游戏引擎时，对于纹理对象，如果类的每一个对象代表一个贴图对象，每次都调用函数从文件加载，势必造成性能下降、浪费内存。为了确保每个纹理加载一次，可以使用单件模式，让类自己负责它的创建，在访问函数中截取，使用Lazy Initiation， 当私有的实例为空时，才进行创建，当然还要检查是否为空时要加锁，否则在竞争时会出现两个线程同时常见而让唯一的实例变成多个。</font></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 5px; background-color: #f5f5f5; padding-left: 5px; padding-right: 5px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 5px" class="cnblogs_code"><pre><span style="color: #000000">#ifndef _SINGLEONTEXTURE_H_
</span><span style="color: #0000ff">#define</span> _SINGLEONTEXTURE_H_
<span>class SingletonTexture{
</span><span>public:
    </span><span style="color: #0000ff">static</span> SingletonTexture* Instance();<span style="color: #008000">//</span><span style="color: #008000">全局访问点</span>
<span>protected:
   SingletonTexture();</span><span style="color: #008000">//</span><span style="color: #008000">自己负责创建</span>
<span>private:
    </span><span style="color: #0000ff">static</span> SingletonTexture* m_instance;<span style="color: #008000">//</span><span style="color: #008000">保存自己的一个实例</span>
<span style="color: #000000">};
</span><span style="color: #0000ff">#endif</span> _SINGLEONTEXTURE_H_</pre></div>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 5px; background-color: #f5f5f5; padding-left: 5px; padding-right: 5px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 5px" class="cnblogs_code">&nbsp;</div>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 5px; background-color: #f5f5f5; padding-left: 5px; padding-right: 5px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 5px" class="cnblogs_code"><pre>#include &lt;windows.h&gt;<span>
#include "</span><span style="color: #800000">iostream</span><span style="color: #800000">"</span>
<span style="color: #0000ff">using</span> <span>namespace std;
#include </span><span style="color: #800000">"</span><span style="color: #800000">Singleton.h</span><span>"

SingletonTexture</span>* SingletonTexture::m_instance =<span style="color: #000000"> NULL;

SingletonTexture::SingletonTexture (){
    cout</span>&lt;&lt;<span style="color: #800000">"</span><span style="color: #800000">SingletonTexture Created!</span><span style="color: #800000">"</span>&lt;&lt;<span style="color: #000000">endl;
}
SingletonTexture</span>*<span style="color: #000000"> SingletonTexture::Instance (){
    </span><span style="color: #0000ff">if</span>(m_instance ==<span style="color: #000000"> NULL){
        m_instance </span>= <span>new SingletonTexture();
        cout</span>&lt;&lt;<span style="color: #800000">"</span><span style="color: #800000">m_instance == NULL</span><span style="color: #800000">"</span>&lt;&lt;<span style="color: #000000">endl;
    }
    </span><span>return m_instance;
}
</span><span>int main(){
    SingletonTexture</span>* ST =<span style="color: #000000"> SingletonTexture::Instance ();
    system(</span><span style="color: #800000">"</span><span style="color: #800000">pause</span><span>");
    </span><span style="color: #0000ff">return</span> <span>0;
}</span></pre></div>
<p><a href="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/7410006a494d_D694/_thumb_2.jpg"><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="_thumb" border="0" alt="_thumb" src="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/7410006a494d_D694/_thumb_thumb.jpg" width="647" height="131" /></a></p>
<p><font size="3"></font>&nbsp;</p>
<p><font size="3">这样只用创建一个非本地的静态对象就可以，但是具体的创建时间无法确定，解决办法就是把访问这个单件类的行为封装在一个函数内，当调用了这个函数时，才对单件类进行真正的创建，</font></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 5px; background-color: #f5f5f5; padding-left: 5px; padding-right: 5px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 5px" class="cnblogs_code"><pre><span>class SingletonTexture{
</span><span>public:
    SingletonTexture </span>&amp;<span style="color: #000000">Instance(){
        </span><span>static SingletonTexture Obj;
        </span><span>return Obj;
    }
</span><span>private：
    SingletonTexture();
}；</span></pre></div>
<p>&nbsp;</p>
<p><font size="3">对于第一种方法由于使用了类的静态成员，在内存中除了每个对象自己的数据成员以外，还会保留一份有关所有纹理对象信息列表，虽然使用了指针，但是由于没有类再从这个类继承下去，而且所有的对象都是一个类，相互之间没有资源释放的先后问题，就不会出现由于释放顺序出现悬空问题。但是由于同时对全部的纹理进行处理，可能会造成资源负荷过重，要建立一个日志；而第二种方法比较符合要求。</font></p>
<p><font size="3">使用单件模式，而不简单的创建一个全局对象或者指针，首先通过简单的函数访问变量比在所有文件中声明extern简单，而且还可以控制变量初始化的时间；其次使用指针而不是用对象的话，可以通过C++对对象进行完全的访问，有更好的访问控制，例如对类每一次的访问进行监控；最后还可以创建singleton类然后再派生，可以再保证基类以及集成类的条件下，扩充基类。</font></p>
<p><font size="3"></font>&nbsp;</p>
<p><font size="3"><strong>二、Facade（外观）模式</strong>-对象结构型模式</font></p>
<p><font size="3">《设计模式》中提到外观模式的意图是为子系统中的一组接口提供一个一致的界面，Facade模式定义了一个高层接口，这个接口使得这个子系统更加容易使用。</font></p>
<p><font size="3">实用性：</font></p>
<p><font size="3">1.当你要为一个复杂子系统提供一个简单接口时，子系统往往要不断演化而变的复杂，大多数模式使用时都会产生更小的类，这使得子系统更具有重用性，也更容易对子系统进行定制，但是这也给那些不需要定制子系统的用户带来了一些使用上的困难，Facade可以提供一个简单的缺省视图，这一视图对大多数用户已经够了，而那些需要更多的定制的用户可以越过Facade这一层。</font></p>
<p><font size="3">2.客户程序与抽象类的实现部分之间存在很大的依赖性。引入facade模式将这个子系统与客户以及其他的子系统分离，可以提高子系统的独立性和可移植性。</font></p>
<p><font size="3">3.当你需要构建一个层次结构的子系统时，使用facade模式定义子系统的每层的入口点。如果子系统之间是相互依赖的，可以让他们通过facade进行通讯，从而简化了他们之间的依赖关系。</font></p>
<p><font size="3">在设计具有一定复杂度的图形引擎时，它也具有扩展和变化的潜在可能，因此会使得整个系统之间的通信和相互依赖增加，导致系统复杂，灵活性降低，使用Facade模式将诸多复杂性和变化隐藏起来，高度封装图形引擎，使图形引擎这一子系统更加容易使用，同时由于这一子系统独一无二，应当作为一个Singleton。 </font></p>
<p><font size="3">为了使类之间的相关性（耦合性）达到最小，有必要使用Facade或管理器，当整个子系统需要进行大的改动或者是替换的时候，复杂的相关性就会产生问题，面向对象程序设计在类的范围内对实现改动进行了保护，但更广泛的改动保护需要一种新的范式，Facade模式在更大规模上解决了面向对象编程所保护的同类问题。实现Facade类的首要原则是：尽量避免子系统内部类对外的暴露。</font></p>
<p><font size="3">结构：</font></p>
<p><a href="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/7410006a494d_D694/facade_2.jpg"><font size="3"><img style="background-image: none; border-right-width: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="facade" border="0" alt="facade" src="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/7410006a494d_D694/facade_thumb.jpg" width="641" height="363" /></font></a></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 5px; background-color: #f5f5f5; padding-left: 5px; padding-right: 5px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 5px" class="cnblogs_code"><pre><span style="color: #000000">#ifndef _FACADE_H_
</span><span style="color: #0000ff">#define</span> _FACADE_H_
<span style="color: #0000ff">class</span><span style="color: #000000"> SubSystemOne{
</span><span style="color: #0000ff">public</span><span style="color: #000000">:
    SubSystemOne(){
    }
    </span>~<span style="color: #000000">SubSystemOne(){
    }
    </span><span style="color: #0000ff">void</span><span style="color: #000000"> Operator();

};

</span><span style="color: #0000ff">class</span><span style="color: #000000"> SubSystemTwo{
</span><span style="color: #0000ff">public</span><span style="color: #000000">:
    SubSystemTwo(){
    }
    </span>~<span style="color: #000000">SubSystemTwo(){
    }
    </span><span style="color: #0000ff">void</span><span style="color: #000000"> Operator();

};

</span><span style="color: #0000ff">class</span><span style="color: #000000"> Facade{
</span><span style="color: #0000ff">public</span><span style="color: #000000">:
    Facade();
    </span>~<span style="color: #000000">Facade();
    </span><span style="color: #0000ff">void</span><span style="color: #000000"> Operator();
</span><span style="color: #0000ff">private</span><span style="color: #000000">:
     SubSystemOne </span>*<span style="color: #000000">so;
     SubSystemTwo </span>*<span style="color: #000000">st;
};
</span><span style="color: #0000ff">#endif</span> _FACADE_H_</pre></div>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 5px; background-color: #f5f5f5; padding-left: 5px; padding-right: 5px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 5px" class="cnblogs_code"><pre>#include <span style="color: #800000">"</span><span style="color: #800000">windows.h</span><span style="color: #800000">"</span><span style="color: #000000">
#include </span>&lt;iostream&gt;
<span style="color: #0000ff">using</span> <span style="color: #0000ff">namespace</span><span style="color: #000000"> std;
#include </span><span style="color: #800000">"</span><span style="color: #800000">Facade.h</span><span style="color: #800000">"</span>
<span style="color: #0000ff">void</span><span style="color: #000000"> SubSystemOne::Operator(){
    cout</span>&lt;&lt;<span style="color: #800000">"</span><span style="color: #800000">SubSystemOne Operator!</span><span style="color: #800000">"</span>&lt;&lt;<span style="color: #000000">endl;
}
</span><span style="color: #0000ff">void</span><span style="color: #000000"> SubSystemTwo::Operator(){
    cout</span>&lt;&lt;<span style="color: #800000">"</span><span style="color: #800000">SubSystemTwo Operator!</span><span style="color: #800000">"</span>&lt;&lt;<span style="color: #000000">endl;
}

Facade::Facade(){
    so </span>= <span style="color: #0000ff">new</span><span style="color: #000000"> SubSystemOne();
    st </span>= <span style="color: #0000ff">new</span><span style="color: #000000"> SubSystemTwo();
}
Facade::</span>~<span style="color: #000000">Facade (){
    delete so;
    delete st;
}

</span><span style="color: #0000ff">void</span><span style="color: #000000"> Facade::Operator (){
    so</span>-&gt;<span style="color: #000000">Operator();
    st</span>-&gt;<span style="color: #000000">Operator();
}
</span><span style="color: #0000ff">int</span><span style="color: #000000"> main(){
    Facade </span>* facade = <span style="color: #0000ff">new</span><span style="color: #000000"> Facade();
    facade</span>-&gt;<span style="color: #000000">Operator ();
    system(</span><span style="color: #800000">"</span><span style="color: #800000">pause</span><span style="color: #800000">"</span><span style="color: #000000">);
    </span><span style="color: #0000ff">return</span> <span style="color: #800080">0</span><span style="color: #000000">;

}</span></pre></div><font size="3"></font><a href="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/7410006a494d_D694/%E6%9C%AA%E5%91%BD%E5%90%8D_4.jpg"><font size="3"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="未命名" border="0" alt="未命名" src="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/7410006a494d_D694/%E6%9C%AA%E5%91%BD%E5%90%8D_thumb_1.jpg" width="665" height="103" /></font></a> 
<p><font size="3"></font>&nbsp;</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/7410006a494d_D694/%E6%9C%AA%E5%91%BD%E5%90%8D_4.jpg"><font size="3"></font></a>&nbsp;</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/7410006a494d_D694/%E6%9C%AA%E5%91%BD%E5%90%8D_4.jpg"><font size="3"></font></a>&nbsp;</p>
<p><a href="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/7410006a494d_D694/%E6%9C%AA%E5%91%BD%E5%90%8D_4.jpg"><font size="3"></font></a>&nbsp;</p>
<p><font size="3"></font>&nbsp;</p>
<p><font size="3"></font>&nbsp;</p>
<p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br />&nbsp;&nbsp; Facade模式在高层提供了一个统一的接口，更像是一个管理类，解藕了系统，设计模式中还有另外一种Mediator模式和Facade模式有类似地方，但是Mediator 主要目的是对象间的访问解耦。</font></p>
<p>&nbsp;</p>
<p><font size="3"><strong>三、State（状态）模式-</strong> 对象行为模式</font></p>
<p><font size="3">《设计模式》中指出state 模式允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。</font></p>
<p><font size="3">适用性</font></p>
<p><font size="3">一个对象的行为取决于它的状态，并且它必须在运行时刻根据状态改变它的行为；</font></p>
<p><font size="3">一个操作中含有庞大的多分支的条件语句，且这些分支依赖于该对象的状态，这个状态通常用一个或者多个枚举常量表示。通常，有多个操作包含这一相同的条件结构。state模式将每一个条件分支放入一个独立的类中，使得你可以根据对象自身的情况将对象的状态作为一个对象，这一对象可以不依赖其他对象而独立变换。</font></p>
<p><font size="3">在游戏中，程序员需要处理游戏状态而不断的实时追踪问题，状态在刚开始的时候通常是简单的枚举，其行为实现基于switch&#8230;case结构的选择，然后当状态的数量增大，维护一组switch&#8230;case语句会是一件异常困难并且出错率较高的事情。，而且状态逻辑与动作实现没有分离，动作的代码直接写在状态的逻辑中，将使系统的可扩展性和维护性性能变低。state模式将状态逻辑与动作实现分离开来，当一个操作中药维护大量的case分支语句，并且这些分支语句依赖于对象的状态，state模式将每一个分支都独立封装到独立的类中。</font></p>
<p><font size="3">结构：</font></p>
<p><a href="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/7410006a494d_D694/state_2.jpg"><img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px auto; padding-left: 0px; padding-right: 0px; display: block; float: none; border-top: 0px; border-right: 0px; padding-top: 0px" title="state" border="0" alt="state" src="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/7410006a494d_D694/state_thumb.jpg" width="823" height="417" /></a></p>
<p><font size="3"></font>&nbsp;</p>
<p>&nbsp;</p>
<p>示例：</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 5px; background-color: #f5f5f5; padding-left: 5px; padding-right: 5px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 5px" class="cnblogs_code"><pre><span style="color: #000000">#ifndef _STATE_H_
</span><span style="color: #0000ff">#define</span> _STATE_H_
<span style="color: #0000ff">class</span><span style="color: #000000"> State;
</span><span style="color: #0000ff">class</span><span style="color: #000000"> Context{
</span><span style="color: #0000ff">public</span><span style="color: #000000">:
    Context(State </span>*<span style="color: #000000">ps);
    </span>~<span style="color: #000000">Context();
    </span><span style="color: #0000ff">void</span><span style="color: #000000"> Request();
    </span><span style="color: #0000ff">void</span> ChangeState(State *<span style="color: #000000">ps);
</span><span style="color: #0000ff">private</span><span style="color: #000000">:
    State </span>*<span style="color: #000000">m_state;
};

</span><span style="color: #0000ff">class</span><span style="color: #000000"> State{
</span><span style="color: #0000ff">public</span><span style="color: #000000">:
    State(){}
    </span><span style="color: #0000ff">virtual</span> ~<span style="color: #000000">State(){}
    </span><span style="color: #0000ff">virtual</span> <span style="color: #0000ff">void</span> Handle(Context *context)=<span style="color: #800080">0</span><span style="color: #000000">;
};

</span><span style="color: #0000ff">class</span> StateA : <span style="color: #0000ff">public</span><span style="color: #000000"> State{
</span><span style="color: #0000ff">public</span><span style="color: #000000">:
    StateA(){}
    </span>~<span style="color: #000000">StateA(){}
   </span><span style="color: #0000ff">void</span> Handle(Context *<span style="color: #000000">context);
};
</span><span style="color: #0000ff">class</span> StateB : <span style="color: #0000ff">public</span><span style="color: #000000"> State{
</span><span style="color: #0000ff">public</span><span style="color: #000000">:
    StateB(){}
    </span>~<span style="color: #000000">StateB(){}
   </span><span style="color: #0000ff">void</span> Handle(Context *<span style="color: #000000">context);
};
</span><span style="color: #0000ff">#endif</span> _STATE_H_</pre></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 5px; background-color: #f5f5f5; padding-left: 5px; padding-right: 5px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 5px" class="cnblogs_code"><pre>#include &lt;windows.h&gt;<span style="color: #000000">
#include </span>&lt;iostream&gt;
<span style="color: #0000ff">using</span> <span style="color: #0000ff">namespace</span><span style="color: #000000"> std;
#include </span><span style="color: #800000">"</span><span style="color: #800000">State.h</span><span style="color: #800000">"</span><span style="color: #000000">

Context::Context (State </span>*<span style="color: #000000">ps)
    :m_state(ps){

}
Context::</span>~<span style="color: #000000">Context (){
    delete m_state;
}
</span><span style="color: #0000ff">void</span><span style="color: #000000"> Context::Request (){
    </span><span style="color: #0000ff">if</span>(m_state!=<span style="color: #000000">NULL){
      m_state</span>-&gt;Handle (<span style="color: #0000ff">this</span><span style="color: #000000">);
    }
}
</span><span style="color: #0000ff">void</span> Context::ChangeState (State *<span style="color: #000000">ps){
    </span><span style="color: #0000ff">if</span>(m_state!=<span style="color: #000000">NULL){
      delete m_state;
      m_state </span>=<span style="color: #000000"> NULL;
    }
    m_state </span>=<span style="color: #000000"> ps;
}
</span><span style="color: #0000ff">void</span> StateA::Handle (Context *<span style="color: #000000">context){
    cout</span>&lt;&lt;<span style="color: #800000">"</span><span style="color: #800000">Handle By StateA!</span><span style="color: #800000">"</span>&lt;&lt;<span style="color: #000000">endl;
    </span><span style="color: #0000ff">if</span>(context!=<span style="color: #000000">NULL){
    context</span>-&gt;ChangeState (<span style="color: #0000ff">new</span><span style="color: #000000"> StateB());
    }    
}

</span><span style="color: #0000ff">void</span> StateB::Handle (Context *<span style="color: #000000">context){
    cout</span>&lt;&lt;<span style="color: #800000">"</span><span style="color: #800000">Handle By StateA!</span><span style="color: #800000">"</span>&lt;&lt;<span style="color: #000000">endl;
    </span><span style="color: #0000ff">if</span>(context!=<span style="color: #000000">NULL){
    context</span>-&gt;ChangeState (<span style="color: #0000ff">new</span><span style="color: #000000"> StateA());
    }    
}
</span><span style="color: #0000ff">int</span><span style="color: #000000"> main(){
    State </span>*pstate = <span style="color: #0000ff">new</span><span style="color: #000000"> StateA();
    Context </span>*pcontext = <span style="color: #0000ff">new</span><span style="color: #000000"> Context(pstate);
    pcontext</span>-&gt;<span style="color: #000000">Request ();
    pcontext</span>-&gt;<span style="color: #000000">Request ();
    pcontext</span>-&gt;<span style="color: #000000">Request ();
    delete pcontext;
    system(</span><span style="color: #800000">"</span><span style="color: #800000">pause</span><span style="color: #800000">"</span><span style="color: #000000">);
    </span><span style="color: #0000ff">return</span> <span style="color: #800080">0</span><span style="color: #000000">;
}</span></pre></div>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 5px; background-color: #f5f5f5; padding-left: 5px; padding-right: 5px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 5px" class="cnblogs_code"><font size="3"></font>&nbsp;</div>
<p><a href="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/7410006a494d_D694/%E6%9C%AA%E5%91%BD%E5%90%8D_7.jpg"><font size="3"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="未命名" border="0" alt="未命名" src="http://www.cppblog.com/images/cppblog_com/init/Windows-Live-Writer/7410006a494d_D694/%E6%9C%AA%E5%91%BD%E5%90%8D_thumb_2.jpg" width="665" height="114" /></font></a></p>
<p><font size="3"></font>&nbsp;</p>
<p><font size="3"></font>&nbsp;</p>
<p><font size="3"></font>&nbsp;</p>
<p><font size="3"></font>&nbsp;</p>
<p><font size="3"></font>&nbsp;</p>
<p><font size="3"></font>&nbsp;</p>
<p><font size="3"></font>&nbsp;</p>
<p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br /><br /> state模式很好的实现了对象的状态逻辑和动作分离，状态逻辑分布在state的派生类中实现，而动作实现则可以放在Context类中实现（state派生类中需要有一个Context指针），使得两者的变化相互独立，改变State的状态逻辑可以很容易的服用Context的动作，也可以再不影响state派生类的前提下创建Context的子类来更改或替换动作实现。</font></p>
<p><font size="3">State模式问题主要是逻辑分散化，状态逻辑分布到了各个state 子类中，很难看刀到整个状态逻辑图，带来了代码的维护问题。</font></p><img src ="http://www.cppblog.com/init/aggbug/195023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2012-11-10 19:37 <a href="http://www.cppblog.com/init/archive/2012/11/10/195023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Design.Patterns</title><link>http://www.cppblog.com/init/archive/2012/03/16/168109.html</link><dc:creator>情绝格调(fresmaster)</dc:creator><author>情绝格调(fresmaster)</author><pubDate>Fri, 16 Mar 2012 11:45:00 GMT</pubDate><guid>http://www.cppblog.com/init/archive/2012/03/16/168109.html</guid><wfw:comment>http://www.cppblog.com/init/comments/168109.html</wfw:comment><comments>http://www.cppblog.com/init/archive/2012/03/16/168109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/init/comments/commentRss/168109.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/init/services/trackbacks/168109.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/init/archive/2012/03/16/168109.html'>阅读全文</a><img src ="http://www.cppblog.com/init/aggbug/168109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/init/" target="_blank">情绝格调(fresmaster)</a> 2012-03-16 19:45 <a href="http://www.cppblog.com/init/archive/2012/03/16/168109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>