C#设计模式之命令模式

R语言机器学习算法实战系列(四)随机森林算法分类器+SHAP值 (Random Forest) 本文介绍了如何使用R语言实现随机森林算法,用于构建乳腺癌分类器。随机森林通过多棵决策树投票判断标签,具有避免偏差和提升模型效果的优势。文章详细讲解了数据下载、R包加载、数据预处理、特征选择、模型构建与评估等步骤。数据集包含569份恶性和良性肿瘤样本的32类指标,通过随机森林模型进行特征选择和分类。最终,文章提供了完整的代码和可视化结果,帮助读者理解并实现随机森林算法。 阅读详情

命令模式


本篇博客将介绍命令模式,命令模式是常用的行为型设计模式之一,他将请求发送者与请求接收者解耦,请求发送者通过命令对象来间接引用接收者,使得系统具有更好的灵活性。

模式分类

型卫星设计模式。

模式灵感的来源

在现实生活中,人们通过使用开关来控制一些电器的打开和关闭,例如电灯或者电风扇。在购买开关时,购买者并不知道它将来会控制什么电器,也就是说开关本身和电器是没有直接关系的。一个开关在安装之后可能会用来控制电灯,也可能会用来控制电风扇,这一切都取决于你如何栓电线。我们可以将开关理解为请求的发出者,电灯或者电风扇理解为请求的处理者。开关和电灯之间没有直接关系,他们通过电线产生联系,当我们想让开关控制电风扇时,我们让电线连接开关和电风扇即可。

在软件开发中也有许多像是电灯和电风扇的这种请求者和请求处理者的关系,例如一个按钮是是用于发送“关闭窗口”请求的,也就是“开关”角色,而单击事件处理类则是请求的处理者,也就是“电灯”角色,此时我们可以选择让按钮直接调用事件处理类的相应方法,但这样会提高系统的耦合性。为了降低系统的耦合性我们可以引入一个“电线”的角色,将“开关”和“电灯”解耦,这个“电线”角色就是命令模式。命令模式的目的就是解耦请求者和处理者,让系统拥有更好的灵活性。

模式类图

在这里插入图片描述

命令模式的核心构件主要有命令对象构成,但经典命令模式会将调用者和处理者也算在里面,所以经典命令模式由4个对象构成:

Command(抽象命令类):

抽象命令类一般是一个抽象类或者接口,在其中声明了用于执行请求的方法,通过这些方法可以调用请求接收者的相关操作。

ConcreteCommand(具体命令类):

具体命令类时抽象命令类的子类,实现了在抽象命令类中声明的方法,它对应具体的接收者对象。

Invoker(调用者):

调用者就是请求的发出者,它通过命令对象来执行请求。

Receiver(接收者):

接收者执行与请求相关的操作,具体实现对请求的业务逻辑。

代码实现

例子:为了用户使用方便,某系统提供了一系列功能键,用户可以自定义功能键的功能,例如功能键FunctionButton可以用于退出系统或者显示帮助文档,请使用命令模式设计这个系统。

Command命令类:

namespace Command.Command.Example
{
    public abstract class Command
    {
        private ButtonReceiver _buttonReceiver;
        private ReceiverFactory _receiverFactory = new ReceiverFactory();

        public Command(string name)
        {
            _buttonReceiver = _receiverFactory.CreateReceiver(name);
        }

        public void Execute()
        {
            _buttonReceiver.Operation();
        }
    }
}

ButtonReceiver按钮事件接收者类

namespace Command.Command.Example
{
    public abstract class ButtonReceiver
    {
        public const string NAME = "ButtonReceiver";
        public abstract void Operation();
    }
}

ReceiverFactory接收者工厂,用于为一个命令具体绑定具体的接收者

using System;

namespace Command.Command.Example
{
    public class ReceiverFactory
    {
        public ButtonReceiver CreateReceiver(string receiverName)
        {
            Type receiverType = Type.GetType($"Command.Command.Example.Receiver.{receiverName}");
            ButtonReceiver buttonReceiver = Activator.CreateInstance(receiverType) as ButtonReceiver;
            return buttonReceiver;
        }
    }
}

HelpButtonReceiver帮助文档显示处理类

using System;

namespace Command.Command.Example.Receiver
{
    public class HelpButtonReceiver : ButtonReceiver
    {
        public new const string NAME = "HelpButtonReceiver";
        public override void Operation()
        {
            Console.WriteLine($"帮助功能");
        }
    }
}

ExitButtonReceiver退出文档处理类

using System;

namespace Command.Command.Example.Receiver
{
    public class ExitButtonReceiver : ButtonReceiver
    {
        public new const string NAME = "ExitButtonReceiver";
        public override void Operation()
        {
            Console.WriteLine($"退出功能");
        }
    }
}

