用继承的方式来给Dongle模块做一个框架不能保证良好的拓展性,因为对dongle的操作行为和方案商绑定在了一起。
为了让新的方案商加入时不去考虑哪些自己该覆盖,哪些接口不需要覆盖,可以尝试用接口来处理方案商提供的api
然后,所有的方案商都继承这些接口来实现api就行了,这样的话,可以公司自己定制接口,然后将接口发布给方案商去实现,也便于双方的合作。
比如scanDongle,getDongleInfo这些必需的接口可以要求方案商强制实现。而setDongleToMode这些可选接口可由方案商选择性实现:
参考一个别人的文章表述这种设计:
C++中抽象类和接口的区别介绍
C++中是没有接口这个语法上的概念,所以这种面向接口编程思想是通过纯虚基类来实现的:
首先看方案商直接面对接口编程:
各个方案商必须实现的一些通用接口放在这里:
class BasePolicy{
public:
BasePolicy();
~BasePolicy();
virtual void scanDongle() = 0;
virtual void getDongleInfo()=0;
};
class PolicyIflytek : public BasePolicy {
public:
PolicyIflytek();
~PolicyIflytek();
virtual void setDongleToNomalMode() = 0;
};
class PolicyNanosic : public BasePolicy {
public:
PolicyNanosic();
~PolicyNanosic();
virtual void setDongleToIspMode() = 0;
};
class VendorIflytek : public BaseVendor,public PolicyIflytek{
public:
VendorIflytek();
~VendorIflytek();
void scanDongle();
void getDongleInfo();
void setDongleToNomalMode();
};
方案商Nanosic:需要实现指定策略PolicyNanosic的所有接口
class VendorNanosic : public BaseVendor,PolicyNanosic{
public:
VendorNanosic();
~VendorNanosic();
void scanDongle();
void getDongleInfo();
void setDongleToIspMode();
};
//create a vendor
BaseVendor *vendor = new VendorIflytek();
//excute a vendor behavior
vendor->scanDongle();
//create a vendor
VendorNanosic *nanosic = new VendorNanosic();
//excute a vendor behavior
nanosic->setDongleMode(1);
运行结果:
这里注意的是,因为所有的接口都定义成纯虚函数的形式,所以如果方案商有一部分接口没有实现,是不被允许的,比如方案商Nanosic有一个通用接口getDongleInfo没有实现:
#include "VendorNanosic.h"
VendorNanosic::VendorNanosic(){
LOGE("VendorNanosic::VendorNanosic");
}
VendorNanosic::~VendorNanosic(){
LOGE("VendorNanosic::~VendorNanosic");
}
void VendorNanosic::scanDongle(){
LOGE("VendorNanosic::scanDongle");
}
/*这个接口的实现注释掉不实现,是不行的(头文件中也注释掉)
void VendorNanosic::getDongleInfo(){
LOGE("VendorNanosic::getDongleInfo");
}
*/
void VendorNanosic::setDongleMode(int mode){
LOGE("VendorNanosic::setDongleMode,mode = %d",mode);
if(mode == 1)
{
iSetDongleMode = new SetDongleToIspMode();
}else{
iSetDongleMode = new SetDongleToNormalMode();
}
iSetDongleMode->setDongleMode();
}
AndroidPeripheralAssist/jni/main.cpp: In function 'int main(int, char**)':
AndroidPeripheralAssist/jni/main.cpp:73:45: error: cannot allocate an object of abstract type 'VendorNanosic'
AndroidPeripheralAssist/jni/vendors/nanosic/VendorNanosic.h:13:7: note: because the following virtual functions are pure within 'VendorNanosic':
AndroidPeripheralAssist/jni/vendors/../policys/BasePolicy.h:14:15: note: virtual void BasePolicy::getDongleInfo()
AndroidPeripheralAssist/jni/vendors/BaseVendor.h:18:15: note: virtual void BaseVendor::getDongleInfo()
AndroidPeripheralAssist/obj/local/armeabi/objs/android_peripheral_assist/main.o] Error 1
这样用接口,策略,方案商三个体系分析来设计的话,各个方案商就只需要针对给出的策略(即接口集)来进行编程,且可以达到强制方案商必须实现指定的某些接口的目的。
不过这样的话,会出现一个问题,每一个接口表示一种行为,而如果方案商对这一行为有好几种实现方式,还不能让方案商将其针对每个接口的多种实现都方便地纳入到框架中来呢?这个下一篇博文会进行处理。