行为设计模式 - 状态设计模式

状态设计模式是行为设计​​模式之一。当Object根据其内部状态更改其行为时,将使用状态设计模式。

目录[ 隐藏 ]

  • 1国家设计模式

    • 1.1状态设计模式接口
    • 1.2国家设计模式具体国家实施
    • 1.3状态设计模式上下文实现
    • 1.4国家设计模式测试计划
    • 1.5国家设计模式的好处

状态设计模式

如果我们必须根据对象的状态更改对象的行为,我们可以在Object中有一个状态变量。然后使用if-else条件块根据状态执行不同的操作。状态设计模式用于提供系统的和松散耦合的方式来实现这一点ContextState实现。

状态模式上下文是具有State引用的一个类的具体实现。Context将请求转发给状态对象进行处理。让我们用一个简单的例子来理解这一点。

假设我们想用一个简单的按钮来实现TV Remote,以执行操作。如果状态为ON,它将打开电视,如果状态为OFF,它将关闭电视。

我们可以使用if-else条件来实现它,如下所示;

TVRemoteBasic.java


package com.journaldev.design.state;public class TVRemoteBasic {private String state="";public void setState(String state){this.state=state;}public void doAction(){if(state.equalsIgnoreCase("ON")){System.out.println("TV is turned ON");}else if(state.equalsIgnoreCase("OFF")){System.out.println("TV is turned OFF");}}public static void main(String args[]){TVRemoteBasic remote = new TVRemoteBasic();remote.setState("ON");remote.doAction();remote.setState("OFF");remote.doAction();}}

请注意,客户端代码应该知道用于设置远程状态的特定值。此外,如果状态数量增加,那么实现和客户端代码之间的紧密耦合将非常难以维护和扩展。

现在我们将使用State模式来实现上面的TV Remote示例。

状态设计模式接口

首先,我们将创建State接口,该接口将定义应由不同的具体状态和上下文类实现的方法。

State.java


package com.journaldev.design.state;public interface State {public void doAction();
}

状态设计模式 具体实现

在我们的示例中,我们可以有两种状态 - 一种用于打开电视,另一种用于关闭电视。因此,我们将为这些行为创建两个具体的状态实现。

TVStartState.java


package com.journaldev.design.state;public class TVStartState implements State {@Overridepublic void doAction() {System.out.println("TV is turned ON");}}

TVStopState.java


package com.journaldev.design.state;public class TVStopState implements State {@Overridepublic void doAction() {System.out.println("TV is turned OFF");}}

现在我们准备实现我们的Context对象,它将根据其内部状态改变其行为。

状态设计模式上下文实现

TVContext.java


package com.journaldev.design.state;public class TVContext implements State {private State tvState;public void setState(State state) {this.tvState=state;}public State getState() {return this.tvState;}@Overridepublic void doAction() {this.tvState.doAction();}}

请注意,Context还实现State并保留其当前状态的引用,并将请求转发给状态实现。

状态设计模式测试计划

现在让我们编写一个简单的程序来测试TV Remote的状态模式实现。

TVRemote.java


package com.journaldev.design.state;public class TVRemote {public static void main(String[] args) {TVContext context = new TVContext();State tvStartState = new TVStartState();State tvStopState = new TVStopState();context.setState(tvStartState);context.doAction();context.setState(tvStopState);context.doAction();}}

上述程序的输出与TV Remote的基本实现相同,不使用状态模式。

状态设计模式的好处

使用State模式实现多态行为的好处显而易见。错误的可能性较小,并且很容易为其他行为添加更多状态。从而使我们的代码更加健壮,易于维护和灵活。在这种情况下,状态模式也有助于避免if-else或switch-case条件逻辑。

State Pattern与Strategy Pattern非常相似,请查看Java中的Strategy Pattern

这就是java中的状态设计模式,我希望你喜欢它。

转载来源:https://www.journaldev.com/1751/state-design-pattern-java

