淘优惠

淘优惠

设计模式之命令模式 commandpattern怎么设计

双十一活动 0

淘宝搜:【天降红包222】领超级红包,京东搜:【天降红包222】
淘宝互助,淘宝双11微信互助群关注公众号 【淘姐妹】

设计模式之命令模式,设计模式命令行模式,设计模式命令模式总结,《设计模式》

[版权申明] 非商业目的注明出处可自由转载 出自:shusheng007

设计模式汇总篇,一定要收藏:永不磨灭的设计模式

由于原文有开车嫌疑,作者已经修正相关部分,请小朋友们还是把注意力放在具体的技术上,哈哈...

最近重读Gof的设计模式,偶尔还是会感叹此书(汉语翻译版)对初学者的不友好,不知道是不是与翻译有关。有时上面的字你都认识,但是连起来就不知道他在说啥,加上此书使用早期C++作为示例代码...真的建议初学者不要浪费时间在这本书上,可以先找几本浅显易懂的入门,然后水平到达一定程度了再涉猎此书。。。

今天我们就浅显易懂的了解一下一个比较常用的设计模式:Command pattern

行为型(behavioral)

3颗星

将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化;对请求排队或记录日志,以及支持可撤销的操作。

设计模式的定义对于大部分初学者没啥D用,因为单看定义是不可能明白它在说什么的,除非进行过实践,有了此方面的经验再回看定义,才会感受到它的精妙。

我反复强调,设个非常重要!因为纵使你有十八般武器,不知道什么时候用也是白搭。从定义上我们就可以看出其可以解决的问题。

  • 当需要将各种执行的动作抽象出来,使用时通过不同的参数来决定执行哪个对象
  • 当某个或者某些操作需要支持撤销的场景
  • 当要对操作过程记录日志,以便后期通过日志将操作过程重新做一遍时
  • 当某个操作需要支持事务操作的时候

以上是命令模式可以胜任的场景,需要你在实践中不断摸索和体会。

可以看到命令模式有4个参与角色

  • Command

是一个接口,定义一个命令

  • ConcreteCommand

具体的执行命令,他们需要实现Command接口

  • Receiver

真正执行命令的角色,那些具体的命令引用它,让它完成命令的执行

  • Invoker

负责按照客户端的指令设置并执行命令,像命令的撤销,日志的记录等功能都要在此类中完成

理论总是特别抽象,让我们看一个具体的实例吧。

21世纪,人类社会的科技日新月异,狂人马斯克正在努力在2050年前将100万人类送往火星殖民。同时人类社会在其他方面也在努力创新,比如人工智能,这不最近有一家科技公司尽然制造出了高智慧机器人,还支持订制,真是太贴心了。王二狗很兴奋,乘着媳妇出差的时候,偷偷订制了两款:【【微信】】号与MiMi号。

今夜,王二狗就是整个小区那个最靓的仔,一切准备就绪,准备发车... 二狗随后会向机器人发出各种各样的指令,这个就很适合使用命令模式

二狗发出的那些命令需要具体的角色来执行,这就用到订制的那两个机器人啦

  • 构建一个【【微信】】号机器人

    此处的【【微信】】号机器人只支持了两个功能:唱歌和弹琴,如果有想更进一步者,请自便...

  • 构建一个MiMi号机器人

    此处指定MiMi号机器人只会跳辣舞

来看看王二狗这厮都会发送什么猥琐的命令吧?

  • 构建一个唱歌命令,其要实现Command接口。因为只有【【微信】】机器人提供这个功能,所以我们要在这个命令内部使用来具体执行。

  • 构建一个弹琴命令,与前面唱歌命令类似

  • 二狗还想看辣舞,所以再构建一个跳辣舞命令。由于只有MiMi号机器人提供这个能力,所以此处的执行者就变成了

我们看到,此命令里面除了具体执行命令的,还包含了命令执行时需要的数据,例如跳舞时长。这也是命令模式需要注意的地方,具体的命令类里不止包含具体执行命令的那个对象,也包含相关数据。

