状态模式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/168502.html原文链接:https://javaforall.net

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


相关推荐

  • Canny边缘检测及C++实现「建议收藏」

    Canny边缘检测及C++实现「建议收藏」Canny边缘检测算法是澳大利亚科学家JohnF.Canny在1986年提出来的,不得不提一下的是当年JohnCanny本人才28岁!到今天已经30年过去了,Canny算法仍然是图像边缘检测算法中最经典有效的算法之一。一起睹一下大家芳容:JohnCanny研究了最优边缘检测方法所需的特性,给出了评价边缘检测性能优劣的3个指标:1 好的信噪比,即将非边缘点判定为

    2022年5月30日
    40
  • 如何使用keil 5 编写 51单片机 工程

    如何使用keil 5 编写 51单片机 工程目前我们通常编写51程序使用的是keil4,而好多编写STM32等单片机程序的使用keil5。那么如何在keil5中兼容51和STM32程序编写,省去切换版本的繁琐呢?很简单只需两步就可以完成。下面这个方法针对已破解keil5的stm32等一系列。这个肯定是最常见的,因为破解keil5然后编写32工程的教程一大把。1、首先下载编写51的相关东西。可以在官网上下载,例如百度keil官

    2022年5月24日
    50
  • Python实现自动发送邮件(详解)

    Python实现自动发送邮件(详解)Python实现自动发送邮件1.开启SMTP服务为了实现自动发送邮件的目的,我们需要在邮箱中开启SMTP服务:这点很关键,别忘了去开启SMTP,别忘了去开启SMTP,否则邮件是无法发送成功的。然后你还需要点击下面生成授权码,这个授权码才是使用Python发送邮件时的真正密码。2.python发邮件需要掌握两个模块smtplib和email,这俩模块是python自带的,只需import即可使用。smtplib模块主要负责发送邮件,email模块主要负责构造邮件。smtplib模块主要

    2025年7月20日
    2
  • sql语句的各种模糊查询语句

    sql语句的各种模糊查询语句一般模糊语句如下:SELECT字段FROM表WHERE某字段Like条件其中关于条件,SQL提供了四种匹配模式:1、%:表示任意0个或多个字符。可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。比如SELECT*FROM[user]WHEREu_nameLIKE‘%三%’将会把u_name为“张三”,“张猫三”、“三脚猫”,“唐三藏”等等有“

    2022年5月13日
    48
  • oracle维护服务 oracle解决方案 oracle售后服务

    oracle维护服务 oracle解决方案 oracle售后服务为客户提供的oracle金牌技术服务内容为:1.电话服务(7*24)热线支持电话800-810-0081每周7天,每天24小时北京技术支持中心每天都有专人值守。以保证及时与客户沟通。以最快的

    2022年8月3日
    9
  • oracle12.2灵异的ORA-01017: invalid username/password; logon denied[通俗易懂]

    oracle12.2灵异的ORA-01017: invalid username/password; logon denied[通俗易懂]今天研发一台数据库,我需要做个物理备份,出现一个灵异的错oracle@kungpeng-sk-db01[/oracle/product/122/dbs]$sqlplus/assysdbaSQL*Plus:Release12.2.0.1.0ProductiononFriOct1219:11:182018Copyright(c)1982,2016,Orac…

    2022年5月31日
    186

发表回复

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

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