行为设计模式 - 状态设计模式相关推荐

  1. java设计模式之状态模式_Java中的状态设计模式

    java设计模式之状态模式 在本教程中,我们将探讨另一种流行的行为设计模式-状态设计模式. 当我们使用可以存在于多个状态的对象时,状态设计模式的知识变得非常有用. 当对象的行为取决于其当前状态时,我们 ...

  2. 设计模式示例_状态设计模式示例

    设计模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因 ...

  3. Java中的状态设计模式

    在本教程中,我们将探讨另一种流行的行为设计模式-状态设计模式. 当我们使用可以存在于多个状态的对象时,状态设计模式的知识变得非常有用. 当对象的行为取决于其当前状态时,我们应该主要使用它. 这种模式有 ...

  4. Python设计模式-状态模式

    Python设计模式-状态模式 代码基于3.5.2,代码如下; #coding:utf-8 #状态模式class state():def writeProgram(self,work):raise N ...

  5. Java 设计模式——状态模式

    概述 很多人在说状态模式的时候总拿策略模式来进行对比,可能他们的类图会有一点类似,可我却不认为他们有多么相像.你可以阅读<Java设计模式--策略模式>这篇博客,并与本文对比,以找到蛛丝马 ...

  6. java 设计模式 示例_Java中的状态设计模式–示例教程

    java 设计模式 示例 状态模式是行为设计模式之一 . 当对象根据其内部状态更改其行为时,将使用状态设计模式. 如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件 ...

  7. 状态模式 设计模式_设计模式:状态

    状态模式 设计模式 本文将介绍状态设计模式 . 它是行为设计模式之一 . 您无需了解许多理论即可了解模式的主要概念. 该文章将分为几个部分,在其中我将提供有关需要应用该模式的情况,它所具有的利弊以及用 ...

  8. Java中的状态设计模式–示例教程

    状态模式是行为设计模式之一 . 当对象根据其内部状态更改其行为时,将使用状态设计模式. 如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件块根据状态执行不同的操作. ...

  9. 设计模式状态模式uml_UML的完整形式是什么?

    设计模式状态模式uml UML:统一建模语言 (UML: Unified Modeling Language) UML is an abbreviation of Unified Modeling L ...

最新文章

  1. 接口测试工具_接口测试工具Jmeter与postman - 瞎扯
  2. 设计模式的理解: 访问器模式 Visitor
  3. php笔记之echo/print比较
  4. 做过CC1020的苦逼前人告诉你(分拿来)
  5. Win10蓝牙鼠标老是断连卡顿的解决方法
  6. static关键字作用总结
  7. EIGRP passive-interface
  8. Revisiting Domain Generalized Stereo Matching Networks from a FeatureConsistency Perspective
  9. 专注物联网人工智能服务 云知声芯起航
  10. 计算机组成原理符号标志,计算机组成原理之数据的表示及运算
  11. 今年能不能回家全靠这3个抢票工具了|2022版
  12. 【Coursera-Machine Learning】自用5
  13. 冷静 仔细 认真 分析
  14. cross_camera muti-target tracking项目
  15. 解析G652,G657A,G655和G654光缆之间的区别
  16. 洛谷 P1413 坚果保龄球
  17. 异次元发卡网邮箱SMTP配置教程
  18. ubuntu18.04美化主题(完整版)
  19. C# MQTT(MQTTnet)客户端
  20. From Seeing to Moving: A Survey on Learning for Visual Indoor Navigation (VIL)

热门文章

  1. Moodl:集成密码,消除错误phpCAS error: phpCAS::client(): type mismatched for parameter $se
  2. JS操作iframe里的dom
  3. PHP实现单件模式的几种方式
  4. node.js——麻将算法(七)简易版麻将出牌AI2.0
  5. 机器学习降维算法一:PCA (Principal Component Analysis)
  6. centos安装python3.7详细过程 2020
  7. 设置虚拟机上的redis可以被windows的环境下的python访问连接
  8. python-循环的入门
  9. 索引-python编程技术-第二版
  10. PHP设计模式之建造者模式