我们继续学习设计模式系列文章。
本篇要讲的是命令模式,其实命令模式也比较好理解,没有用到多高深的技术,也不需要多复杂的抽象。只需要我们脑海里能有一个大概的原型,等我们遇见类似问题的时候我们能通过巧妙的方式来解决。我们做应用层开发的大部分接触的都是一些模式、框架、思想等等,不像搞低层开发的,他们研究的可能多数是一些技术实现的问题,而我们是学习实现的方法论。应用层开发在技术的复杂程度上是有限的,在组合技术的实现上是复杂的。所以有一些.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(); } } }
总结:命令模式就讲完了,大概的理论就是在中间架设一个命令对象将调用者与被调用者分离开来,解决两者之间的耦合。