广告
返回顶部
首页 > 资讯 > 精选 >如何理解Java设计模式的状态模式
  • 137
分享到

如何理解Java设计模式的状态模式

2023-06-25 13:06:54 137人浏览 泡泡鱼
摘要

本篇内容介绍了“如何理解Java设计模式的状态模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是状态模式定义:当一个对象的内在状态

本篇内容介绍了“如何理解Java设计模式的状态模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、什么是状态模式

定义:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

主要解决:当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。

意图:允许一个对象在其内部状态改变时改变它的行为

二、状态模式的结构

如何理解Java设计模式的状态模式

在该类图中,我们看到三个角色:

(1)Context: 环境类,定义客户感兴趣的接口,维护一个State子类的实例,这个实例对应的是对象当前的状态。

(2)State:抽象状态类或者状态接口,定义一个或者一组行为接口,表示该状态下的行为动作。

(3)ConcreteState: 具体状态类,实现State抽象类中定义的接口方法,从而达到不同状态下的不同行为。

三、状态模式的使用场景

一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。

一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

例子:我们在微博上看到一篇文章,觉得还不错,于是想评论或者转发,但如果用户没有登录,这个时候就会先自动跳转到登录注册界面,如果已经登录,当然就可以直接评论或者转发了。这里我们可以看到,我们用户的行为是由当前是否登录这个状态来决定的,这就是典型的状态模式情景。

当然还包括很多其他动作,例如转发、分享、打赏等等,都要重复判断状态才行,如果程序随着需求的改动或者功能逻辑的增加需要修改代码,那么你只要遗漏了一个判断,就会出问题。

而使用状态模式,可以很好地避免过多的if–else –分支,状态模式将每一个状态分支放入一个独立的类中,每一个状态对象都可以独立存在,程序根据不同的状态使用不同的状态对象来实现功能。

四、状态模式和策略模式对比

如果我们在编写代码的时候,遇到大量的条件判断的时候,可能会采用策略模式来优化结构,因为这时涉及到策略的选择,但有时候仔细查看下,就会发现,这些所谓的策略其实是对象的不同状态,更加明显的是,对象的某种状态也成为判断的条件。

策略模式的Context含有一个Strategy的引用,将自身的功能委托给Strategy来完成。

我们把Strategy接口改个名字为State,这就是状态模式了,同样Context也有一个State类型的引用,也将自己的部门功能委托给State来完成。

要使用状态模式,我们必须明确两个东西:状态和每个状态下执行的动作。

在状态模式中,因为所有的状态都要执行相应的动作,所以我们可以考虑将状态抽象出来。

状态的抽象一般有两种形式:接口和抽象类。如果所有的状态都有共同的数据域,可以使用抽象类,但如果只是单纯的执行动作,就可以使用接口。

他们之间真正的区别在策略模式对Strategy的具体实现类有绝对的控制权,即Context要感知Strategy具体类型。而状态模式,Context不感知State的具体实现,Context只需调用自己的方法,这个调用的方法会委托给State来完成,State会在相应的方法调用时,自动为Context设置状态,而这个过程对Context来说是透明的,不被感知的。

五、状态模式的优缺点

优点:

封装了转换规则。

枚举可能的状态,在枚举状态之前需要确定状态种类。

将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。

允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。

可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。

缺点:

状态模式的使用必然会增加系统类和对象的个数。

状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。

状态模式对“开闭原则”的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态;而且修改某个状态类的行为也需修改对应类的源代码。

六、状态模式的实现

抽象状态类,定义一个接口以封装与Context类(Work)的一个特定状态相关的行为。

public abstract class State{    public abstract void WriteProgram(Work w);}

工作状态类,每一个子类实现一个与Context类(Work)的一个状态相关的行为。