HelpCommand帮助命令

namespace Command.Command.Example.CommandFile
{
    public class HelpCommand : Command
    {
        public HelpCommand(string name) : base(name)
        {
        }
    }
}

ExitCommand退出命令

namespace Command.Command.Example.CommandFile
{
    public class ExitCommand : Command
    {
        public ExitCommand(string name) : base(name)
        {
        }
    }
}

Program类

using System;
using System.Diagnostics;
using Command.Command.Example;
using Command.Command.Example.CommandFile;
using Command.Command.Example.Receiver;
using Command.Command.Question6;
using Command.Command.Question6.MyCommand;
using Command.Command.Question6.MyMenu;
using Command.Command.Question6.MyMenuItem;
using Command.Command.Question6.MyOperation;

namespace Command
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            Command.Example.Command command = new ExitCommand(ExitButtonReceiver.NAME);
            Command.Example.Command command2 = new HelpCommand(HelpButtonReceiver.NAME);

            Command.Example.Command command3 = new ExitCommand(HelpButtonReceiver.NAME);
            Command.Example.Command command4 = new HelpCommand(ExitButtonReceiver.NAME);
            command.Execute();
            command2.Execute();
            command3.Execute();
            command4.Execute();
        }
    }
}

命令队列

传统的命令模式一般是一个请求者对应一个接收者,如果我们的请求者需要对应多个接收者的时候,这个时候就需要用到命令队列,命令队列简单来说就是这个命令类会保存多个命令对象,通常会将这些命令对象集中保存在一个命令集合中,请求执行方法就变成了遍历命令集合中的命令对象并执行他们的请求执行方法。当然如果我们将命令队列作为一个特殊命令让其也继承抽象命令类,这就形成了俗称“宏命令”的模式,当然是命令模式的变种。当我们让命令队列继承抽象命令类时,会形成组织模式的结构,“宏命令”模式指的就是这种结构的命令模式。

命令模式总结

命令模式的优点:

  1. 命令模式降低了系统的耦合性。
  2. 通过命令模式,新的命令可以很轻松的加入系统中,且不会影响其他类,符合开闭原则。

命令模式的缺点:

  1. 使用命令模式可能会导致某些系统存在过多的命令类,会影响使用。
Vue2 - 详细实现接入使用海康威视监控云端显示及控制功能,网站集成安装海康监控及实时监控显示、回放、放大缩小画面、视频画面截图、截屏抓拍、摄像头控制,实时推流及播放器解决延迟卡顿等问题(详细代码) vue2,nuxt2,海康威视,海康监控,摄像头监控,vue对接海康处理接口认证规则,监控实时预览和回放功能,海康api接口,安全认证,海康开放平台,官方文档,播放海康摄像头的监控视频,海康实时监控播放详细步骤,web,黑屏,特别卡不流畅怎么办,解决无法推流,录像,连接不上,vue,海康,vue海康视频监控,海康开放平台,实时监控画面,海康插件,视频播放,回放,视频流地址,取流协议,视频sdk播放,hik,rtsp,rtmp,hls,ws,网站,网页,h5页面,后台管理系统,vue2对接海康监控设备,无法连 阅读详情

相关推荐

别再死磕V1了!手把手教你用WPS Web Office V3 SDK快速集成(附Java Demo避坑指南)

本文详细介绍了如何从WPS Web Office V1迁移到V3版本,重点讲解了V3在性能、安全性和扩展性上的优势,以及Java开发者如何快速集成V3 SDK。文章包含核心功能实现、高级功能适配(如Solon框架)和常见问题排查指南,帮助开发者高效完成迁移并避免常见陷阱。

weixin_27215337的博客 335

设计模式:命令模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

命令模式,它是一种行为型设计模式,它尝试将请求或操作封装成对象,从而降低系统的耦合度,增加系统的可扩展性,并支持撤销、重做、事务等功能。

web 602

edusrc挖掘思路

edusrc挖掘思路前言思路信息搜集系统账号常见漏洞实战分享1、确定目标,语法:site:xxxx.edu.cn2、账号密码组成我们知道了,谷歌语法查找工号3、爆破登录系统4、确定功能,抓具体的url5、添加单引号,报错,是mssql6、报数据库版本,到这一步就可以交了,已经是中危了后记 前言 一月份的时候偶然注意到edusrc,起初是抱着学习的心态去挖几个洞,可是后面发现有证书,而且还贼好看,于是我动了凡心,一顿操作也拿了几本,广西民大、山东理工、同济,未到的有浙大、上海理工,证书要求证书图片可以在我个人

qq_45414878的博客 2万+

