行为设计模式 - 状态设计模式
行为设计模式 - 状态设计模式
状态设计模式是行为设计模式之一。当Object根据其内部状态更改其行为时,将使用状态设计模式。
目录[ 隐藏 ]
- 1国家设计模式
- 1.1状态设计模式接口
- 1.2国家设计模式具体国家实施
- 1.3状态设计模式上下文实现
- 1.4国家设计模式测试计划
- 1.5国家设计模式的好处
状态设计模式
如果我们必须根据对象的状态更改对象的行为,我们可以在Object中有一个状态变量。然后使用if-else条件块根据状态执行不同的操作。状态设计模式用于提供系统的和松散耦合的方式来实现这一点Context
和State
实现。
状态模式上下文是具有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
行为设计模式 - 状态设计模式相关推荐
- java设计模式之状态模式_Java中的状态设计模式
java设计模式之状态模式 在本教程中,我们将探讨另一种流行的行为设计模式-状态设计模式. 当我们使用可以存在于多个状态的对象时,状态设计模式的知识变得非常有用. 当对象的行为取决于其当前状态时,我们 ...
- 设计模式示例_状态设计模式示例
设计模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因 ...
- Java中的状态设计模式
在本教程中,我们将探讨另一种流行的行为设计模式-状态设计模式. 当我们使用可以存在于多个状态的对象时,状态设计模式的知识变得非常有用. 当对象的行为取决于其当前状态时,我们应该主要使用它. 这种模式有 ...
- Python设计模式-状态模式
Python设计模式-状态模式 代码基于3.5.2,代码如下; #coding:utf-8 #状态模式class state():def writeProgram(self,work):raise N ...
- Java 设计模式——状态模式
概述 很多人在说状态模式的时候总拿策略模式来进行对比,可能他们的类图会有一点类似,可我却不认为他们有多么相像.你可以阅读<Java设计模式--策略模式>这篇博客,并与本文对比,以找到蛛丝马 ...
- java 设计模式 示例_Java中的状态设计模式–示例教程
java 设计模式 示例 状态模式是行为设计模式之一 . 当对象根据其内部状态更改其行为时,将使用状态设计模式. 如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件 ...
- 状态模式 设计模式_设计模式:状态
状态模式 设计模式 本文将介绍状态设计模式 . 它是行为设计模式之一 . 您无需了解许多理论即可了解模式的主要概念. 该文章将分为几个部分,在其中我将提供有关需要应用该模式的情况,它所具有的利弊以及用 ...
- Java中的状态设计模式–示例教程
状态模式是行为设计模式之一 . 当对象根据其内部状态更改其行为时,将使用状态设计模式. 如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件块根据状态执行不同的操作. ...
- 设计模式状态模式uml_UML的完整形式是什么?
设计模式状态模式uml UML:统一建模语言 (UML: Unified Modeling Language) UML is an abbreviation of Unified Modeling L ...
最新文章
- 接口测试工具_接口测试工具Jmeter与postman - 瞎扯
- 设计模式的理解: 访问器模式 Visitor
- php笔记之echo/print比较
- 做过CC1020的苦逼前人告诉你(分拿来)
- Win10蓝牙鼠标老是断连卡顿的解决方法
- static关键字作用总结
- EIGRP passive-interface
- Revisiting Domain Generalized Stereo Matching Networks from a FeatureConsistency Perspective
- 专注物联网人工智能服务 云知声芯起航
- 计算机组成原理符号标志,计算机组成原理之数据的表示及运算
- 今年能不能回家全靠这3个抢票工具了|2022版
- 【Coursera-Machine Learning】自用5
- 冷静 仔细 认真 分析
- cross_camera muti-target tracking项目
- 解析G652,G657A,G655和G654光缆之间的区别
- 洛谷 P1413 坚果保龄球
- 异次元发卡网邮箱SMTP配置教程
- ubuntu18.04美化主题(完整版)
- C# MQTT(MQTTnet)客户端
- From Seeing to Moving: A Survey on Learning for Visual Indoor Navigation (VIL)
热门文章
- Moodl:集成密码,消除错误phpCAS error: phpCAS::client(): type mismatched for parameter $se
- JS操作iframe里的dom
- PHP实现单件模式的几种方式
- node.js——麻将算法(七)简易版麻将出牌AI2.0
- 机器学习降维算法一:PCA (Principal Component Analysis)
- centos安装python3.7详细过程 2020
- 设置虚拟机上的redis可以被windows的环境下的python访问连接
- python-循环的入门
- 索引-python编程技术-第二版
- PHP设计模式之建造者模式