码农小汪-设计模式之-命令模式

article/2025/10/20 14:10:00

大话设计模式的例子讲的非常的好,理解起来也方便!有时候忘了。想到这些特殊的例子感觉就是特别爽。

烤羊肉串带来的思考!
路边摊羊肉串:
老板,我这里排的比较先啊,我最先给钱。老板这个没有熟啊。我的是 辣的啊!老板没有放盐啊!场面混乱,已经分不清谁是谁的啊,人太多了。烤肉的质量也受到了影响,心情不好也就不好啊。烤肉的人心情受到了顾客的影响。
店面的烤肉
服务员,给我来两串羊肉串,2鸡翅,啤酒两瓶。
鸡翅没得啦,点别的吧,肉精吧。辣一点。

两者的比较啊:
路边的生意不稳定,往往就是那几个时间,客源不固定的,人多混乱,所以生意也是不稳定的。烤肉的时候谁都想最先吃到啊,烤肉老板一个人,所以忙的混乱啊。所有的人都没有事情,都盯着这里看,烤肉多那一串,考的好,大家都是比较的清楚的。
这里出现了什么关系了呢?
紧耦合
客户和肉串老板的紧耦合,所以容易出错和乱起来,也容易挑剔。这里就是行为的请求者和行为的实现者的紧耦合。我们需要记录哪几个人的羊肉串,有没有特殊的要求(辣不辣),付钱了没有,谁先谁后啊。这个都是请求做什么哦。对于请求的做出记录哦,也就是日志。
如果有人要求撤出请求不要了,或者有人要求重新烤过,这其实就是什么呢?
撤销和重做吧
所以啊,所有的请求排队或者记录日志,一节支持可以撤销的操作等行为时。行为的请求者和实现者之间的紧耦合是不是太合适的。

我们再说说烤肉店吧!
我们不认识烤肉的师傅,见都没有见到。我们只需要给接待的服务员说就好了。她给我们记录,然后将订单交给师傅去做。都有订单,必有先后顺序。不会乱,不会遗忘。
服务员,肉串太多了,给我少一串好?服务员在订单上画了一笔。搞定,然后通知师傅。让服务员解耦我们的客户与烤肉者之间的耦合这的不错哦
编程融入生活!
这里写图片描述

我们的抽象命令

//抽象命令public abstract class Command{protected Barbecuer receiver;//烤肉串的执行者public Command(Barbecuer receiver){this.receiver = receiver;}//执行命令abstract public void ExcuteCommand();}

这个命令的实现类,考啥子东西呢?考火腿,肌肉,还是其他的一些东西呢?

//烤羊肉串命令class BakeMuttonCommand : Command{public BakeMuttonCommand(Barbecuer receiver): base(receiver){ }public override void ExcuteCommand(){receiver.BakeMutton();}}//烤鸡翅命令class BakeChickenWingCommand : Command{public BakeChickenWingCommand(Barbecuer receiver): base(receiver){ }public override void ExcuteCommand(){receiver.BakeChickenWing();}}

我们烤肉的人在干啥呢?

 //烤肉串者public class Barbecuer{public void BakeMutton(){Console.WriteLine("烤羊肉串!");}public void BakeChickenWing(){Console.WriteLine("烤鸡翅!");}}

还有个重要的人物就是我们的服务员啊,这个解耦的重要的工具。服务员下订单就是让我们的烤肉啊,还是其他的一些东西执行起来,最后的时候才可以去执行的。

//服务员public class Waiter{private Command command;//设置订单public void SetOrder(Command command){this.command = command;}//通知执行public void Notify(){command.ExcuteCommand();}}

最后看我们怎么去执行呢?

              //开店前的准备Barbecuer boy = new Barbecuer();  烤肉的人Command bakeMuttonCommand1 = new BakeMuttonCommand(boy); 创建一个烤那个啥的,谁去烤呢?就是烤肉的Command bakeMuttonCommand2 = new BakeMuttonCommand(boy);Command bakeChickenWingCommand1 = new BakeChickenWingCommand(boy);Waiter girl = new Waiter();//开门营业girl.SetOrder(bakeMuttonCommand1);//下个订单,让我们的师傅去执行girl.Notify();girl.SetOrder(bakeMuttonCommand2);girl.Notify();girl.SetOrder(bakeChickenWingCommand1);girl.Notify();

