.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();
        }
    }
}

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

时间: 2024-10-03 07:53:05

.NET简谈设计模式之(命令模式)的相关文章

.NET简谈设计模式之(策略模式)

策略模式在我们日常开发中经常被用到,这篇文章不是策略模式的深入讨论和学术研究,只是让初学者能有个基本的了解. 什么叫策略:1. 可以实现目标的方案集合:2. 根据形势发展而制定的行动方针和斗争方法:3. 有斗争艺术,能注意方式方法. 什么叫模式:模式(Pattern)其实就是解决某一类问题的方法论.把解决某类问题的方法总结归纳到理论高度,那就是模式.模式是一种指导,在一个良好的指导下,有助于你完成任务,有助于你作出一个优良的设计方案,达到事半功倍的效果.而且会得到解决问题的最佳办法. 什么叫策略

.NET简谈设计模式之(工厂模式)

文章开头本人申明一点,本人写的文章力求让看的人能理解精髓而不是专业化,博客园的好多人在写文章的时候总想着怎么怎么专业化,巴不得看的人都看不懂才能体现出他的技术,他的牛B,技术不是用来显威风用的,在你掌握了某种技术的时候,不要想着横扫博客园之类的思想,有点技术就开始浮躁连说话都开始像李莲英:我不是想这样攻击别人,在技术的这条路上大家能平易近人互相学习,以交流技术为主,不要想着看别人的文章就是在挑刺,想法设法打击别人的信心,人无完人,人外有人,山外有山,各有所长,大家互补才能真正使我们国家的软件实力

.NET简谈设计模式之(单件模式)

我们继续学习设计模式系列文章. 今天要讲的是单件模式,其实单件模式是比较简单的设计模式,在我们日常开发过程中也是经常用到的. 单件模式:单件模式是一种用于确保整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享时的程序设计方法. 我想如果初学者对一些基本概念能熟练掌握时,其实单件模式是很简单的,就是因为初学者对一些概念还不是很理解,我们先来扫除这些阻挡我们理解的障碍. 大部分的初学者都会搞不清楚"静态对象"与"实例对象"的区别.当然谁都有一个过渡期,

.NET简谈构件系统开发模式

在本人的".NET简谈插件系统开发模式"一文中我们详细介绍了插件系统开发模式的优越性,尽管.NET平台或者第三方提供的平台都为我们实现了底层插件原理模型,我们可以在上面进行开发,作为一名有求知欲的程序员才是一名合格的程序员:我们不能满足系统为我们提供的功能,我们要向下沉,沉的越深越好,躲开那些应用变化给我们带来的劳累感,所以我们是否需要掌握一些别人不会的技术,才能让我们在众多的程序员中脱颖而出呢:[王清培版权所有,转载请给出署名] 我们今天来探讨"构件"系统开发模式

php设计模式之命令模式使用示例

 这篇文章主要介绍了php设计模式之命令模式使用示例,命令模式将一个请求封装为一个对象,从而你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销操作 命令类: 1.命令角色:声明了一个给所有具体命令类的抽象接口.这是一个抽象角色. 2.具体命令角色:定义一个接受者和行为之间的弱耦合:实现execute方法,负责调用接受的相应操作.execute()方法通常叫做执行方法 3.客户角色:创建一个具体命令对象并确定其接受者. 4.请求者角色:负责调用命令对象执行请求,相关的方法叫

深入理解JavaScript系列(34):设计模式之命令模式详解

 这篇文章主要介绍了深入理解JavaScript系列(34):设计模式之命令模式详解,命令模式(Command)的定义是:用于将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及执行可撤销的操作,需要的朋友可以参考下     介绍 命令模式(Command)的定义是:用于将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及执行可撤销的操作.也就是说改模式旨在将函数的调用.请求和操作封装成一个单一的对象,然

设计模式 ( 十三 ) 命令模式Command(对象行为型)

设计模式 ( 十三 ) 命令模式Command(对象行为型) 1.概述         在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活.  例子1:电视机遥控器 : 遥控器是请求的发送者,电视机是请求的接收者,遥控器上有一些按钮如开,关,换频道等按钮就是具体命令,不同的按钮对应电视机的不

乐在其中设计模式(C#) - 命令模式(Command Pattern)

原文:乐在其中设计模式(C#) - 命令模式(Command Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd 介绍 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例 有一个Message实体类,某个类对它的操作有Insert()和Delete()方法.现在要求可以对之前的所有操作做撤销和重复. MessageModel using Sys

【设计模式】—— 命令模式Commond

模式意图 将一个请求封装成一个对象,从而对这个命令执行撤销.重做等操作. 典型的Eclipse开发中,编辑器的操作就需要用到这个模式,比如Undo.Redo等等. 另外这个模式使得一个命令的触发与接收解耦,这样我们就可以演变成把感兴趣的对象接收这个命令,当命令触发时,这些对象就会执行操作.这个机制也是java事件的处理方式. 应用场景 1 命令抽象成对象 2 在不同的时刻,指定或者排队命令 3 支持 Undo或者Redo等操作 4 修改日志,当系统崩溃时,利用修改日志执行撤销 5 原语操作上构造