//上午工作状态public class ForeNoonState : State{    public override void WriteProgram(Work w)    {        if (w.Hour < 12)        {            Console.WriteLine("当前时间:{0}点,上午工作,精神百倍", w.Hour);        }        else        {            //超过12点,则转入中午工作状态            w.SetState(new NoonState());            w.WriteProgram();        }    }}
//中午工作状态public class NoonState : State{    public override void WriteProgram(Work w)    {        if (w.Hour < 13)        {            Console.WriteLine("当前时间:{0}点,吃午饭,午休", w.Hour);        }        else        {            //超过13点,则转入下午工作状态            w.SetState(new AfterNoonState());            w.WriteProgram();        }    }}
//下午工作状态public class AfterNoonState : State{    public override void WriteProgram(Work w)    {        if (w.Hour < 17)        {            Console.WriteLine("当前时间:{0}点,下午工作,继续努力", w.Hour);        }        else        {            //超过17点,则转入晚上工作状态            w.SetState(new EveningState());            w.WriteProgram();        }    }}
//晚上工作状态public class EveningState : State{    public override void WriteProgram(Work w)    {        if (w.Finish)        {            //如果状态已完成,则转入下班状态            w.SetState(new RestState());            w.WriteProgram();        }        else        {            if (w.Hour < 21)            {                Console.WriteLine("当前时间:{0}点,加班", w.Hour);            }            else            {                //超过21点,则转入睡眠工作状态                w.SetState(new SleepingState());                w.WriteProgram();            }        }    }}
//睡眠工作状态public class SleepingState : State{    public override void WriteProgram(Work w)    {        Console.WriteLine("当前时间:{0}点,睡觉", w.Hour);    }}//下班休息状态public class RestState : State{    public override void WriteProgram(Work w)    {        Console.WriteLine("当前时间:{0}点,下班", w.Hour);    }}

工作类,Context类,维护一个ConcreteState子类(工作状态类)的实例,这个实例定义当前的状态