这个程序肯定是还有问题的吧,真实的情况怎么可以这样的呢?每次只能点一个菜呢,通知一次。
第二嘛,我们不知道厨房的东西是否还有没得?我们应该检查一下涩,让我们的服务员
第三,我们的客户点了哪些菜我们是应该做记录的,以后好收费,还有可能客服中途取消之内的东西。

服务员,有个list的订单

    public class Waiter{private IList<Command> orders = new List<Command>();//设置订单public void SetOrder(Command command){if (command.ToString() == "命令模式.BakeChickenWingCommand"){Console.WriteLine("服务员:鸡翅没有了,请点别的烧烤。");}else{orders.Add(command);Console.WriteLine("增加订单:" + command.ToString() + "  时间:" + DateTime.Now.ToString());}}//取消订单public void CancelOrder(Command command){orders.Remove(command);Console.WriteLine("取消订单:" + command.ToString() + "  时间:" + DateTime.Now.ToString());}//通知全部执行public void Notify(){foreach (Command cmd in orders){cmd.ExcuteCommand();}}}

执行的过程和我们的刚才是一样的哦,所以不要担心的。

命令模式:Command 将我们的一个请求封装成为一个对象,从而使你可用不同的请求对客服进行参数化,对请求排队或记录日志,以及支持可以撤销的操作。
我们看看我们的图片
这里写图片描述

Command命令设计模式中5个角色:
(1).客户角色:创建了一个具体命令对象并确定其接收者。
Barbecuer boy = new Barbecuer(); 烤肉的人
Command bakeMuttonCommand1 = new BakeMuttonCommand(boy); 命令,烤肉的人是接收者

(2).命令角色:声明了一个给所有具体命令类的抽象接口。这是一个抽象角色,通常由一个java接口或java抽象类实现。
这个就是我们上面的Command,我们的服务员依赖于他。必须有命令服务员才去通知我们的厨房哦

(3).具体命令角色:定义一个接受者和行为之间的弱耦合;实现execute方法,负责调用接收者的相应操作。execute方法通常叫做 执行方法。
这里好理解吧,我们这个方法依赖于我们的具体的执行者,烤肉的人。烤肉的人里面的哪种方法呢?我们烤的是啥子?

(4).请求者(Invoke)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
这个就是相当于我们的服务员哦,对吧!

(5).接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。

我们每一个命令的具体的执行者就是他,他就是烤肉的老板

命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。每一个命令都是一个操作,命令请求发出请求要求执行一个操作;命令接受方收到请求,并执行操作。命令模式允许命令请求方和命令接收方独立开来,使得命令请求方不必 知道命令接收方的接口,更不必知道请求是怎么被接收,以及操作是否被执行,何时被执行,以及是怎么被执行的。

服务员

//请求者角色  
class Invoker{  private Command command;  public Invoker(Command command){  this.command = command;  }  public void action(){  command.execute();  }  
} 

烤肉的

//接收者  
class Receiver{  
//行动方法  public void action(){  System.out.println("Action has been taken.");  }  
}  

服务员依赖于Command ,Command 依赖于我们的接受者,烤肉的那个人。这样就间接的传达话语!

//抽象命令角色  
interface Command{  void execute();  
}  
//具体命令类  
class ConcreteCommand implements Command{  private Receiver receiver;  public ConcreteCommand(Receiver receiver){  this.receiver = receiver;  }  public void execute(){  receiver.action();  }  
}  

客服端怎么样呢?

//客户端  
public class Client{  public static void main(String[] args){  //客户端创建命令接受者Receiver receiver = new Receiver();  //客户端创建具体命令,并指定命令接受者Command command = new ConcreteCommand(receiver);  //客户端创建请求者,并给请求者指定具体命令Invoker invoker = new Invoker(command);  //命令请求者发出命令请求invoker.action();         }   
}   

Command命令设计模式的优缺点:
优点: 解耦了命令请求者和接受者之间联系。请求者调用一个命令,接受者接受请求并执行相应的动作,因为使用Command模式解耦,请求者无需知道接受者任何接口。
缺点: 造成出现过多的具体命令类。


http://chatgpt.dhexx.cn/article/tl9HFjtl.shtml

相关文章

命令模式(行为型)

一、什么是命令式 命令(Command)模式又叫作动作(Action)模式或事务(Transaction)模式&#xff0c;是一种对象的行为模式。将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤消的操作…

命令模式---电视机遥控器

电视机是请求的接收者&#xff0c;遥控器是请求的发送者&#xff0c;遥控器上有一些按钮&#xff0c;不同的按钮对应电视机的不同操作。抽象命令角色由一个命令接口来扮演&#xff0c;有三个具体的命令类实现了抽象命令接口&#xff0c;这三个具体命令类分别代表三种操作&#…

C++设计模式-命令模式

目录 基本概念 代码与实例 基本概念 命令模式&#xff08;Command&#xff09;&#xff0c;将一个请求封装为对象&#xff0c;从而使你看用不同的请求对客户端进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤销操作。 命令模式的作用&#xff1a; …

设计模式---命令模式

命令模式 命令模式的定义 ​ 命令模式是一个高内聚的模式&#xff0c;其定义为&#xff1a;Encapsulate a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations.&#xff08;将一…

【设计模式】命令模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

文章目录 一、命令模式简介二、命令模式 适用场景三、命令模式 优缺点四、命令模式 与 备忘录模式五、命令模式 代码示例1、命令接口2、发布命令类3、关闭命令类4、游戏类5、命令执行者类6、测试类 一、命令模式简介 命令模式 : 将 不同的请求 封装成 不同的请求对象 , 以便 使…

设计模式(16)命令模式

**定义&#xff1a;**将一个请求封装成一个对象&#xff0c;从而让你使用不同的请求把客户端参数化&#xff0c;对请求排队或者记录请求日志&#xff0c;可以提供命令的撤销和恢复功能。 **类型&#xff1a;**行为类模式 类图&#xff1a; 命令模式的结构 ​ 顾名思义&#…

什么是命令模式?

一、命令模式的定义 命令是对命令的封装&#xff0c;每一个命令都是一个操作&#xff0c;请求方发出请求&#xff0c;接收方接收请求&#xff0c;并执行操作。命令模式解耦了请求方和接收方&#xff0c;命令模式属于行为型模式 二、命令模式的uml图和通用写法 uml 通用写法 …

设计模式之命令模式详解

1 概述 日常生活中&#xff0c;我们出去吃饭都会遇到下面的场景。我们可以将女招待理解成一个请求的发送者&#xff0c;用户通过它来发送一个“点餐”请求&#xff0c;而厨师是“点餐”请求的最终接收者和处理者&#xff0c;在图中&#xff0c;顾客和厨师之间并不存在直接耦合…

命令模式

一、命令模式介绍 在软件设计中&#xff0c;我们经常需要向某些对象发送请求&#xff0c;但是并不知道请求的接收者是谁&#xff0c;也不知道被请求的操作是哪个。我们只需要在程序运行时指定具体的请求接收者即可&#xff0c;此时可以使用命令模式来设计。 命令模式使得请求发…

Java设计模式——命令模式

文章目录 命令模式 命令模式 命令模式很好理解&#xff0c;举个例子&#xff0c;司令员下令让士兵去干件事情&#xff0c;从整个事情的角度来考虑&#xff0c;司令员的作用是&#xff0c;发出口令&#xff0c;口令经过传递&#xff0c;传到了士兵耳朵里&#xff0c;士兵去执行…

如何设置IPv4和IPv6报文的DSCP值——网络测试仪实操

一、操作说明 在QoS测试中&#xff0c;经常要设置不同优先级的报文&#xff0c;来验证被测设备对于优先级的调度。所以&#xff0c;我们就要了解如何设置IPv6和IPv6报文中的DSCP&#xff08;大部分使用DSCP值&#xff0c;也会用到TOS值&#xff09; 这里我们使用测试接交换机&…

DSCP vs IPv4 Tos

首先看IPv4包头如下 其中&#xff0c;Qos用到的是Tos定义有下面两种&#xff1a; 老的IPv4 TOS Byte定义和值 新的DSCP定义和值 DSCP值 DSCP ValueMeaningDrop ProbabilityEquivalent IP Precedence Value101 110 (46)High Priority Expedited Forwarding (EF)N/A101 – …

c语言socket设置IPV4/6的dscp值

环境&#xff1a;linux centos7 、x86 、UDP包 使用sock需要增加头文件 #include <sys/socket.h> #include <sys/types.h> 设置方法很简单&#xff0c;都是使用setsockopt函数&#xff0c;就是找资料及如何太麻烦&#xff0c;尤其是IPV6。需要注意IPV4设置的是I…

tos cos dscp 区别和作用

tos cos 和dscp 都是通过iptable 的mange 的mark 标签来更改的。 谈到qos首先需要了解qos调度的几个重要过程,qos调度过程包括网络入口数据流量的分类和标记、骨干网设备上的拥塞避免和拥塞管理、网路出口的队列调度这几个重要过程. 1、cos和tos的区别: 通过acl对流量进行分类以…

IP优先级和DSCP之间的关系

1. IP优先级和DSCP之间的关系 DiffServ体系定义的DS字段&#xff0c;取代IPv4中ToS字段作出有关数据包分类和流量调节功能的策略。 1.1. ToS字段 在IPv4的报文头中&#xff0c;TOS字段是1字节&#xff0c;根据RFC1122的定义&#xff0c;IP优先级&#xff08;IPPrecedence&…

802.1P优先级、IP优先级、TOS优先级及DSCP优先级的分类和对应

1、802.1P优先级&#xff08;有时也称COS优先级&#xff09;&#xff1a; 802.1p用户优先级定义在二层802.1Q 标签头中的TCI字段中。&#xff0c;和VLAN ID一起使用&#xff0c;位于高位起16-18bit字段&#xff0c;长度3bit&#xff0c;取值范围0-7&#xff0c;0优先级最低&…

DSCP 与IP 优先级IP优先级

首先看IPv4包头如下 其中&#xff0c;Qos用到的是Tos定义有下面两种&#xff1a; 老的IPv4 TOS Byte定义和值 新的DSCP定义和值 DSCP值 DSCP Value Meaning Drop Probability Equivalent IP Precedence Value 101 110 (46) High Priority Expedited Forwarding (EF) N/A…

IP Precedence、DSCP、TOS

刚开始接触QoS时&#xff0c;经常会被IP Precedence、DSCP、TOS这些名词搞迷糊&#xff0c;那么接下来就梳理一下。 首先 IP Precedence IPv4中有8bit作为TOS字段&#xff0c;一开始RFC791定义了TOS前三位为IP Precedence&#xff0c;划分了8个优先级&#xff0c;可用于流分类…

【网络】Cos和ToS和DSCP|Qos|PHB的含义和区别以及映射

目录 视频教程&#xff1a; 介绍和区别 Qos/Cos IP-TOS&#xff08;IPP/CS&#xff09;和DSCP PHB&#xff08;Per-Hop-Behaviors&#xff09; 区别 各个等级的DSCP值和含义(PHB) 映射 COS到DSCP的映射 IP-Precedence到DSCP的映射&#xff08;Tos-->DSCP&#xff09…

TOS 和DSCP

IPv4报文中有三种承载QoS优先级标签的方式&#xff0c;分别为基于二层的CoS字段&#xff08;IEEE802.1p&#xff09;的优先级、基于IP层的IP优先级&#xff08;IP Precedence&#xff09;字段ToS优先级和基于IP层的DSCP&#xff08;Differentiated Services Codepoint&#xff…