汇编的的各类源码--break

 1 引言

  我的一个实际项目中,由于希望通过一致的接口控制各种型号的设备,并且可以方便的随时扩充,以便将来支持更多的型号。因此,必须在运行时指定设备的型号。

  为了使应用程序可以透明的控制各种型号的设备,所以建立了一个简单的继承体系,设计一个协议类(Protocol Class)作为设备的控制接口,并且为每个型号的设备设计了一个具体的类,从协议类派生并且实现了抽象的公共接口。

  因此,我需要一种手段,根据设备的型号在运行时动态的创建设备类实例。否则,如果在编译时硬编码(Hard Code)设备配置,将失去实用性和灵活性。

  最终的结果是,需要这样一种技术,可以实现

    Motor* motor=ClassByName("IM9001");

  类似的功能。

2 设计和实现

  现有的关键类的代码片断如下:

  class IntelligentMotor
    {
    public:
      IntelligentMotor(const std::string& port_name);
      virtual bool Start()=0;
      virtual bool Stop()=0;
      virtual ~IntelligentMotor();
    };
  class IM9001  :  public IntelligentMotor
    {
    public:
      IM9001(const std::string& port_name);
      virtual bool Start();
      virtual bool Stop();
      virtual ~IM9001();
    private:
      // ...
    };
  class IM9002  :  public IntelligentMotor
    {
    public:
      IM9002(const std::string& port_name);
      virtual bool Start();
      virtual bool Stop();
      virtual ~IM9002();
    private:
      // ...
    };
  // more model ...

  如何实现ClassByName呢?

  我们当然可以在ClassByName中使用一个多重分支检查来实现,也就是

  IntelligentMotor* ClassByName(const std::string& model_name,
      const std::string& port_name)
    {
      if (model_name=="IM9001")
        return new IM9001(port_name);
      else if (model_name=="IM9002")
        return new IM9002(port_name);
      // 所有支持的型号
      else
        throw "不支持该型号的设备。";
    }

  然而这种编程风格是糟糕的。随着系统支持的型号种类增加,分支检查语句的长度也会同时增加,造成代码尺寸膨胀和可维护性的下降。

http://www.56.com/p89/v_MTI0ODU1NTM0.html
http://www.56.com/p82/v_MTI0ODU1NjE1.html
http://www.56.com/p36/v_MTI0ODU1NjU3.html
http://www.56.com/p73/v_MTI0ODU1Njk0.html
http://www.56.com/p30/v_MTI0ODU1NzM5.html
http://www.56.com/p77/v_MTI0ODU1Nzg2.html
http://www.56.com/p31/v_MTI0ODU1ODI4.html
http://www.56.com/p72/v_MTI0ODU1ODY5.html
http://www.56.com/p36/v_MTI0ODU1OTIx.html
http://www.56.com/p57/v_MTI0ODU1OTQy.html
http://www.56.com/p30/v_MTI0ODU2MDAz.html
http://www.56.com/p78/v_MTI0ODU2MDUx.html
http://www.56.com/p41/v_MTI0ODU2MTAy.html
http://www.56.com/p29/v_MTI0ODU2MTc4.html
http://www.56.com/p82/v_MTI0ODU2MjMx.html
http://www.56.com/p40/v_MTI0ODU2Mjc3.html
http://www.56.com/p93/v_MTI0ODU2MzMw.html
http://www.56.com/p55/v_MTI0ODU2Mzgw.html
http://www.56.com/p29/v_MTI0ODU2NDQy.html
http://www.56.com/p77/v_MTI0ODU2NDkw.html
http://www.56.com/p31/v_MTI0ODU2NTMy.html
http://www.56.com/p79/v_MTI0ODU2NTgw.html
http://www.56.com/p65/v_MTI0ODU2NzQy.html
http://www.56.com/p41/v_MTI0ODU2ODA2.html
http://www.56.com/p17/v_MTI0ODU2ODcw.html
http://www.56.com/p68/v_MTI0ODU2OTIx.html
http://www.56.com/p37/v_MTI0ODU2OTc4.html
http://www.56.com/p89/v_MTI0ODU3MDMw.html
http://www.56.com/p89/v_MTI0ODU3MTE4.html
http://www.56.com/p54/v_MTI0ODU3MTcx.html
http://www.56.com/p32/v_MTI0ODU3MjM3.html
http://www.56.com/p98/v_MTI0ODU3MzAz.html
http://www.56.com/p67/v_MTI0ODU3MzYw.html
http://www.56.com/p29/v_MTI0ODU3NDEw.html
http://www.56.com/p56/v_MTI0ODU3NTI1.html
http://www.56.com/p59/v_MTI0ODU3NjE2.html
http://www.56.com/p37/v_MTI0ODU3Njgy.html
http://www.56.com/p36/v_MTI0ODU3NzY5.html
http://www.56.com/p80/v_MTI0ODU3ODEz.html
http://www.56.com/p81/v_MTI0ODU3OTAy.html
http://j.renren.com/album/1308211143499717194
http://j.renren.com/album/1308211144140700223
http://j.renren.com/album/1308211144277908860
http://j.renren.com/album/1308211144477059926
http://j.renren.com/album/1308211145001299068
http://j.renren.com/album/1308211145153868635
http://j.renren.com/album/1308211145267091880
http://j.renren.com/album/1308211145391797021
http://j.renren.com/album/1308211145551496277
http://j.renren.com/album/1308211146099580557
http://j.renren.com/album/1308211146268678625
http://j.renren.com/album/1308211146480258043
http://j.renren.com/album/1308211147045427845
http://j.renren.com/album/1308211147153231057
http://j.renren.com/album/1308211147295725711
http://j.renren.com/album/1308211147458911246
http://j.renren.com/album/1308211148164489251
http://j.renren.com/album/1308211148440778335
http://j.renren.com/album/1308211149067919726
http://j.renren.com/album/1308211149260990724
http://j.renren.com/album/1308210942289161150
http://j.renren.com/album/1308210942545942286
http://j.renren.com/album/1308210943113153616
http://j.renren.com/album/1308210943324233194
http://j.renren.com/album/1308210943482577750
http://j.renren.com/album/1308210944078962414
http://j.renren.com/album/1308210944258234050
http://j.renren.com/album/1308210944536211600
http://j.renren.com/album/1308210945377994557
http://j.renren.com/album/1308210946000290113
http://j.renren.com/album/1308210946231810773
http://j.renren.com/album/1308210946454306373
http://j.renren.com/album/1308210947029807745
http://j.renren.com/album/1308210947226620833
http://j.renren.com/album/1308210947500998159
http://photo.163.com/q/6646839/?mid=174327044
http://photo.163.com/q/6646836/?mid=174327044
http://photo.163.com/q/6646832/?mid=174327044
http://photo.163.com/q/6646828/?mid=174327044
http://photo.163.com/q/6646823/?mid=174327044
http://photo.163.com/q/6646815/?mid=174327044
http://photo.163.com/q/6646809/?mid=174327044
http://photo.163.com/q/6646802/?mid=174327044
http://photo.163.com/q/6646789/?mid=174327044
http://photo.163.com/q/6646779/?mid=174327044
http://photo.163.com/q/6654337/?mid=174322057
http://photo.163.com/q/6654328/?mid=174322057
http://photo.163.com/q/6654319/?mid=174322057
http://photo.163.com/q/6654309/?mid=174322057
http://photo.163.com/q/6654296/?mid=174322057
http://photo.163.com/q/6654285/?mid=174322057
http://photo.163.com/q/6654277/?mid=174322057

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值