【设计模式】JAVA Design Patterns——Balking(止步模式)

🔍目的


止步模式用于防止对象在不完整或不合适的状态下执行某些代码。

🔍解释


真实世界例子

洗衣机中有一个开始按钮,用于启动衣物洗涤。当洗衣机处于非活动状态时,按钮将按预期工作,但是如果已经在洗涤,则按钮将不起任何作用。

通俗描述

使用止步模式,仅当对象处于特定状态时才执行特定代码。

维基百科

禁止模式是一种软件设计模式,仅当对象处于特定状态时才对对象执行操作。例如,一个对象读取zip压缩文件并在压缩文件没打开的时候调用get方法,对象将在请求的时候”止步“。

程序示例

洗衣机是一个具有两个状态的对象,可以处于两种状态:ENABLED和WASHING。 如果机器已启用,则使用线程安全方法将状态更改为WASHING。 另一方面,如果已经进行了清洗并且任何其他线程执行wash(),则它将不执行该操作,而是不执行任何操作而返回。

创建洗衣机类相关部分

@Slf4j
public class WashingMachine {private final DelayProvider delayProvider;private WashingMachineState washingMachineState;public WashingMachine(DelayProvider delayProvider) {this.delayProvider = delayProvider;this.washingMachineState = WashingMachineState.ENABLED;}public WashingMachineState getWashingMachineState() {return washingMachineState;}public void wash() {synchronized (this) {var machineState = getWashingMachineState();LOGGER.info("{}: Actual machine state: {}", Thread.currentThread().getName(), machineState);if (this.washingMachineState == WashingMachineState.WASHING) {LOGGER.error("Cannot wash if the machine has been already washing!");return;}this.washingMachineState = WashingMachineState.WASHING;}LOGGER.info("{}: Doing the washing", Thread.currentThread().getName());this.delayProvider.executeAfterDelay(50, TimeUnit.MILLISECONDS, this::endOfWashing);}public synchronized void endOfWashing() {washingMachineState = WashingMachineState.ENABLED;LOGGER.info("{}: Washing completed.", Thread.currentThread().getId());}
}

这里是一个WashingMachine所使用的DelayProvider简单接口。 

public interface DelayProvider {void executeAfterDelay(long interval, TimeUnit timeUnit, Runnable task);
}

使用WashingMachine 

  public static void main(String... args) {final var washingMachine = new WashingMachine();var executorService = Executors.newFixedThreadPool(3);for (int i = 0; i < 3; i++) {executorService.execute(washingMachine::wash);}executorService.shutdown();try {executorService.awaitTermination(10, TimeUnit.SECONDS);} catch (InterruptedException ie) {LOGGER.error("ERROR: Waiting on executor service shutdown!");Thread.currentThread().interrupt();}}

程序的输出。

14:02:52.268 [pool-1-thread-2] INFO com.iluwatar.balking.WashingMachine - pool-1-thread-2: Actual machine state: ENABLED
14:02:52.272 [pool-1-thread-2] INFO com.iluwatar.balking.WashingMachine - pool-1-thread-2: Doing the washing
14:02:52.272 [pool-1-thread-3] INFO com.iluwatar.balking.WashingMachine - pool-1-thread-3: Actual machine state: WASHING
14:02:52.273 [pool-1-thread-3] ERROR com.iluwatar.balking.WashingMachine - Cannot wash if the machine has been already washing!
14:02:52.273 [pool-1-thread-1] INFO com.iluwatar.balking.WashingMachine - pool-1-thread-1: Actual machine state: WASHING
14:02:52.273 [pool-1-thread-1] ERROR com.iluwatar.balking.WashingMachine - Cannot wash if the machine has been already washing!
14:02:52.324 [pool-1-thread-2] INFO com.iluwatar.balking.WashingMachine - 14: Washing completed.

🔍类图


Balking 

🔍适用场景


使用止步模式场景

  • 您只想在对象处于特定状态时才对其调用操作
  • 对象通常仅处于容易暂时停止但状态未知的状态

 

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

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

