什么是命令模式?

article/2025/10/20 17:31:08

一、命令模式的定义

命令是对命令的封装,每一个命令都是一个操作,请求方发出请求,接收方接收请求,并执行操作。命令模式解耦了请求方和接收方,命令模式属于行为型模式

二、命令模式的uml图和通用写法

uml

在这里插入图片描述

通用写法

/*** 功能:命令的抽象*/
public interface ICommand {void execute();}/*** 功能:具体的命令*/
public class ConcreteCommand implements ICommand{Receiver receiver = new Receiver();@Overridepublic void execute() {receiver.action();}
}/*** 功能:命令接收者*/
public class Receiver {public void action() {System.out.println("具体执行");}
}/*** 功能:命令请求者*/
public class Invoker {private ICommand iCommand;public Invoker(ICommand iCommand) {this.iCommand = iCommand;}public void action() {iCommand.execute();}
}public class Tests {public static void main(String[] args) {ICommand command = new ConcreteCommand();Invoker invoker = new Invoker(command);invoker.action();}
}

命令模式中的4个角色:

  1. 接收者角色(Receiver):负责具体执行一个请求
  2. 命令角色(ICommand):定义需要执行的所有命令行为
  3. 具体的命令角色(ConcreteCommand):内部维护一个Receiver
  4. 请求者角色(Invoker):接收客户端的命令,并执行命令

三、遥控操作电视的例子

uml

在这里插入图片描述

/*** 功能:操作命令*/
public interface Command {void execute();
}/*** 功能:打开电视机*/
public class OpenCommand implements Command{private TV tv = new TV();@Overridepublic void execute() {tv.open();}
}/*** 功能:换台*/
public class ChangeCommand implements Command{private TV tv = new TV();@Overridepublic void execute() {tv.change();}
}/*** 功能:关闭电视机*/
public class CloseCommand implements Command{private TV tv = new TV();@Overridepublic void execute() {tv.close();}
}package com.kangping.command.lizi;import java.util.ArrayList;
import java.util.List;/*** 功能:遥控器*/
public class Control {public List<Command> commands = new ArrayList<>();public Control(Command command) {commands.add(command);}public Control(List<Command> commands) {this.commands.addAll(commands);}public void action() {commands.forEach(e -> e.execute());}
}/*** 功能:电视机*/
public class TV {public void open() {System.out.println("打开电视机");}public void change() {System.out.println("切换电视机");}public void close() {System.out.println("关闭电视机");}
}/*** 功能:*/
public class Tests {public static void main(String[] args) {Command command = new OpenCommand();Command changeCommand = new ChangeCommand();Command closeCommand = new CloseCommand();List list = new ArrayList<>();list.add(command);list.add(changeCommand);list.add(closeCommand);Control control = new Control(list);control.action();}
}

四、java 源码中的使用

命令模式在jdk中的使用

public interface Runnable {public abstract void run();
}

Runnable相当于命令的抽象。实际上调用线程的start以后,就有资格去抢cpu的资源,不要去写获取cpu资源的逻辑,抢到cpu资源以后执行run方法中的内容。Runnable接口把用户请求和cpu执行进行解耦。

五、优点和缺点

优点

  1. 通过引入命令的抽象接口,实现了命令请求与实现的解耦
  2. 扩展性良好,可以很容易的增加新命令

缺点
1.命令类可能过多


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

相关文章

设计模式之命令模式详解

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…

什么是DSCP,如何使用DSCP标记搭配ROS策略

什么是DSCP&#xff0c;如何使用DSCP标记搭配ROS策略 一、什么是DSCP DSCP&#xff1a;差分服务代码点&#xff08;Differentiated Services Code Point&#xff09;&#xff0c;IETF于1998年12月发布了Diff-Serv&#xff08;Differentiated Service&#xff09;的QoS分类标准…

TOS 和 DSCP理解

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

谈谈ES5和ES6的区别

我们都知道JavaScript是由三部分组成&#xff1a; 1. ECMAScript(核心)&#xff1a;规定了语言的组成部分>语法、类型、语句、关键字、保留字、操作符、对象 2. BOM(浏览器对象模型): 支持访问和操作浏览器窗口&#xff0c;可以控制浏览器显示页面以外的部分。 3. DOM(文…

ES5基础语法

一.类与对象 class father {that this;constructor(uname, age) {this.uname uname;this.age age;}sing(song) {console.log(this.uname song);}}class son extends father {constructor(uname,age) {super(uname,age);this.unameuname;this.age age;}sing(song){console.…

ES5语法

从今天起&#xff0c;我们开始接触JS部分&#xff0c;先从ES5一些简单的语法入手。下面先看下思维导图&#xff0c;确定我们的学习思路&#xff1a; 今天我们先学习代码规范&#xff0c;数据类型以及数据类型转换三个模块 代码规范 JS中的一切都区分大小写 标识符&#xff1…

es5 es6 互相转换

- 工具&#xff1a;Visual Studio Code - 具体过程 1.新建项目&#xff0c;dist存放ES6格式的&#xff0c;src存放ES5格式的&#xff0c;如下 index.html内容&#xff0c;此处引用dist中的js 2.打开终端&#xff08;ctrl &#xff09; npm需要安装&#xff0c;安装node即可…

套接字

套接字&#xff08;socket&#xff09;最早是由BSD在1982年引入的通信机制&#xff0c;目前已被广泛移植到主流的操作系统中。对于应用开发人员来说&#xff0c;套接字&#xff08;socket&#xff09;是一种特殊的I/O接口&#xff0c;也是一种文件描述符。socket是一种常用的进…