public class Work{    private State current;    public Work()    {        //工作初始化为上午工作状态        current = new ForeNoonState();    }    //“钟点”属性,状态转换的依据    private double hour;    public double Hour    {        get { return hour; }        set { hour = value; }    }    //“任务完成”属性,是否能下班的依据    private bool finish = false;    public bool Finish    {        get { return finish; }        set { finish = value; }    }     public void SetState(State s)    {        current = s;    }     public void WriteProgram()    {        current.WriteProgram(this);    }}

客户端代码

class Program{    //客户端代码    static void Main(string[] args)    {        Work w = new Work();        w.Hour = 9;        w.WriteProgram();        w.Hour = 10;        w.WriteProgram();        w.Hour = 12;        w.WriteProgram();        w.Hour = 13;        w.WriteProgram();        w.Hour = 14;        w.WriteProgram();        w.Hour = 17;         w.Finish = false;        //w.Finish = true;        w.WriteProgram();        w.Hour = 19;        w.WriteProgram();        w.Hour = 22;        w.WriteProgram();         Console.Read();    }}

结果

当前时间:9点,上午工作,精神百倍
当前时间:10点,上午工作,精神百倍
当前时间:12点,吃午饭,午休
当前时间:13点,下午工作,继续努力
当前时间:14点,下午工作,继续努力
当前时间:17点,加班
当前时间:19点,加班
当前时间:22点,睡觉

“如何理解Java设计模式的状态模式”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 如何理解Java设计模式的状态模式

本文链接: https://www.lsjlt.com/news/305025.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何理解Java设计模式的状态模式
    本篇内容介绍了“如何理解Java设计模式的状态模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是状态模式定义:当一个对象的内在状态...
    99+
    2023-06-25
  • 深入理解Java设计模式之状态模式
    目录一、什么是状态模式二、状态模式的结构三、状态模式的使用场景四、状态模式和策略模式对比五、状态模式的优缺点六、状态模式的实现七、总结一、什么是状态模式 定义:当一个对象的内在状态改...
    99+
    2022-11-12
  • Java设计模式之状态模式详解
    目录1. 状态模式的概述2. 状态模式的结构与实现3. 状态模式的优缺点4. 状态模式的适用场景5. 示例程序的设计与实现1. 状态模式的概述 状态模式是一种通过将对象的状态转换逻辑...
    99+
    2023-05-20
    Java 状态模式 Java 设计模式
  • Java设计模式之java状态模式详解
    目录状态模式的结构状态模式的角色 示例代码适用场景投票案例认识状态模式状态和行为行为的平行性环境和状态处理对象状态模式优点状态模式的缺点状态模式和策略模式对比参考文章 总结...
    99+
    2022-11-12
  • Java设计模式之状态模式
    实际开发中订单往往都包含着订单状态,用户每进行一次操作都要切换对应的状态,而每次切换判断当前的状态是必须的,就不可避免的引入一系列判断语句,为了让代码更加清晰直观,我们引入今天的主角...
    99+
    2022-11-13
    Java 设计模式 状态模式
  • Java设计模式之状态模式StatePattern详解
    目录概述UML类图状态模式与策略模式谁决定状态转换的流向State是接口还是抽象类应用案例分析状态抽象类可以抽奖的状态奖品发放完毕状态发放奖品的状态不能抽奖状态抽奖活动(Contex...
    99+
    2022-11-13
    Java状态模式 Java State Pattern
  • java设计模式之状态模式的示例分析
    这篇文章给大家分享的是有关java设计模式之状态模式的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 定义 很多时候,一个对象的行为会根据一个动态的属性变化而变化,这...
    99+
    2022-10-19
  • 设计模式手册之状态模式
    1. 什么是“状态模式”? 状态模式:对象行为是基于状态来改变的。 内部的状态转化,导致了行为表现形式不同。所以,用户在外面看起来,好像是修改了行为。 Webpack4系列教程(17篇) + 设计模式手册(16篇):GitHub地址 博客...
    99+
    2023-01-31
    模式 状态 手册
  • JavaScript设计模式之命令模式和状态模式详解
    目录命令模式命令模式介绍代码实现状态模式状态模式介绍代码实现小结命令模式 命令模式介绍 命令模式(Command)的定义是:用于将一个请求封装成一个对象,从而使你可用不同的请求对客户...
    99+
    2022-11-13
  • Python设计模式中的状态模式你了解吗
    目录状态模式应用场景代码示例总结状态模式 状态模式,当对象的内部状态发生了改变的时候,允许对象执行不同的流程。 优点: 封装了状态转换规则。枚举了可能的状态,在枚举状态之前需要确定...
    99+
    2022-11-13
  • 【深入浅出设计模式--状态模式】
    深入浅出设计模式--状态模式 一、背景二、问题三、解决方案四、 适用场景总结五、后记 一、背景 状态模式是一种行为设计模式,让你能在一个对象的内部状态变化时改变其行为,使其看上去就像改变了自身所属的类一样。其与有限状态机的概念紧...
    99+
    2023-08-30
    c++ 设计模式 状态模式 单例模式
  • 如何理解Java设计模式的解释器模式
    本篇内容主要讲解“如何理解Java设计模式的解释器模式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Java设计模式的解释器模式”吧!一、什么是解释器模式定义:给定一个语言,定义一个文法...
    99+
    2023-06-25
  • 如何理解Java设计模式的命令模式
    本篇内容主要讲解“如何理解Java设计模式的命令模式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Java设计模式的命令模式”吧!一、什么是命令模式命令模式是一个高内聚的模式,其定义为:...
    99+
    2023-06-25
  • 如何理解Java设计模式的享元模式
    本篇内容介绍了“如何理解Java设计模式的享元模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、引言大家都知道单例模式,通过一个全局变量...
    99+
    2023-06-25
  • 如何理解Java设计模式的组合模式
    这篇文章主要介绍“如何理解Java设计模式的组合模式”,在日常操作中,相信很多人在如何理解Java设计模式的组合模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java设计模式的组合模式”的疑惑有所...
    99+
    2023-06-25
  • 如何理解Java设计模式的桥接模式
    这篇文章主要讲解了“如何理解Java设计模式的桥接模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解Java设计模式的桥接模式”吧!一、什么是桥接模式桥接模式(Bridge Patt...
    99+
    2023-06-25
  • 如何理解Java设计模式的装饰模式
    这篇文章主要介绍“如何理解Java设计模式的装饰模式”,在日常操作中,相信很多人在如何理解Java设计模式的装饰模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java设计模式的装饰模式”的疑惑有所...
    99+
    2023-06-25
  • 如何理解Java设计模式的单例模式
    这篇文章主要讲解了“如何理解Java设计模式的单例模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解Java设计模式的单例模式”吧!一、什么是单例模式单例模式是一种常用的软件设计模式...
    99+
    2023-06-25
  • Python设计模式中的状态模式是什么
    这篇文章将为大家详细讲解有关Python设计模式中的状态模式是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。状态模式状态模式,当对象的内部状态发生了改变的时候,允许对象执行不同的流程。优点:封装了状态...
    99+
    2023-06-29
  • 如何理解Java设计模式的职责链模式
    本篇内容介绍了“如何理解Java设计模式的职责链模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是职责链模式客户端发出一个请求,链...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作