状态模式state_迭代器模式

状态模式state_迭代器模式状态模式 State动机模式定义实例结构要点总结笔记动机在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能不同.如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转换之间引入紧耦合模式定义允许一个对象在其内部状态改变时改变它的行为.从而使对象看起来似乎修改了其行为.从而使对象看起来似乎修改了其行为.从而使对象看起来似乎修改了其行为.实例朴素根据状态来执行下一步enum NetworkStat

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

动机

在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可能不同.

如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转换之间引入紧耦合

模式定义

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

实例

朴素
根据状态来执行下一步

enum NetworkState{ 
   
    Network_Open,
    Network_Close,
    Network_Connect
}

class NetworkProcessor{ 
   
    NetworkState state;
public:
    void Opration1(){ 
   
        if(state == Network_Open){ 
   
            //******
            state = Network_Close;
        }
        else if(state == Network_Close){ 
   
            //.....
            state = Network_Connect;
        }
        else if(state == Network_Connect){ 
   
            //$$$$$
            state = Network_Open;
        }
    }
    void Opration2(){ 
   
        if(state == Network_Open){ 
   
            //******
            state = Network_Connect;
        }
        else if(state == Network_Close){ 
   
            //.....
            state = Network_Open;
        }
        else if(state == Network_Connect){ 
   
            //$$$$$
            state = Network_Close;
        }
    }
    void process3(){ 
   //...}
}

状态模式State

enum NetworkState{ 
   
public:
    NetworkState *pNext;
    virtual void Operation1() = 0;
    virtual void Operation2() = 0;
    virtual void Operatino3() = 0;

    virtual ~NetworkState(){ 
   }
}

class OpenState : public NetworkState{ 
   
    static NetworkState* m_instance;
public:
    static NetworkState* getInstance(){ 
   
        if(m_instance == nullptr){ 
   
            return m_instance;
        }
    }
    void Operation1(){ 
   
        //*******
        pNext = CloseState::getInstance();
    }
    void Operation2(){ 
   
        //........
        pNext = ConnectState::getInstance();
    }
    void Operation3(){ 
   
        //$$$$$$$$
        pNext = NextworkOpen::getInstance();
    }
}
class CloseState : public NetworkState{ 
   //...}

//扩展状态
class WaitState : public NetworkState{ 
   //...}
class NetworkProcessor{ 
   
    NetworkState* pState;
public:
    NetworkProcessor(NetworkState *pstate){ 
   
        this->pState;
    }
    void Opration1(){ 
   
        //....
        pState->Operation1();
        pState = pState->pNext();
        //...
    }
    void Opration2(){ 
   
        //....
        pState->Operation2();
        pState = pState->pNext();
        //..
    }
    void process3(){ 
   
        //....
        pState->Operation3();
        pState = pState->pNext();
        //..
    }
}

结构

在这里插入图片描述

要点总结

  • State模式将所有与一个特定状态相关的行为都放入一个State的子类对象中,在对象状态切换时,切换相应的对象;但同时维持State的接口,这样实现了具体操作与状态转换之间的解耦

笔记

  • 跟Strategy模式很像
  • if else 再添加else变更的时候违背了开闭原则
  • State设计模式当状态中只有一个行为的时候跟strategy基本一样
  • 很多模式其实很像 甚至可以把状态模式和Strategy模式看成一个模式
  • 具体什么模式没那么重要 主要是思想
  • 把所有和状态有关的操作都转换为装填对象的行为
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169034.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm 安装包出现超时错误 解决方案

    pycharm 安装包出现超时错误 解决方案错误代码Retrying(Retry(total=4,connect=None,read=None,redirect=None,status=None))afterconnectionbrokenby’ReadTimeoutError("HTTPSConnectionPool(host=’pypi.org’,port=443):Readtimedout.(read…

    2022年5月13日
    81
  • SQL新手学习

    SQL新手学习1.什么是SQLSQL(英文全称:StructuredQueryLanguage)是结构化查询语言,专门用来访问和处理数据库的编程语言。能够让我们以编程的形式,操作数据库里面的数据。三个关键点:①    SQL是一门数据库编程语言②    使用SQL语言编写出来的代码,叫做SQL语句③    SQL语言只能在关系型数据库中使用(例如MySQL、Oracle

    2022年8月20日
    4
  • Java程序设计(基础)- 基本语法

    Java程序设计(基础)- 基本语法

    2021年7月21日
    49
  • 从零和使用mxnet实现dropout

    需求:从零和使用mxnet实现dropout数据集:使用load_digits()手写数字数据集要求:使用1个掩藏层n_hidden1=36,激活函数为relu,损失函数为softmax

    2021年12月30日
    43
  • hexdump -C_linux生成dump

    hexdump -C_linux生成dump描述:hexdump命令一般用来查看”二进制”文件的十六进制编码,从手册上查看,其查看的内容还要很多,诸如:ascii,decimal,hexadecimal,octal参数:hexdump[-bcCdovx][-eformat_string][-fformat_file][-nlength][-sskip]file示例:新增一个文本文件,在test文本中添加如下内容:…

    2022年9月21日
    2
  • goland 2020 激活码_通用破解码

    goland 2020 激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    221

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号