设计模式的解析和实现(C++)之十七-State模式

作用:

允许一个对象在其内部状态改变时改变它的行为.

UML结构图:

解析:

State模式主要解决的是在开发中时常遇到的根据不同的状态需要进行不同的处理操作的问题,而这样的问题,大部分人是采用switch-case语句进行处理的,这样会造成一个问题:分支过多,而且如果加入一个新的状态就需要对原来的代码进行编译.State模式采用了对这些不同的状态进行封装的方式处理这类问题,当状态改变的时候进行处理然后再切换到另一种状态,也就是说把状态的切换责任交给了具体的状态类去负责.同时,State模式和Strategy模式在图示上有很多相似的地方,需要说明的是两者的思想都是一致的,只不过封装的东西不同:State模式封装的是不同的状态,而Stategy模式封装的是不同的算法.

实现:

1)State.h

/**//********************************************************************
    created:    2006/08/05
    filename:     State.h
    author:        李创
                http://www.cppblog.com/converse/

    purpose:    State模式的演示代码
*********************************************************************/

#ifndef STATE_H
#define STATE_H

class State;

class Context
{
public:
    Context(State* pState);
    ~Context();
    void Request();
    void ChangeState(State *pState);

private:
    State *m_pState;
};

class State
{
public:
    virtual ~State(){}

    virtual void Handle(Context* pContext) = 0;
};

class ConcreateStateA
    : public State
{
public:
    void Handle(Context* pContext);
};

class ConcreateStateB
    : public State
{
public:
    void Handle(Context* pContext);
};

#endif

时间: 2024-08-02 08:10:48

设计模式的解析和实现(C++)之十七-State模式的相关文章

设计模式的解析和实现(C++)之十三-FlyWeight模式

作用: 运用共享技术有效地支持大量细粒度的对象. UML结构图: 解析: Flyweight模式在大量使用一些可以被共享的对象的时候经常使用.比如,在QQ聊天的时候很多时候你懒得回复又不得不回复的时候,一般会用一些客套的话语敷衍别人,如"呵呵","好的"等等之类的,这些简单的答复其实每个人都是提前定义好的,在使用的时候才调用出来.Flyweight就是基于解决这种问题的思路而产生的,当需要一个可以在其它地方共享使用的对象的时候,先去查询是否已经存在了同样的对象,如果

设计模式的解析和实现(C++)之十一-TemplateMethod模式

作用: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.TemplateMethod 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. UML结构图: 抽象基类: 1)AbstractClass:抽象基类,定义算法的轮廓 解析: TemplateMethod 的关键在于在基类中定义了一个算法的轮廓,但是算法每一步具体的实现留给了派生类.但是这样也会造成设计的灵活性不高的缺点,因为轮廓已经定下来了要想改变就比较难了,这也是为什么优先采用聚合而不是继承的原因. 实现: 1)Te

设计模式的解析和实现(C++)之十-Proxy模式

作用: 为其他对象提供一种代理以控制对这个对象的访问. UML结构图: 抽象基类: 1)Subject:定义了Proxy和RealSubject的公有接口,这样就可以在任何需要使用到RealSubject的地方都使用Proxy. 解析: Proxy其实是基于这样一种时常使用到的技术-某个对象直到它真正被使用到的时候才被初始化,在没有使用到的时候就暂时用Proxy作一个占位符.这个模式实现的要点就是Proxy和RealSubject都继承自Subject,这样保证了两个的接口都是一致的. 实现:

设计模式的解析和实现(C++)之九-Decorator模式

作用: 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. UML结构图: 抽象基类: 1)Component:定义一个对象接口,可以为这个接口动态的添加职责. 2)Decorator:维持一个指向Component的指针,并且有一个和Component一致的接口函数.

设计模式 ( 十七) 状态模式State(对象行为型)

设计模式 ( 十七) 状态模式State(对象行为型) 1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的处理.但是对复杂状态的判断就显得"力不从心了".随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱.维护也会很麻烦.那么我就考虑只修改自身状态的

J2EE设计模式之State模式

设计模式,这个概念现在是满天飞,大家手里面估计都有,Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides, in the book "Design Patterns - Element of Re-Useable Object-Oriented Software",这本书.根据其中的说法,有三种,创建型模式.结构型模式和行为型模式.一共包括23个模式,在这里不一一列举.实际应用中,我们不可能在短时间内消化吸收掉,因为模

云计算设计模式(二十二)——静态内容托管模式

云计算设计模式(二十二)--静态内容托管模式 部署静态内容到一个基于云的存储服务,可以直接向客户提供这些.这个模式可以减少潜在的昂贵的计算实例的需求. 景和问题 Web应用程序通常包括静态内容的一些元素.此静态内容可以包括HTML页面和诸如图像和可用到客户端的文件的其他资源,无论是作为一个HTML页的一部分(如嵌入式图像,样式表和客户端JavaScript文件)或作为单独的下载(如PDF文档). 尽管Web服务器以及调整通过有效的动态执行页代码和输出缓存优化的要求,他们仍然必须处理请求下载静态内

设计模式的解析和实现(C++)之十八-Iterator模式

作用: 提供一种方法顺序访问一个聚合对象中各个元素,,而又不需暴露该对象的内部表示. UML结构图: 解析: Iterator几乎是大部分人在初学C++的时候就无意之中接触到的第一种设计模式,因为在STL之中,所有的容器类都有与之相关的迭代器.以前初学STL的时候,时常在看到讲述迭代器作用的时候是这么说的:提供一种方式,使得算法和容器可以独立的变化,而且在访问容器对象的时候不必暴露容器的内部细节,具体是怎么做到这一点的呢?在STL的实现中,所有的迭代器(Iterator)都必须遵照一套规范,这套

设计模式的解析和实现(C++)之一-Factory模式

作用: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.Factory Method 使一个类的实例化延迟到其子类. UML结构图: 抽象基类: 1)Product:创建出来的对象的抽象基类. 2)Factory创建对象的工厂方法的抽象基类. 接口函数: 1)Creator::FactoryMethod:纯虚函数,由派生类实现,创建出对应的Product. 解析: 在这个模式中,有两个抽象基类,一个是Product为创建出来的对象的抽象基类,一个是Factory是工厂的抽象基类,在互相协作