一、Dongle烧写模块的需求:
1.框架需要兼容各个方案商,各方案商dongle使用的基本流程是一致的
2.要方便地让各个方案商添加新的功能
3.有很多个方案商,要方便各个新的方案商加入进来,这样的话,就可以使用工厂模式
这里先采用简单的白箱框架
二、设计演化流程:
如果用继承方式来设计的话,比如
方案商基类:
//设计一个方案商基类,比如方案商会提供scanDongle和getDongleInfo这些接口,然后具体的方案商继承这个基类
class BaseVendor{
public:
BaseVendor();
~BaseVendor();
IScanDongle *iScanDongle;
virtual void scanDongle();
virtual void getDongleInfo();
};
方案商Iflytek:
class VendorIflytek : public BaseVendor{
public:
VendorIflytek();
~VendorIflytek();
void scanDongle();
};
方案商Nanosic:
Class VendornNanosic : public BaseVendor{
VendornNanosic();
~VendornNanosic();
};
VendorIflytek::VendorIflytek(){
LOGE("VendorIflytek::VendorIflytek");
}
VendorIflytek::~VendorIflytek(){
LOGE("VendorIflytek::~VendorIflytek");
}
void VendorIflytek::scanDongle(){
LOGE("VendorIflytek::scanDongle");
iScanDongle = new ScanDonglebyBluetooth();
iScanDongle->scanDongle();
}
测试一下:
//create a vendor
BaseVendor *vendor = new VendorIflytek();
//excute a vendor behavior
vendor->scanDongle();
结果:
会发现:如果采用派生类继承的方式来实现的话,每一个派生类都必须小心检查哪些类是需要覆盖的,比如方案商Nanosic加入的时候,没有覆盖掉getDongleInfo这个函数,就会采用基类的实现,而这不一定是新加入的方案商所希望的。所以这里还需要做其他处理