JAVA SCRIPT设计模式--行为型--设计模式之State状态者模式(20)

news2024/12/23 10:52:56

         JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能,所以不可能像C++,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVA SCRIPT代码,代码只是实现了设计模式的主体功能,不代表全部的正确,特此声明。若读者需要了解设原则、设计变化方向,环境相关等信息请查看设计模式开篇。

        所有JAVA SCRIPT设计模式快捷连接:

              创建型:(1)  抽象工厂 (2) 生成器 (3) 工厂方法 (4) 原型  (5) 单例​

              结构型:(6) 适配器  (7) 桥接  (8) 组合 (9) 装饰 (10) 外观 (11) 享元 (12) 代理​

              行为型:(13) ​职责链 (14) ​命令 (15) ​解释器 (16) ​迭代器 (17) ​中介者 (18) ​备忘录 (119) ​观察者 (20) ​状态​ (21) ​策略 (22) ​模板方法 (23) 访问者​


一、UML类图

参与者:

1.1 Context(环境,如TCPConnection)  

  • 定义客户感兴趣的接口。
  • 维护一个ConcreteState子类的实例,这个实例定义当前状态。

1.2 State(状态,如TCPState)  

  • 定义一个接口以封装与Context的一个特定状态相关的行为。

1.3 ConcreteStatesubclasses(具体状态子类,如TCPEstablished,TCPListen,TCPClosed) 

  • 每一子类实现一个与Context的一个状态相关的行为。

二、意图

     允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

三、适用性 

  1. 一个对象的行为取决于它的状态 , 并且它必须在运行时刻根据状态改变它的行为。
  2. 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常 , 有多个操作包含这一相同的条件结构。 State模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。

四、示例代码

4.1  动机

        考虑一个表示网络连接的类TCPConnection。一个TCPConnection对象的状态处于若干不同状态之一:连接已建立(Established)、正在监听(Listening)、连接已关闭(Closed)。当一个
TCPConnection对象收到其他对象的请求时,它根据自身的当前状态作出不同的反应。例如,一个Open请求的结果依赖于该连接是处于连接已关闭状态还是连接已建立状态。State模式描述了TCPConnection如何在每一种状态下表现出不同的行为。


        这一模式的关键思想是引入了一个称为TCPState的抽象类来表示网络的连接状态。TCPState类为各表示不同的操作状态的子类声明了一个公共接口。TCPState的子类实现与特
定状态相关的行为。例如,TCPEstablished和TCPClosed类分别实现了特定于TCPConnection的连接已建立状态和连接已关闭状态的行为。

         TCPConnection类维护一个表示TCP连接当前状态的状态对象(一个TCPState子类的实例)。TCPConnection类将所有与状态相关的请求委托给这个状态对象。TCPConnection使用它的
TCPState子类实例来执行特定于连接状态的操作。

        一旦连接状态改变,TCPConnection对象就会改变它所使用的状态对象。例如当连接从已建立状态转为已关闭状态时,TCPConnection会用一个TCPClosed的实例来代替原来的TCPEstablished的实例

4.2  目录结构:

4.3 Context(环境,如TCPConnection)  

  • 定义客户感兴趣的接口。
  • 维护一个ConcreteState子类的实例,这个实例定义当前状态。
import TCPOpen from './TCP/impl/TCPOpen.js';
 

export default class TCPConnection {
	#state;
	constructor() {
			this.#state = TCPOpen.Instance();
	}
	Open() {
		this.#state.Open(this);
	}
	Close() {
		this.#state.Close(this);
	}
	Send()
	{
		this.#state.Send(this);
	}
	ChangeState(state)
	{
		this.#state =state;
	}
}

4.4 State(状态,如TCPState)  

  • 定义一个接口以封装与Context的一个特定状态相关的行为。



export default  class TCPstate {
	
    constructor() {
		
    }
	/*打开链接*/
	Open(tcpConnection)
	{
		
	}
	/*关闭链接*/
	Close(tcpConnection)
	{
		
	}
	/*确认链接*/
	Send(tcpConnection)
	{
		
	}
	/*改变状态*/
	ChageState(tcpConnection,state)
	{
		tcpConnection.ChangeState(state);
	}

}

4.5 ConcreteStatesubclasses(具体状态子类,如TCPEstablished,TCPListen,TCPClosed) 

  • 每一子类实现一个与Context的一个状态相关的行为。
import TCPstate from '../TCPstate.js'; 
import TCPSend from './TCPSend.js'; 
/**
 * 关闭状态
 */
export default class TCPOpen extends TCPstate {
	 
	static #instance;
	constructor() {
		super();
		if (!TCPOpen.#instance) {
			TCPOpen.#instance = this
		}
		return TCPOpen.#instance
	}
	
