zoukankan      html  css  js  c++  java
  • 状态(state)模式

    意图:

    允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

    适用情形:

    1)      一个对象的行为取决于它的状态,并且它必须在运行时刻改变它的状态。

    2)      一个操作中含有庞大的多分支条件语句,且这些分支依赖于对象的状态。这个状态通常用一个或多个枚举常量表示。State模式将每一个条件分支放入一个独立的类中,这使得你可以根据对象自身的情况将对象的状态作为一个对象,然后执行相关的操作。

    效果:

    1)      将不同状态的行为分割开来,方便于实现

    2)      state对象可以被共享

    3)      使得状态转换显示化(需要清楚知道状态转换的条件,如增加对象的话,就需要调整转换逻辑)

    典型例子:

             如对象的状态处理机,先经历start状态,然后到PreProcess状态(预处理),再到Process状态,最后到end状态。其中某个环节出错了都可能直接跳转到end状态。

    UML图:


    代码示例(伪代码):

    class Context
    {
    public:
             void changeState(State *state){
                       if(state) {delete state;}
                       state= new State();    //或者使用单例,这时不需要释放
             }
    private:
             State*state;
    };
    class AbstractState()
    {
    public:
             void handle(Context *) = 0;
    };
    class StartState(): public AbstractState
    {
    public:
             //在处理中会切换状态,如context->changeState(new PreProcess ());
             void handle(Context *context) { …}    
    };
    class EndState(): public AbstractState
    {
             public:
             void handle(Context *) { …};
    }
    class PreProcessState;  //代码同前
    class ProcessState;
     
    //处理时
    void Request()
    {
             //伪代码而言,取决于实际实现的判断
             while(typeinfo(state).name()!= “EndState”)
                      state->handle(this); 
    } 

    p.s:如果Context实现为单例且state是public成员,这时候状态的处理无需传入Context指针,可以通过类的getInstance方法直接获取指针进行状态转换。

  • 相关阅读:
    java 九个预定义Class对象
    Android github上开源项目、酷炫的交互动画和视觉效果地址集合
    Axure多人协作
    尺取法
    android binder 机制二(client和普通server)
    11-11前的电商
    用minGW编译ffmpeg(供替换opencv中引用的ffmpeg库)
    设计模式_状态模式
    六句代码实现对文件按时间的重命名,
    在QML应用中实现threading多任务
  • 原文地址:https://www.cnblogs.com/OpenLinux/p/5020687.html
Copyright © 2011-2022 走看看