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


相关推荐

  • Jenkins(2)docker容器中安装python3

    Jenkins(2)docker容器中安装python3前言使用docker安装jenkins环境,jenkins构建的workspace目录默认是在容器里面构建的,如果我们想执行python3的代码,需进容器内部安装python3的环境。进jenki

    2022年7月31日
    3
  • fileinput模块读取文件「建议收藏」

    fileinput模块读取文件「建议收藏」fileinput模块可以对一个或多个文件中的内容进行迭代、遍历等操作。该模块的input()函数有点类似文件readlines()方法,区别在于前者是一个迭代对象,需要用for循环迭代,后者是一次性读取所有行。用fileinput对文件进行循环遍历,格式化输出,查找、替换等操作,非常方便。【典型用法】importfileinputforlineinfileinput.input…

    2022年5月5日
    26
  • 序列号生成-模拟windows office序列号[通俗易懂]

    序列号生成-模拟windows office序列号[通俗易懂]最近看到office2013在提示过期问题(升级win10后遗症),就想到模拟下office的激活码。~~起初想到应该简单,最后越试越复杂。所以就记录下,毕竟花费了时间。packagetest;importjava.util.ArrayList;importjava.util.List;importjava.util.Random;publicclas

    2022年10月22日
    0
  • CSS3中如何解决子元素继承父元素的opacity属性[通俗易懂]

    CSS3中如何解决子元素继承父元素的opacity属性[通俗易懂]问题css3中的opacity属性是用来设置div元素的不透明级别的,但是我们往往会遇到因为父级元素设定opacity后,子元素也跟着透明了,但是有时候我们只是想让背景是透明的,这该如何解决呢?错误的示例我们常常想到的方法是直接给子元素的opacity设定为1,如下:<!DOCTYPEhtml><html><head><metacharset=”utf-8″><title>opacity</title&g

    2022年5月20日
    42
  • 网站访问慢-MySQL负载高(实战)

    网站访问慢-MySQL负载高(实战)

    2022年3月3日
    40
  • 从硬盘上安装Fedora12

    从硬盘上安装Fedora12一、引言Fedora12的liveCD:Fedora-12-i686-Live.iso,至今未硬盘安装成功。在引导过程中,报此类错误:[drm:drm_mode_rmfb]triedtoremoveafbthatwedidntown无奈之下,只好下载Fedora12的DVD版:Fedora12-i386-DVD.iso文件比较大,2G多一些。

    2022年9月20日
    0

发表回复

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

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