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经典逻辑编程50题 (转)
    Programmingbydoing
    前端测试框架jest 简介
    puppeteer入门
    面向对象编程
    Java常识
    JS 变量
    jmeter 压力测试
    jmeter 安装
    Java 数据驱动测试
  • 原文地址:https://www.cnblogs.com/OpenLinux/p/5020687.html
Copyright © 2011-2022 走看看