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

举报
AI浩 发表于 2021/12/22 23:26:36 2021/12/22
【摘要】 假设开发自动驾驶系统。在设计之初,自动驾驶系统拥有一个驾驶系统命令的枚举类型: enum DriveCommand {        start,        stop } 又假设有一个驾驶的方法处理车辆接收到的指令。一开始我们这样编码: s...

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

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方法,即使增加再多的命名,也不需要对齐修改。

文章来源: wanghao.blog.csdn.net,作者:AI浩,版权归原作者所有,如需转载,请联系作者。

原文链接:wanghao.blog.csdn.net/article/details/106786459

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。