相关文章

类中属性赋值的过程——Java学习笔记

类中属性赋值过程 非静态属性的赋值 可以通过: 默认初始化显示初始化构造器中初始化通过对象.属性或对象.方法的方法进行赋值代码块中初始化 执行先后顺序&#xff1a;默认初始化–>显式初始化–>代码块中初始化–>构造器初始化–>通过方法进行赋值 关于字节码…

Spring中Bean的作用域有哪些?

在Spring框架中&#xff0c;Bean的作用域定义了由Spring IoC容器创建的Bean实例的可见范围和生命周期。Spring提供了几种不同的Bean作用域供我们根据需求选择使用&#xff0c;每种作用域都有其特定的用途。常用的作用域包括&#xff1a; Singleton&#xff08;单例&#xff09;…

企业签名有什么优点?

企业签名具有以下优点&#xff1a; 1.自定义企业分发&#xff1a;为企业提供更大的灵活性和控制权 2.加强企业安全性&#xff1a; 控制分发 减少潜在风险、数据泄露 3.内部应用更新和管理&#xff1a;企业可自主更新和管理内部分发。灵活发布新版本应用程序&#xff0c;修复bug…

大型语言模型(LLM)论文串烧

近期把各家大型语言模型的论文过了一遍&#xff0c;包括&#xff1a; Qwen Llama 2 BlueLM GLM-130B Baichuan2 Yi 刚好趁着刚看完还有印象稍微做下总结。

「动态规划」地下城游戏

力扣原题链接&#xff0c;点击跳转。 有一个地下城&#xff0c;我们用mn大小的二维数组dungeon表示。dungeon[i][j]如果为正&#xff0c;该位置有血包&#xff0c;可以加血量&#xff1b;如果为负&#xff0c;该位置有恶魔&#xff0c;会扣掉相应的血量。有一个骑士在左上角&a…

科技产业园3D探秘:未来科技之城的奇幻之旅

在数字时代的浪潮中&#xff0c;科技产业园区成为了推动城市经济发展、科技创新的重要引擎。 当我们打开科技产业园的3D可视化模型&#xff0c;仿佛穿越时空&#xff0c;来到了一个充满奇幻色彩的科技世界。在这里&#xff0c;高楼大厦鳞次栉比&#xff0c;绿色植被点缀其间&am…

【文末附gpt升级方案】革新多模态学习:哈工大团队推出“Uni-MoE”统一多模态大模型的跨域MoE研究

革新多模态学习&#xff1a;哈工大团队推出“Uni-MoE”统一多模态大模型的跨域MoE研究 摘要&#xff1a;随着人工智能技术的飞速发展&#xff0c;多模态学习已成为机器学习领域的重要研究方向。然而&#xff0c;传统的多模态学习方法往往存在信息融合困难、模型复杂度高等问题…

深度学习模型keras第二十三讲:在KerasCV中使用SAM进行任何图像分割

1 SAM概念 ###1.1 SAM定义 Segment Anything Model&#xff08;SAM&#xff09;是一种基于深度学习的图像分割模型&#xff0c;其主要特点包括&#xff1a; 高质量的图像分割&#xff1a;SAM可以从输入提示&#xff08;如点、框、文字等&#xff09;生成高质量的对象掩模&am…

我爱我家:租赁下位替代买房,能行吗?

我爱我家&#xff0c;凭什么五天四板&#xff1f; 上周五的楼市组合拳出台后&#xff0c;地产板块迎来高潮。 这其中最火的不是我们常说的“招宝万金”&#xff0c;而是——我爱我家。 五天四板&#xff0c;一个月不到&#xff0c;股价轻松翻翻。 公司有什么变化吗&#xff1…

Flutter 页面布局 Flex Expanded弹性布局

