天天看点

建议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:

   switch(command)

        case DriveCommand.Start:

            //车辆启动

             break;

       case  DriveCommand.Stop:

         //车辆停止

      break;

     default:

         break;

}

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

      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

            //停止

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

static void Main(string[] args)

    Commander commander=new StartCommander();

     Driver(commander);

     commander=new StopCommander();

static void Drive(Commander commander)

    commander.Execute();

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

继续阅读