状态模式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模式看成一个模式
  • 具体什么模式没那么重要 主要是思想
  • 把所有和状态有关的操作都转换为装填对象的行为
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • vector subscript out of range数组下标越界错误「建议收藏」

    vector subscript out of range数组下标越界错误「建议收藏」在使用vector二维数组时,产生vectorsubscriptoutofrange错误,检查之后并没有发现数组下标越界问题,百度了一下,发现原来是数组并没有初始化赋值,没有分配空间,所以不能采用下标的方式进行访问。解决方法有两个,一个是初始化数组的时候为其分配空间,其值全部赋值为0。vector<vector<int>>myvec(n,vector<int>(n,0));另一个就是使用vector.push_back添加元素,不使用下

  • 王者荣耀语音文件下载

    王者荣耀语音文件下载

  • 基于stm32蓝牙智能小车设计

    基于stm32蓝牙智能小车设计前言:本文描述了一个由STM32微处理器、步进电机、蓝牙,L298N等模块构成的。该系统采用STM32微处理器为核心,在MDK环境下进行编程,通知控制L298N模块IN1~IN4引脚的高低电平进而控制电机的转动方向,使小车产生不同的转动模式。控制小车的转动模式通过蓝牙模块来实现,利用手机蓝牙助手和蓝牙模块相通,进而控制小车的各种运转模式。代码、蓝牙Androidapk地址:https://g…

    2022年10月18日
  • 单调队列详解

    单调队列详解刚学单调队列时,在网上各大博客找文章学,说实话,写得很杂,表示自己懵逼了些许,最后硬是啃出来了,所以我决定要写一篇能让大部分人都看懂的博客来。说单调队列,那我们就先说说这个单调队列是个什么物种。单调队列从字面上看,无非就是有某种单调性的队列,没错,这就是所谓的单调队列。单调队列它分两种,一种是单调递增的,另外一种是单调递减的。在这搬出百度百科的解释:不断地向缓存数组里读入元素,也不时地去掉最老的…

  • ext.apply()_函数evaluate的应用

    ext.apply()_函数evaluate的应用转载网址:http://www.cnblogs.com/yin-jingyu/archive/2011/07/30/2122176.htmlapply的用法:    Ext中apply及applyIf方法的应用apply及applyIf方法都是用于实现把一个对象中的属性应用于另外一个对象中,相当于属性拷贝。不同的是apply将会覆盖目标对象中的属性,而apply

  • html 转 js_json转html

    html 转 js_json转html/*1.用浏览器内部转换器实现html转码*/functionhtmlEncode(html){//1.首先动态创建一个容器标签元素,如DIVvartemp=document.createElement(“div”);//2.然后将要转换的字符串设置为这个元素的innerText(ie支持…

发表回复

您的电子邮箱地址不会被公开。

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