	static Instance() {
		if (!this.#instance) this.#instance = new TCPOpen();
		return this.#instance;
	}
	Open(tcpConnection)
	{
		 console.log(`TCPOpen`);
		 this.ChageState(tcpConnection,TCPSend.Instance());
	}
}

import TCPstate from '../TCPstate.js';
import TCPClosed from './TCPClosed.js'; 
/**
 * 连接成功状态
 */
export default class TCPSend extends TCPstate {
	static #instance;
	constructor() {
		super();
		if (!TCPSend.#instance) {
			TCPSend.#instance = this
		}
		return TCPSend.#instance
	}

	static Instance() {
		if (!this.#instance) this.#instance = new TCPSend();
		return this.#instance;
	}

	  
	Send(tcpConnection) {
		 console.log(`TCPSend`);
		 this.ChageState(tcpConnection,TCPClosed.Instance());
	}



}
import TCPstate from '../TCPstate.js'; 
 
/**
 * 关闭状态
 */
export default class TCPClosed extends TCPstate {
	 
	static #instance;
	constructor() {
		super();
		if (!TCPClosed.#instance) {
			TCPClosed.#instance = this
		}
		return TCPClosed.#instance
	}
	
	static Instance() {
		if (!this.#instance) this.#instance = new TCPClosed();
		return this.#instance;
	}
	Close(tcpConnection)
	{
		 console.log(`TCPClosed `);
		 this.ChageState(tcpConnection,null);
	}
}

4.6  Client

import TCPConnection from './TCPConnection.js';
  
export default class Client{
     
    constructor( ) {
    	let tcpConnection =new TCPConnection(); 
		
		tcpConnection.Open();
		tcpConnection.Send();
		tcpConnection.Close();
    }  
 }

4.7 测试HTML

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">


		<script type="module">
			import Client from './Client.js';
			var canvas = document.getElementById("mycanvas")
			var ctx = canvas.getContext("2d") //create 2d object
			let cl = new Client();
		</script>
	</head>
	<body>
		<canvas id="mycanvas" width=900px height=900px></canvas>

	</body>
</html>

测试结果:

TCPOpen.js:23 TCPOpen
TCPSend.js:23 TCPSend
TCPClosed.js:23 TCPClosed 

五、源代码下载

