C#设计模式之命令

在本篇中还是围绕着“IronMan”来讲,在上一篇“外观”中我们说到过“控制中心”。它是负责IronMan的核心,所有能想象到的功能都跟它有关系, 就在使用它的时候,发现了一些问题,比如使用它来命令部件做一些操作:

     /// <summary>
     /// 控制中心
     /// </summary>
     public class CenterController
     {
         public void Attact()
         {
             ComponteCase comCase = new ComponteCase();
             comCase.Attact();
         }
     }
     /// <summary>
     /// 部件
     /// </summary>
     public class ComponteCase
     {
         public void Attact()
         {
             Console.WriteLine("示例部件攻击1");
         }
     }

从上面的“控制中心”中可以看出,它是直接使用的部件,如果这时候要添加、修改或者删除部件的攻击方式,那么“控制中心”也要跟着做出修改。 耦合度很大,那怎么样要使“控制中心”和“部件”之间变得是松耦合呢?

命令模式的定义:将一组行为抽象为对象实现二者之间的松耦合

     /// <summary>
     /// 抽象命令
     /// </summary>
     public abstract class Command
     {
         public abstract void Execute();
     }
     /// <summary>
     /// 具体命令类(示例部件攻击命令)
     /// </summary>
     public class RealizeCommand : Command
     {
         private ComponteCase compontecase = new ComponteCase();
         public override void Execute()
         {
             //业务操作等等
             compontecase.Attact();
         }
     }

添加了抽象命令类和具体命令类,具体命令类已经代表了一个命令,就是示例部件攻击:

     /// <summary>
     /// 控制中心
     /// </summary>
     public class CenterController
     {
         private Command command;
         public CenterController(Command command)
         {
             this.command = command;
         }
         public void Attact()
         {
             command.Execute();
         }
     }

稍作修改的控制中心, 现在再来看一下,使用”控制中心”去使用攻击手段。

 CenterController centercontroller = new CenterController(new RealizeCommand());
 centercontroller.Attact();

也可以再新建其它的具体命令类,引用其它部件,使用其攻击方法,这样便实现了动态注入,把控制中心和部件 从紧耦合状态改变到了松耦合。 这里会有人有疑问了,如果要执行多个命令怎么办?

     /// <summary>
     /// 命令板
     /// </summary>
     public class CommandList
     {
         private List<Command> commands = new List<Command>();
         public CommandList() { }
         public CommandList(Command command)//动态注入
         {
             commands.Add(command);
         }
         public void AddCommand(Command command)
         {
             commands.Add(command);
         }
         public void RemoveCommand(Command command)
         {
             commands.Remove(command);
         }
         public void Execute()
         {
             foreach (Command command in commands)
             {
                 command.Execute();
             }
         }
     }

添加一个命令板类,再修改一下控制中心,使得“控制中心”和“抽象命令”间都进行消耦,下面再看一下修改后的“控制中心”:

     /// <summary>
     /// 控制中心
     /// </summary>
     public class CenterController
     {
         private CommandList commands;
         public CenterController(CommandList commands)
         {
             this.commands = commands;
         }
         public void Attact()
         {
             commands.Execute();
         }
     }

使用的方式还是和上一个方式相同,只是上个方式是把命令动态注入,现在修改成了把命令板动态注入。

命令模式就到这里了。。END

下一篇实现更佳的可扩展的命令模式