【设计模式】第16节:行为型模式之“命令模式”

news2024/12/25 8:55:22

一、简介

命令模式:将请求(命令)封装为一个对象,这样可以使用不同的请求参数化其他对象(将不同请求依赖注入到其他对象),并且能够支持请求(命令)的排队执行、记录日志、撤销等(附加控制)功能。

二、优点

  • 动作封装
  • 解耦发送者跟接受者
  • 可扩展性
  • 简化和集中错误处理
  • 支持撤销和重做功能
  • 易于实现组合命令

三、UML类图

请添加图片描述

四、案例

家里有很多房间,有卧室和厨房等,用一套灯光管理系统同一管理所有灯的开关。

package main

import "fmt"

type Light interface {
	On()
	Off()
}

type KitchenLight struct {
}

func NewKitchenLight() *KitchenLight {
	return &KitchenLight{}
}

func (*KitchenLight) On() {
	fmt.Println("Kitchen light is on")
}

func (*KitchenLight) Off() {
	fmt.Println("Kitchen light is off")
}

type LivingRoomLight struct {
}

func NewLivingRoomLight() *LivingRoomLight {
	return &LivingRoomLight{}
}

func (*LivingRoomLight) On() {
	fmt.Println("Living room light is on")
}

func (*LivingRoomLight) Off() {
	fmt.Println("Living room light is off")
}

type Command interface {
	Execute()
	Undo()
}

type LightOnCommand struct {
	Lights []Light
}

func NewLightOnCommand(lights []Light) LightOnCommand {
	return LightOnCommand{Lights: lights}
}

func (loc *LightOnCommand) Execute() {
	for _, light := range loc.Lights {
		light.On()
	}
}

func (loc *LightOnCommand) Undo() {
	for _, light := range loc.Lights {
		light.Off()
	}
}

type LightOffCommand struct {
	Lights []Light
}

func NewLightOffCommand(lights []Light) LightOffCommand {
	return LightOffCommand{Lights: lights}
}

func (loc *LightOffCommand) Execute() {
	for _, light := range loc.Lights {
		light.Off()
	}
}

func (loc *LightOffCommand) Undo() {
	for _, light := range loc.Lights {
		light.On()
	}
}

func main() {
	kitchenLight := NewKitchenLight()
	livingRoomLight := NewLivingRoomLight()

	lightOnCommand := NewLightOnCommand([]Light{kitchenLight, livingRoomLight})
	lightOnCommand.Execute()
	lightOnCommand.Undo()

	lightOffCommand := NewLightOffCommand([]Light{kitchenLight, livingRoomLight})
	lightOffCommand.Execute()
	lightOffCommand.Undo()
}

五、对比

命令模式与策略模式的区别:在策略模式中,不同的策略具有相同的目的、不同的实现、互相之间可以替换。比如,BubbleSort、SelectionSort都是为了实现排序的,只不过一个是用冒泡排序算法来实现的,另一个是用选择排序算法来实现的。而在命令模式中,不同的命令具有不同的目的,对应不同的处理逻辑,并且互相之间不可替换。

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

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

相关文章

led护眼灯真的能护眼吗?五款热门led护眼灯推荐

LED灯的出现出现只是为了照明,且它的功能也就只有照明,像是眩光、蓝光、频闪、过亮过暗等等都是LED灯所存在的问题,而这些问题也正是造成我们眼睛近视、诱发眼部疾病的罪魁祸首。特别是正处于发育时期的青少年们,抵抗力弱&#xf…

二氧化铈纳米颗粒 CAS: 1306-38-3 Cerium Oxide CEO2

二氧化铈纳米颗粒 (西)产品名称:二氧化铈纳米颗粒 (安)英文名称:CEO2,30-50NM, 99.9%,Cerium Oxide (瑞)CAS: 1306-38-3 (禧)纯度&#xff1a…

ICC2: 如何在显示GUI操作产生的命令

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 ICC2:自定义快捷键和菜单 VIEW -> Perference -> Global Settings 把display commands in logging console 下面几个都勾上即可。

JDBC-Java程序连接关系型数据库的技术,ORM编程思想

