状态模式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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java经典入门教程(java从入门到精通第几版好用)

    刚开始学习java的时候,可能是一头雾水,不知道从何学起,这里跟大家分享一下!(仅仅只供初级学者学习,大佬勿喷)一、初始java1.生活中的程序:从起床到教室上课的过程穿衣打扮》起床》洗漱》出宿舍》》吃早餐》到教室按照特定的顺序去完成某一件事的过程我们叫做生活中的程序2.计算机中的程序:一组有序指令的集合,需要和计算机交流就要使用计算机语言,java就是计算机语言的一种3.java…

    2022年4月16日
    51
  • DeepLab2:用于深度标记的TensorFlow库(2021)

    DeepLab2:ATensorFLowLibraryforDeepLabelingDeepLab2是一个用于深度标注的TensorFlow库,旨在为密集像素标注任务提供统一的、最先进的TensorFlow代码库,包括但不限于语义分割、实例分割、全景分割、深度估计,甚至视频全景分割。深度标记是指通过深度神经网络为图像中的每个像素分配预测值来解决计算机视觉问题。只要感兴趣的问题可以用这种方式表述,DeepLab2就应该达到目的。此外,此代码库包括我们最近的和最先进的深度标签研究模

    2022年4月15日
    47
  • Android中的shell循环命令

    Android中的shell循环命令新建test.txt,写入:i=0;while[$(($i))-le5];doi=$(($i+1));echo$i;done;执行这个文件adbshell<test.txt

    2022年7月24日
    7
  • checkbox选中和不选中 jqu_jquery checkbox 选中不选中「建议收藏」

    checkbox选中和不选中 jqu_jquery checkbox 选中不选中「建议收藏」展开全部$(function(){//动态绑定默认状态//$(“#ck”).attr(“checked”,true)//选中//$(“#ck”).attr(“checked”,false)//未选中//点击判断选中还是未选中$(“#ck”).click(function(){if($(this).is(“:checked”)){alert(“选中”);}else{alert…

    2022年6月30日
    25
  • python 0xff_正在解压缩“0xff”与“\xff”[通俗易懂]

    python 0xff_正在解压缩“0xff”与“\xff”[通俗易懂]我试图用wave库从wave文件中读取二进制数据。数据以’\x0f\x06\x0a…’的形式读取和报告,我想把十六进制数转换成整数(你知道,以10为基数)。我把这些字符当作十六进制字符来处理,但我并没有把这些字符当作十六进制字符来处理。在importwaveimportstructpath=”C:\\directory\\file.wav”file=wave.open(path,’r’)dat…

    2022年6月19日
    31
  • 将oracle端口1521共享_oracle如何开放1521端口

    将oracle端口1521共享_oracle如何开放1521端口如何设置SharedSocket?在注册表:HKEY_LOCAL_MACHINESOFTWAREORACLEHOME0上新建一个字符串值:USE_SHARED_SOCKET=true.如果安装了多个目录,则每个类似的目录都要设置:HKEY_LOCAL_MACHINESOFTWAREORACLEHOMEx(x目录编号)设置后要求重新启动实例(只重启listener发现没有效果)Oracle客户端…

    2022年6月10日
    43

发表回复

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

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