机器人和命令都准备好了,那么具体怎么发送呢?这就是Invoker的角色了。二狗买这两个机器人时还带了一个智能语音控制器,他通过这个控制器就可以发出各种命令了。

终于到了发车的时刻了。二狗兴奋的唤起了控制系统(RobotInvoker )喊道:来来,让bingbing先把琴弹起来,再把歌唱起来... 还有,让mimi来段辣舞,要那种让人欲罢不能的辣舞哦...

输出:

命令模式的要点如下

  • 接口非常简单,通常只有一个方法,如果要支持撤销操作的话,再加一个方法
  • 每个具体的命令类内部封装了实际执行命令的那个类(),或者那些类,以及执行需要的数据
  • 每个具体命令类只完成一个请求,有多少个请求就有多少个命令
  • 类只认识接口,其他的都不认识
  • 客户端类负责生成命令,并通过Invoker组装执行。
  • 将调用操作与具体执行者解耦

你只管发出命令,至于命令由谁执行你不用关心。我们也可以随时将命令中具体执行者换掉,发出命令者是不知道的。例如你大老板交给经理一个任务,至于经理安排小张,还是小王来做,他根本就不关心

  • 添加一个命令非常容易
  • 很容易实现序列操作及实现回调系统

你把命令加到一个列表中,迭代执行就可以实现序列操作了。 因为Java不能将函数作为参数,此处我们可以将命令对象当做参数,而这个对象还可执行,所以就实现了回调功能。

类太多,每次增加一个命令,就要多加一个类。

总的来说此模式在日常开发中使用频率不高,但关键时刻是能起大作用的。

设计模式值得你刻意练习!

GitHub源码地址:design-patterns,星星点起来

程序员灯塔 转载请注明原文链接:秒懂设计模式之命令模式(Command Pattern)
喜欢 ()


chatgpt和chatbot区别 chatbot能替代chatgpt吗

chatgpt,chatgpt是什么意思,chatgpt官网,chatgpt怎么读

3月13日起,New Bing也限制住了中国客户,与ChatGPT一样,需要使用魔法才能访问和使用。这难道是文心一言要来的前奏?虽然New Bing们限制住了我们,但是我们也不能总是施魔法干活,太累了,而且也没有足够的魔法药水供我们使用。

今天带大家体验的是一款在现阶段可以满足我们同时访问New Bing和ChatGPT的聚合工具「ChatHub」,而它仅仅是一个【【微信】】或Edge浏览器的插件,是不是很方便?

ChatHub」是一个chatbot聚合客户端,它实现了在一个应用里使用多种chatbot,目前支持ChatGPT和new Bing Chat。

据官网说,后续还会集成Google Bard、百度文言一心等。

官方说明的功能:

  • 能够同时和多个chatbot聊天,方便对比回答。

  • 支持ChatGPT API模式,比ChatGPT Plus花费更少、速度更快

  • 快捷键一键唤起

  • Markdown及代码高亮

ChatHub」是在Google 【【微信】】商店里才能下载安装。插件ID「iaakpnchhognanibcahlpcplchdfmgma」。

点击「添加至 【【微信】】」按钮,就可以在Microsoft Edge浏览器或【【微信】】浏览器中安装插件。

点击「添加扩展」按钮,即可完成安装。

ChatHub」默认界面是多合一「All In One」,不仅可以想用哪个就用哪个,而且可以方便对比,选择自己满意的内容。也可以点击左侧的导航,选择一款来使用。

点击左下角的「设置」按钮,可以设置相关内容。

  • ChatGPT API」项,需要设置 API Key后才能使用ChatGPT

  • Startup page」项,设置打开插件时的开始页面

New Bing和ChatGPT的使用都是有前提的,需要在官方已经完成候补或注册成功。

ChatHub- All-in-one chatbot client」是一款免费插件工具,源码在GitHub上「【【网址】】/【【微信】】-dev/【【微信】】」。但插件的成品需要魔法才能下载,有需要的私信我。

关注我,不迷路。本文由 @左右为攻 原创,如果有使用问题,可以随时与我沟通。

举报/反馈