题记 —— 执剑天涯&#xff0c;从你的点滴积累开始&#xff0c;所及之处&#xff0c;必精益求精&#xff0c;即是折腾每一天。 什么是弹性布局&#xff08;Flex&#xff09;&#xff1f; 弹性布局&#xff08;Flex&#xff09;是一种基于弹性盒子模型的布局方式&#xff0c;类…

C语言例题46、根据公式π/4=1-1/3+1/5-1/7+1/9-1/11+…,计算π的近似值,当最后一项的绝对值小于0.000001为止

#include <stdio.h> #include <math.h>int main() {int fm 1;//分母double sign 1;//正负号double fzs 1;//分子式double sum 0;while (fabs(fzs) > 0.000001) {sum fzs;sign * -1; //变换正负号fm 2; //分母3、5、7、9...增长fzs sign / fm;//分子式…

算法思想汇总

95% 的算法都是基于这 6 种算法思想 - 知乎 一文图解弄懂八大常用算法思想&#xff01; - 掘金 八种常用算法思想 | 智能后端和架构 【总结】递归、回溯、深度优先、广度优先_递归算法与深度优先算法-CSDN博客 https://www.cnblogs.com/cdaniu/p/16369446.html

9.6 Go语言入门(数组、切片和指针)

Go语言入门&#xff08;数组、切片和指针&#xff09; 目录五、数组、切片和指针1. 数组1.1 声明和初始化数组1.2 访问和修改数组元素1.3 多维数组 2. 切片2.1 声明和初始化切片2.2 访问和修改切片元素2.3 切片操作2.4 切片的追加和拷贝 3. 指针3.1 声明和初始化指针3.2 指针与…

【资料分享】你敢相信这些高大上的BI仪表盘都是用EXCEL做出来的?!

引言 现在大家都知道数据可视化、数据看板&#xff0c;几乎每个公司部门都有仪表盘的需求。 近年来&#xff0c;学习可视化软件的人也越来越多&#xff0c;国外Tableau、PowerBI就是这一领域的领先者&#xff0c;而国内也有不少厂家在研发数据可视化软件&#xff0c;比如帆软…

【前端每日基础】day18——css清除浮动

在CSS中&#xff0c;浮动&#xff08;float&#xff09;是一种常见的布局技术&#xff0c;但它常常导致父容器的高度无法自动扩展以包含浮动的子元素。这时就需要清除浮动。以下是几种常用的清除浮动的方法&#xff1a; 使用清除元素&#xff08;Clearfix&#xff09; Clearfi…

如何用java做一个模拟登录画面

要求&#xff1a; 实现registerAction方法中的注册逻辑。实现login方法中的登录逻辑&#xff0c;确保只有当用户名和密码都正确时才返回true。实现好友管理功能&#xff0c;包括添加好友、删除好友、查看好友列表。确保所有的文件操作&#xff08;如读取和写入credentials.txt…

Pytorch深度学习实践笔记4

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;pytorch深度学习 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 视频来自【b站刘二大人】 1 反向传播 Back propaga…

INES文件头解析

ines_header.h #pragma once/* ** NES ROM 标头信息格式 ** FlameCyclone ** 2024.5.11 ** (https://gitee.com/flame_cyclone/ines-info.git) */#include <stdint.h> #include <string.h>// INES ROM 标头 // https://www.nesdev.org/wiki/INES typedef struct _…

信息化项目交付验收流程管理办法

项目交付验收流程制度 管理办法 (执行版) (文件编号: ) 编制: 审核: 批准: 版本: 生效日期: 管理办法概述 制定目的为了保证公司在建项目交付验收工作事项的顺利开展,保证交付验收进度及…

POJ 1463 Strategic game/洛谷UVA1292(树形dp)

P O J 1463 S t r a t e g i c g a m e \Huge{POJ\ 1463\ Strategic game} POJ 1463 Strategicgame 文章目录 题意思路标程 题目地址1&#xff1a;1463 – Strategic game (poj.org) 题目地址2&#xff1a;Strategic game - 洛谷 题目地址3&#xff1a;P2016 战略游戏 - 洛谷 …