.NET简谈设计模式之(命令模式)

简介: 我们继续学习设计模式系列文章。 本篇要讲的是命令模式,其实命令模式也比较好理解,没有用到多高深的技术,也不需要多复杂的抽象。只需要我们脑海里能有一个大概的原型,等我们遇见类似问题的时候我们能通过巧妙的方式来解决。

我们继续学习设计模式系列文章

本篇要讲的是命令模式,其实命令模式也比较好理解,没有用到多高深的技术,也不需要多复杂的抽象。只需要我们脑海里能有一个大概的原型,等我们遇见类似问题的时候我们能通过巧妙的方式来解决。我们做应用层开发的大部分接触的都是一些模式、框架、思想等等,不像搞低层开发的,他们研究的可能多数是一些技术实现的问题,而我们是学习实现的方法论。应用层开发在技术的复杂程度上是有限的,在组合技术的实现上是复杂的。所以有一些.NET架构师确实比较厉害,他们能很早的就料到会出现什么问题,他们有很强的架构思想,对设计模式的掌握、对架构设计思想、对敏捷、极限等等都有了解,将它们化为一体,才能设计出非常漂亮的开发架构。[王清培版权所有,转载请给出署名]

[NET架构师也是我们每一个NET程序员梦寐以求的归属,我们向着这个目标努力吧。加油!]

命令模式:将调用封装成命令对象,通过命令对象进行调用,很好的消除调用者与被调用者之间的耦合。

这是我对命令模式的理解,定义有很多种,侧重点不同,理解就行了。我们引入问题,带着问题来学习模式能很好的“消化吸收”。

现在移动终端越来越流行,IPAD、IPHONE、家用设备等等,这是计算机发展的一种趋势,更是人类生活质量的重大提升,有了计算机所有的东西都是信息化、数字化、科技化,不用出门都能买东西,不用到家都能自动打开热水器烧水,不用动手都能吃到饭。看来我们选择软件开发是没错的,至少我们能改善自己的生活环境。

我们来改善一下我们自己的家庭环境,使用全数字化,用一个移动终端来控制家里的所有的电子设备,比如微波炉、热水器、电视机、冰箱等等。只要是智能设备我们都能控制。

[软件是对硬件编程,使用软件来编写硬件处理逻辑]

我们假设这个终端设备叫做家庭设备控制中心,我们要开发一个这样的设备来对所有的这些家用电器进行控制,但是这些家用电子各种各样,不管是从造型上还是内部实现上都有千差万别,想要用这个终端进行统一的控制似乎不太容易。这个终端不是死的,家用电子可能会随着时间的长久而损坏,当我们更换新的家用电器时,我们的终端要能一样工作,只需要简单的配置一下就能控制新的电器。[王清培版权所有,转载请给出署名]

所以这里引入了两个问题,第一个是控制终端不能随着家用电器的变化而改动,第二个是不可能每个家用电器都按照终端的规定进行制造。我们需要有一种办法来解决这矛盾的局面。救命稻草来了,我们可以运用“命令模式”的思想来解决这种矛盾的局面。

我们先来看一个命令模式的大概流程图。

1:

在这种情况下,调用者与被调用者都不需要改动,只需要在这两者之间加上命令对象来传达这种调用者吩咐的命令就行了。

家用终端可能有多个按钮,每个按钮控制不同的电器,我们只需要将上图的原理带入到终端中就行了。

2:

这样就可以用一个遥控器来控制任意的电器设备了。我们来看看代码是怎么实现的,当然实现的方式有很多种,每种各有优缺点,本篇文章以入门为主。

电视机代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    /// <summary>
    /// 电视机
    /// </summary>
    public class Television
    {
        /// <summary>
        /// 模式是关闭的
        /// </summary>
        bool isopen = false;
        /// <summary>
        /// 切换关闭、打开
        /// </summary>
        public string Switch()
        {
            if (isopen)
            {
                isopen = false;
                return "关闭电视机";
            }
            else
            {
                isopen = true;
                return "打开电视机";

            }
        }

    }
}

电视机命令对象代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    /// <summary>
    /// 电视机命令对象
    /// </summary>
    public class TeleisionCommand : CommandInterface
    {
        /// <summary>
        /// 电视机对象
        /// </summary>
        private Television Tv = new Television();
        #region CommandInterface 成员
        /// <summary>
        /// 执行命令
        /// </summary>
        public string Execute()
        {
            return Tv.Switch();
        }

        #endregion
    }
}

命令接口代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    /// <summary>
    /// 命令接口
    /// </summary>
    public interface CommandInterface
    {
        /// <summary>
        /// 执行命令
        /// </summary>
        string Execute();
    }
}

控制中心代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    /// <summary>
    /// 控制中心
    /// </summary>
    public static class ControlContent
    {
        private static CommandInterface Command;
        public static void SetControlObjectCommand(CommandInterface cobject)
        {
            Command = cobject;
        }
        public static string ExecuteControlObject()
        {
            return Command.Execute();
        }
    }
}

模拟代码:

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            TeleisionCommand tvcommand = new TeleisionCommand();

            ControlContent.SetControlObjectCommand(tvcommand);
            Console.WriteLine(ControlContent.ExecuteControlObject());
            Console.ReadLine();
        }
    }
}

总结:命令模式就讲完了,大概的理论就是在中间架设一个命令对象将调用者与被调用者分离开来,解决两者之间的耦合。

目录
相关文章
|
11天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1225 5
|
10天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1204 87
|
10天前
|
云栖大会
阿里云云栖大会2025年9月24日开启,免费申请大会门票,速度领取~
2025云栖大会将于9月24-26日举行,官网免费预约畅享票,审核后短信通知,持证件入场
1791 13
|
20天前
|
人工智能 运维 安全
|
3天前
|
资源调度
除了nrm-pm,还有哪些工具可以管理多个包管理器的源?
除了nrm-pm,还有哪些工具可以管理多个包管理器的源?
233 127
|
3天前
|
前端开发
Promise的then方法返回的新Promise对象有什么特点?
Promise的then方法返回的新Promise对象有什么特点?
176 2