C# 设计模式之命令模式

C# 设计模式之命令模式

鲤籽鲲的博客 1373

私彩视频开奖动画直播源码内部核心技术解析及修改可增加后台操控-持续更新文章!

其实在此很感谢能做出H5开奖系统的码农们,而我本人也喜欢分解此类的东西。 因为特殊原因,该东西本人就不做图片展示,以防他人商业化。 借用开奖摇奖代码首先分解首页index文件。代码如下:(后面持续在原有的作品上添加后台操作) 代码里写的//.....是我的注明代码的所需。 ​ <!DOCTYPE html> <html> <head> <...

yugua3837的博客 5995

Vue集成飞书前端JSSDK

文章目录前言<1>飞书前端JSSDK<2>使用步骤1.将JSSDK引入到VUE2.读入数据总结 前言 公司需要使用飞书软件,所以转战飞书开发,也是对新知识的探索与研究,飞书SDK也一直都在更新,路虽远,行必达。 <1>飞书前端JSSDK 1、官网地址:https://open.feishu.cn/document/uYjL24iN/uITO4IjLykDOy4iM5gjM 2、当前使用的飞书前端JSSDk的版本:1.5.4 <!-- 在html文档中 --&gt

A 1万+

命令模式-C#实现

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系.何时使用:将"行为请求者"与"行为实现者"解耦,将一组行为抽象为对象,可以实现二者之间的松耦合。

让每一个想学习编程的人,都能学会,都能看懂,看了都有收获! 853

基于转录逆转的药物重定向 GPS 模型

GPS是一个基于分子结构预测基因表达扰动的开源平台,由三个模块组成:RCL(在LINCS扰动数据上训练抗噪MLP)、GPS4Drugs(预测新化合物的基因表达谱并进行逆转评分)、MolSearch(基于MCTS的分子优化)。平台使用Morgan指纹和Gene Ontology注释作为特征输入,将基因表达扰动离散为三分类标签。训练数据来自LINCS Phase I的18,746个化合物和978个landmark基因,支持四细胞系独立训练,可用于药物重定向与化合物筛选。

听雨草堂 83

在C#中应用命令模式:设计和实现的最佳实践

命令模式是一种将请求封装为对象的设计模式,从而使得不同的请求、队列或者日志能够以对象的形式被处理。命令模式允许调用方在不需要了解被调用方操作细节的情况下执行某些操作。其核心思想在于:命令模式将方法调用、请求或者操作封装到单一对象中,提供了调用命令的对象与实际实现该命令的对象之间的松耦合。

weixin_41859354的博客 1921

三菱FX系列PLC模拟量输入AD模块的使用方法和相关编程设置详解

三菱FX系列PLC模拟量输入AD模块的使用方法和相关编程设置详解

Robot_PLC_HMI_Automation 1万+

【AUTOSAR-E2E】-2.2-配置E2E:基于E2EPW配置一个TX发送的Signal Group(使用E2E Profile 2)

《共13页精讲》:此法也适用于E2E Profile 4/5/6/7/11/22 目录 1 检查CAN Matrix Arxml/DBC是否满足E2E需求 2 在DaVinci Developer中为Port添加E2E保护 3 在DaVinci Configurator settings设置 4 如何使用应用层的E2E保护 5 结尾 <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> &lt.

「汽车电子助手」的博客 4218

C#设计模式之十四命令模式(Command Pattern)【行为型】

因为我们并不关心他们是谁,发出命令的人发出命令,可以继续做其他的事情,接受命令的人执行任务就可以,不需要你发出命令,还要监督我们完成,只要我们完成任务是合格的就行。我写的这个代码实现,没有突出命令的Redo和Undo,也没写命令的排队,但是大家要知道,之所以把行为抽象独立对象,就是要对其可以进行特殊处理。命令模式是把一个操作或者行为抽象为一个独立的对象,通过对命令的抽象化来使得发出命令的责任和执行命令的责任分隔开,也可以对独立的命令对象进行特殊操作,比如可以实现命令的撤销和恢复功能。

Small world 1040

Spring AI Alibaba实战训练营-20 基于注解驱动的MCP快速开发入门指南

本文详细讲解如何使用SpringAiAlibaba快速开发基于注解驱动的MCP应用。文章详细介绍了MCP协议并且重点介绍了Spring AI通过注解驱动的开发方式简化MCP服务开发。具体包括服务端和客户端的注解使用、城市最新时间查询MCP项目结构概览(服务端和客户端模块)以及环境配置要求。

program哲学 295

【C#设计模式】14.命令模式(Command Pattern)【行为型】