一、JDBC介绍: 1.操作数据库的方式 1.通过命令行的方式操作mysql服务,cmd通过命令操作 2.通过图形化界面操作mysql服务,例如navicat软件 3.通过java程序连接操作mysql数据库,使用jdbc技术 2.什么是JDBC JDBC(Java Data Base Con…

java项目之艺诚美业管理系统(ssm框架)

项目简介 艺诚美业管理系统实现了以下功能: 管理员:个人中心、会员管理、员工管理、员工打卡管理、技师预约管理、发型美容师管理、技师类型管理、套餐信息管理、套餐类型管理、套餐购买管理、会员充值管理、系统管理。员工:个人中心、员工…

vue引入字体

假定已经下了字体包 1、在src/assets文件夹下新建一个font文件夹,放入字体文件与配置文件 这个与两个字体,优设标题黑和DIN字体,font.css用于给字体取名,将字体引入网站。 font-face { font-family: YouSheBiaoTiHei; src: url(…

记一次老商家端应用内存突然飚高原因分析 | 京东物流技术团队

一、排查过程 问题发现是因为当时接到了内存UMP报警信息,如下: 通过查看PFinder发现内存一直在增长,没有停止迹象,触发fullGC也并没有下降趋势: 当机立断,先立即去NP上摘除了此台机器流量,然后…

linux 上flink单机安装详解

目录 一 准备安装包 二 解压 三 配置环境变量 四 验证是否部署成功 一 准备安装包 官网地址: Downloads | Apache Flink 百度网盘资源: 链接: https://pan.baidu.com/s/15aXmF3JLxnOlPiDxId637Q?pwdsqsx 提取码: sqsx 这里准备的版本是flink1.13…

led灯什么牌子的质量好?双十一必入五款护眼台灯推荐

LED灯作为一种新型的照明产品,具有节能、环保、寿命长等优点,受到越来越多的人们的青睐。但是,市面上的LED灯品牌琳琅满目,让人眼花缭乱。那么,LED灯什么牌子好呢?下面我们来推荐五大品牌。 1、色温 台灯的…

如何清除电脑缓存?简单几步,让你的电脑运行如飞!

电脑缓存是计算机性能的关键组成部分。它允许系统更快地访问已存储的数据,从而提高运行速度。然而,缓存也可能积累过多数据,导致性能下降。本文将探讨如何清除电脑缓存的三种方法,以帮助您维持系统的顶峰状态。 方法1:…

如何使用Guzzle库

Guzzle是一个PHP的HTTP客户端库,用于发送HTTP请求。以下是在PHP代码中使用Guzzle库的基本步骤: 安装Guzzle库:可以使用Composer在命令行中安装Guzzle库。 composer require guzzlehttp/guzzle 导入Guzzle库的命名空间:在PHP代码中…

易基因:ChIP-seq等揭示BRWD3调控KDM5活性以维持H3K4甲基化水平的表观机制|PNAS

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 组蛋白修饰对调控染色质结构和基因表达至关重要,组蛋白修饰失调可能导致疾病状态和癌症。染色质结合蛋白BRWD3(Bromodomain and WD repeat-containing protein 3&…

LeetCode--534. 游戏玩法分析 III

文章目录 1 题目描述1.1 测试用例 2 解题思路2.1 解法 1: group by join2.2 解法 2: sum() over() 1 题目描述 表:Activity ----------------------- | Column Name | Type | ----------------------- | player_id | int | | device_id | int …

远程IO技术驱动:物流分拣线的高效进化

随着工业4.0概念的深入人心,物流行业正在经历前所未有的变革。在这个过程中,物流企业必须积极拥抱新技术,通过提升效率和提供更好的服务来实现物流全链条的信息化、智能化,进而提高物流效率,降低物流成本,以…

Java 中的简单文本编辑器源代码

文章目录 前言简单文本编辑器 源代码基本信息关于Simple Text EditorJava 中的简单文本编辑器免费源代码特征应用程序屏幕截图源代码安装指南 前言 Java 中的简单文本编辑器是用 Java 编程语言编码的桌面应用程序。该项目使用一个简单的函数来制作文本编辑器应用程序。这个项目…

Hazelcast IMDG 概览

数新网络-让每个人享受数据的价值https://www.datacyber.com/ 一、简介 Hazelcast IMDG(in-memory data grid)是开源的、分布式高可用的、开箱即用的、云原生的内存数据网格,可用作开箱即用的数据和计算平台,或用作自己的云原生应…

17、SpringCloud -- natapp 内网穿透

目录 natapp什么是内网穿透?为什么要用natapp?安装、配置:下载隧道:配置启动:访问:natapp官网 natapp 什么是内网穿透? 为什么要用natapp? 安装、配置:

[毕设记录]@学术技能积累:zotero、readpaper 引用功能使用

文章目录 zoteroreadpaper 开题要在word里插入文献引用,zotero和readpaper在浏览器和word都有插件,比较好用 zotero Zotero 是一个免费、开源的参考文献管理软件,可以帮助用户收集、整理和引用文献。它支持多种操作系统,包括 Wind…

数字时代的文化探险,拓世AI文生图解锁千年古典画作宝库

中华古典绘画,既有磅礴的山河之气势,又有细腻至微的尘芥之美。这些画作,如同时间的印记,见证了华夏千年的文明与变迁。这里面的“中国十大传世名画”更是被誉为文明的瑰宝。可是,历史的风云变幻,使得一些名…

AI时代产品经理升级之道

1.产品管理新模式:让产品管理更高效、更快捷、更完美。 2.全流程解析:涵盖产品管理的不同应用场景,介绍从编写各种文档,到竞品分析与市场调研、需求管理、原型设计,再到产品发布与运营、维护与支持等关键环节。 3.实战…