建议104:用多态代替条件语句

假设开发自动驾驶系统。在设计之初,自动驾驶系统拥有一个驾驶系统命令的枚举类型:

enum DriveCommand

       start,

       stop

又假设有一个驾驶的方法处理车辆接收到的指令。一开始我们这样编码:

static void Main(string[] args)

{

   DriveCommand comand=DriveCommand.Start;

   Drive(comand);

   comand=DriveCommand.Stop;

    Drive(command);

}

static void Drive(DriveCommand command)

{

     if(command==DriveCommand.Start)

     {

        //车辆启动

      } else if(command==DriveCommand.Stop)

       {

         //车辆停止

        }

}

或者用Switch:

static void Drive(DriveCommand command)

{

    switch(command)

     {

         case DriveCommand.Start:

             //车辆启动

              break;

        case  DriveCommand.Stop:

          //车辆停止

       break;

      default:

          break;

 }

}

随着更多的功能被开发出来,我们加入的命令也越来越多。

enum DriveCommand

       start,

       stop,

       pause,

       turnLeft

          .

          .

随着DriveCommand元素的增加,采用if语句或switch语句会非常的混乱,在复杂的兄台你各种命令可能会多达上百条。每增加一个命令我们都要修改Drive方法。Drive方法将会及其膨胀,并且每一行的代码几乎一样。

在这种情况下,我们不得不考虑重构原来的代码,遵守设计模式中的开闭原则。开闭原则指的是:对扩展开放,修修改关闭。

设计个抽象类:

abstract class Commander

     public abstract void Execute();

所有的Start或者Stop之类的命令,继承这个抽象类。

class StartCommander:Commander

        public override void Execute()

         {

             //启动

         }

class StopCommander:Commander

        public override void Execute()

         {

             //停止

         }

使用多态后,下面的代码改为:

static void Main(string[] args)

{

     Commander commander=new StartCommander();

      Driver(commander);

      commander=new StopCommander();

      Driver(commander);

}

static void Drive(Commander commander)

{

     commander.Execute();

}

这样代码简洁了不少,并且,可扩展性增强了,对于Drive方法,即使增加再多的命名,也不需要对齐修改。

上一篇:c – 现在非临时工作的非常规参考?


下一篇:c – 如何使用在函数中本地创建的对象而不将其复制到内存中?