1.1 动机(Motivate) 在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合——比如需要对行为进行“记录、撤销/重做(undo/redo)、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。 1.2 意图(Intent) 将一个请求封装为一个对象,从而使你可用不同的请求对客户(客户程序,也是行为的请求者)进行参数化;对请求排队或记录请求日志,以及支持可撤销的操..

星Yeah 的博客 2559

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C#设计模式(15)——命令模式(Command Pattern)

C#设计模式(15)——命令模式(Command Pattern) 一、前言   之前一直在忙于工作上的事情,关于设计模式系列一直没更新,最近项目中发现,对于设计模式的了解是必不可少的,当然对于设计模式的应用那更是重要,可以说是否懂得应用设计模式在项目中是衡量一个程序员的技术水平,因为对于一个功能的实现,高级工程师和初级工程师一样都会实现,但是区...

fgmah2000的博客 245

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C# 设计模式:第十六章 - 行为型模式之命令模式(Command Pattern)

命令模式是一种行为型设计模式,它允许你将请求封装成对象,从而实现请求的参数化、队列化和可撤销操作等功能。通过命令模式,你可以将发起请求的对象与执行请求的对象解耦,使得系统更加灵活和可扩展。每个命令对象都包含了一个执行操作的方法(通常称为Execute()),并且可以包含撤销操作的方法(通常称为Undo()这样,你可以在任何时候执行或撤销某个命令,而不需要关心具体的实现细节。在这章中,我们学习了命令模式的基本概念、应用场景、实现方法以及注意事项。

caifox的博客 1118

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# 23种设计模式(5)命令模式(Command Pattern)

命令模式(Command Pattern)是一种行为设计模式,它将一个请求封装为一个对象,从而允许用户用不同的请求、队列请求、记录请求日志,以及支持可撤销的操作等。命令模式的主要目的是将请求的执行者和请求的接收者解耦,使得请求发送者和接收者之间不必直接交互。

WangMing_X的博客 857

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

命令模式属于对象的行为型模式。命令模式是把一个操作或者行为抽象为一个对象中,通过对命令的抽象化来使得发出命令的责任和执行命令的责任分隔开。命令模式的实现可以提供命令的撤销和恢复功能。四、命令模式的适用场景在下面的情况下可以考虑使用命令模式:系统需要支持命令的撤销(undo)。命令对象可以把状态存储起来,等到客户端需要撤销命令所产生的效果时,可以调用undo方法吧命令所产生的效果撤销掉。命令对象还可以提供redo方法,以供客户端在需要时,再重新实现命令效果。系统需要在不同的时间指定请求、将请求排队。

Asincereman的专栏 834

命令模式(Command Pattern)——C#设计模式十五

原文地址:http://www.cnblogs.com/zhili/p/CommandPattern.html 原文作者:Learning hard 一、前言 之前一直在忙于工作上的事情,关于设计模式系列一直没更新,最近项目中发现,对于设计模式的了解是必不可少的,当然对于设计模式的应用那更是重要,可以说是否懂得应用设计模式在项目中是衡量一个程序员的技术水平,因为对于一个功能的实现,高级工程师和初级...

U3D开发 194

C# -- 设计模式 -- Command Pattern 命令模式

记录《Head First 设计模式》 参考 Graphic Design Patterns网站 与 深入设计模式 目的是检查学习情况,同时方便以后复习。 文章目录一、简述1-1 意图1-2 动机1-3 模式结构1-4 时序图二、代码示例:1-1 封装请求1-2 撤销三、总结1-1 模式分析1-2 模式优缺点1-3 适合场景1-4 模式应用1-5 总结 一、简述 1-1 意图 命令模式 CommandPattern: Encapsulate a request as an Object . Allow

M1234uy的博客 332

C#设计模式:命令模式(Command Pattern)

一,什么是命令模式(Command Pattern)? 命令模式:将请求封装成命令对象,请求的具体执行由命令接收者执行; 二,如下代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; ...

dcujcivw769565的博客 162

.NET(C#) 设计模式 命令模式

设计模式(Design pattern)是代码设计经验的总结。设计模式主要分三个类型:创建型、结构型和行为型。创建型是对象实例化的模式,创建型模式用于解耦对象的实例化过程,主要用于创建对象。结构型是把类或对象结合在一起形成一个更大的结构,主要用于优化不同类、对象、接口之间的结构关系。行为型是类和对象如何交互,及划分责任和算法。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。本文主要介绍.NET(C#) 设计模式 命令模式。 原文地址:.NET(C#) 设计模式 命令模式 ...

m0_60105488的博客 170
上一篇: C#设计模式之责任链模式
下一篇: C#设计模式之解释器模式
BraveRunTo
博客等级 码龄7年 91粉丝 75原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值