        下载链接:https://pan.baidu.com/s/1XuPqp84cccBNVkbnMY3sKw 
         提取码:q2ut

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/74119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ToDesk企业版使用测试:破解企业远程办公难题,更安全更高效

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作者&#x1f3c6;&#xff0c;阿里云专家博主&#x1f3…

Phoenix安装部署

目录官网地址Phoenix 部署连接二次连接&#xff0c;连接失败解决官网地址 link Phoenix 部署 上传并解压 tar 包 更名 复制 server 包并拷贝到各个节点的 hbase/lib 配置环境变量 sudo vim /etc/profile.d/my_env.sh#phoenix export PHOENIX_HOME/opt/module/phoenix e…

抗病毒面料之外,安奈儿价值内核彰显

伴随着防控措施的不断优化&#xff0c;消费板块重回资本视野&#xff0c;其中童装巨头安奈儿因将推出“抗病毒抗菌面料”备受关注&#xff0c;14天收获10个涨停板。 目前安奈儿凭借抗病毒面料吸引了无数资本的目光&#xff0c;但这也是一把双刃剑。虽然抗病毒面料为安奈儿带来了…

数字化棋牌室 | 会员管理预约系统 | 棋牌室小程序

棋牌室在城市与农村都是部分老年人与年轻人的经常去的娱乐场所&#xff0c;以前这些场所里总是挤满了人&#xff0c;但现在越来越多的棋牌室即使环境装修的漂亮、设备高端完善等依然面对流量难题及管理难题&#xff0c;同时由于棋牌室具有社区属性&#xff0c;因此也有不少商家…

ARM微控制器MK24FN1M0VDC12、MKV10Z128VLH7低功耗MCU资料

MK24FN1M0VDC12 IC MCU 32BIT 1MB FLASH 121XFBGA 说明&#xff1a;Kinetis K2x 32位微控制器是低功耗mcu&#xff0c;通过智能片上集成大大节省了BOM。这些mcu基于ArmCortex-M4核心&#xff0c;提供完整和可选的高速USB 2.0 on - on - go (OTG)&#xff0c;包括无晶体设备功能…

干货 | 数字经济创新创业——数据是数字经济的基础

下文整理自清华大学大数据能力提升项目能力提升模块课程“Innovation & Entrepreneurship for Digital Economy”&#xff08;数字经济创新创业课程)的精彩内容。主讲嘉宾&#xff1a;Kris Singh: CEO at SRII, Palo Alto, CaliforniaVisiting Professor of Tsinghua Unive…

RTSP 协议漫谈,揭秘 RTSP 协议内幕

RTSP&#xff08;Real Time Streaming Protocol&#xff09;实时流传输协议&#xff0c;定义在 RFC2326&#xff0c;是 TCP/IP 协议体系中的一个应用层协议&#xff0c;由哥伦比亚大学、网景和 RealNetworks 公司提交的 IETF RFC 标准。该协议定义了一对多应用程序如何有效地通…

Linux用户管理详解

Linux用户管理详解 前言 Linux用户即Linux的使用者&#xff0c;是指使用Linux系统或服务的人员&#xff0c;通常用户对应拥有一个用户账号&#xff0c;并对用户名识别。正常登录Linux系统&#xff0c;本质是登录系统&#xff0c;但是Linux支持同一时间多个用户同时登陆&#x…

JSP ssh服装定制电子商务系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh服装定制电子商务系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采 用B/S模式开发。开发环境为TOMCA…

大一学生《Web编程基础》期末网页制作 HTML+CSS+JavaScript 网页设计实例 企业网站制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

【Docker】第 1 章 Docker概述

1.1 Docker是什么 使用最广泛的开源容器引擎一种操作系统级的虚拟化技术依赖于Linux内核特性&#xff1a;Namespace&#xff08;资源隔离&#xff09;和Cgroups&#xff08;资源限制&#xff09; 一个简单的应用程序打包工具 1.2 Docker设计目标 提供简单的应用程序打包工具开…

传奇架设需要准备以下条件

传奇架设其实很简单 很多网友非常爱玩这款游戏&#xff0c;可能还有朋友不知道怎么架设这款游戏 今天特意写篇传奇架设教程&#xff0c;希望大家都能打造出真正属于自己的传奇 首先传奇架设需要准备以下几个软件 准备工具&#xff1a; 1、传奇服务端&#xff08;版本&#…

select组件切换tags时,联动的select组件内容清空

前言 记录在项目开发中遇到问题的解决方案&#xff0c;方便以后遇到快速解决&#xff01; 问题描述 在该react hooks 页面中&#xff0c;图纸计划附件表格是一个子组件。其中 【单体】和【专业】两个下拉select选择框&#xff0c;数据来源依赖于【厂区】。 后端给的接口&#…

9微电网两阶段鲁棒优化经济调度方法(MATLAB程序)

联系2645521500 复现文章&#xff1a; 微电网两阶段鲁棒优化经济调度方法——刘一欣&#xff08;中国电机工程学报&#xff09; 主要内容&#xff1a; 针对微电网内可再生能源和负荷的不确定性&#xff0c;建立了min-max-min 结构的两阶段鲁棒优化模型&#xff0c;可得到最…

SpringCloud微服务网关gateway

SpringCloud微服务网关gateway 网关简介 大家都都知道在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f; 如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去用…

word电子版签名

word电子版签名 问题 word如何实现电子版签名 解决方案一 1 在纸上使用签字笔签名并进行拍照 2 对图片进行使用电子扫描 对于图片进行使用电子扫描&#xff0c; 可选择的app与微信小程序较多&#xff0c;可自行选择&#xff0c;对于app&#xff0c; 笔者推荐全能扫描王&a…

康沣生物通过上市聆讯:年亏损过亿 高瓴与比邻星是股东

雷递网 雷建平 12月7日康沣生物科技&#xff08;上海&#xff09;股份有限公司&#xff08;简称&#xff1a;“康沣生物”&#xff09;日前通过聆讯&#xff0c;准备在港交所上市。年亏损过亿康沣生物是一家专注于冷冻消融微创介入治疗技术在心血管领域应用的企业。康沣生物CEO…

我的年度用户体验趋势报告——由 ChatGPT AI 撰写

Our yearly UX trends report, but written by the ChatGPT AI作为今年用户体验集体计划的一部分&#xff0c;我们刚刚发布了年度用户体验状态报告。只是为了好玩&#xff0c;我们想测试ChatGPT人工智能对新一年用户体验趋势的看法&#xff0c;看看哪些预测一致&#xff0c;哪些…

移植第二天知识点整理

一&#xff1a; uboot源码移植准备工作 1.在家目录下创建一个<demo>文件夹 2.将en.SOURCES-stm32mp1-openstlinux-5.10-dunfell-mp1-21-11-17_tar_v3.1.0.xz文件夹拷贝到demo目录下 3.对en.SOURCES-stm32mp1-openstlinux-5.10-dunfell-mp1-21-11-17_tar_v3.1.0.xz进行解…

探秘微信业务优化:DDD从入门到实践

引言 | 本文作者从微信团队维护的带货类项目所遇卡点出发&#xff0c;尝试用领域驱动设计方法&#xff08;简称DDD&#xff09;&#xff0c;保障在快节奏、多人协作的项目迭代中&#xff0c;维持系统的可维护性、可拓展性、高内聚低耦合和稳定性。作者首先剖解相关概念原理&…