Dongle烧写模块重构(二)--让方案商直接面对接口编程
2014-10-20 22:55
363 查看
用继承的方式来给Dongle模块做一个框架不能保证良好的拓展性,因为对dongle的操作行为和方案商绑定在了一起。
为了让新的方案商加入时不去考虑哪些自己该覆盖,哪些接口不需要覆盖,可以尝试用接口来处理方案商提供的api
然后,所有的方案商都继承这些接口来实现api就行了,这样的话,可以公司自己定制接口,然后将接口发布给方案商去实现,也便于双方的合作。
比如scanDongle,getDongleInfo这些必需的接口可以要求方案商强制实现。而setDongleToMode这些可选接口可由方案商选择性实现:
参考一个别人的文章表述这种设计:
C++中抽象类和接口的区别介绍
C++中是没有接口这个语法上的概念,所以这种面向接口编程思想是通过纯虚基类来实现的:
首先看方案商直接面对接口编程:
各个方案商必须实现的一些通用接口放在这里:
方案商Iflytek的接口:
方案商Nanosic的接口:
方案商Iflytek:需要实现指定策略PolicyIflytek的所有接口
方案商Nanosic:需要实现指定策略PolicyNanosic的所有接口
测试代码:
运行结果:
这里注意的是,因为所有的接口都定义成纯虚函数的形式,所以如果方案商有一部分接口没有实现,是不被允许的,比如方案商Nanosic有一个通用接口getDongleInfo没有实现:
就不可以,会提示还有纯虚函数没有具体实现:
这样用接口,策略,方案商三个体系分析来设计的话,各个方案商就只需要针对给出的策略(即接口集)来进行编程,且可以达到强制方案商必须实现指定的某些接口的目的。
不过这样的话,会出现一个问题,每一个接口表示一种行为,而如果方案商对这一行为有好几种实现方式,还不能让方案商将其针对每个接口的多种实现都方便地纳入到框架中来呢?这个下一篇博文会进行处理。
为了让新的方案商加入时不去考虑哪些自己该覆盖,哪些接口不需要覆盖,可以尝试用接口来处理方案商提供的api
然后,所有的方案商都继承这些接口来实现api就行了,这样的话,可以公司自己定制接口,然后将接口发布给方案商去实现,也便于双方的合作。
比如scanDongle,getDongleInfo这些必需的接口可以要求方案商强制实现。而setDongleToMode这些可选接口可由方案商选择性实现:
参考一个别人的文章表述这种设计:
C++中抽象类和接口的区别介绍
C++中是没有接口这个语法上的概念,所以这种面向接口编程思想是通过纯虚基类来实现的:
首先看方案商直接面对接口编程:
各个方案商必须实现的一些通用接口放在这里:
class BasePolicy{ public: BasePolicy(); ~BasePolicy(); virtual void scanDongle() = 0; virtual void getDongleInfo()=0; };
方案商Iflytek的接口:
class PolicyIflytek : public BasePolicy { public: PolicyIflytek(); ~PolicyIflytek(); virtual void setDongleToNomalMode() = 0; };
方案商Nanosic的接口:
class PolicyNanosic : public BasePolicy { public: PolicyNanosic(); ~PolicyNanosic(); virtual void setDongleToIspMode() = 0; };
方案商Iflytek:需要实现指定策略PolicyIflytek的所有接口
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
这样用接口,策略,方案商三个体系分析来设计的话,各个方案商就只需要针对给出的策略(即接口集)来进行编程,且可以达到强制方案商必须实现指定的某些接口的目的。
不过这样的话,会出现一个问题,每一个接口表示一种行为,而如果方案商对这一行为有好几种实现方式,还不能让方案商将其针对每个接口的多种实现都方便地纳入到框架中来呢?这个下一篇博文会进行处理。
相关文章推荐
- Dongle烧写模块重构(三)--用策略模式自定行为框架,再交由方案商实现
- Dongle烧写模块重构(一)--最基本的设计,以继承可以组织多个方案商
- Dongle烧写模块重构(四)--用工厂模式将方案商从功能代码中抽离
- Dongle烧写模块重构(七)-加入当前已有的Dongle烧写功能
- Dongle烧写模块重构(五)--当前的设计
- Dongle烧写模块重构(九)-Makefile的简化修改及工程模块的独立
- Dongle烧写模块重构(八)--添加自测模块方便根据通信协议进行自测试
- Dongle烧写模块重构(六)--单模块单功能下的命令模式尝试
- 码农的自我修养-如何做模块重构的方案分析
- c++使用动态规划dp(自底向上)重构解决钢条切割输出最大收益和切割方案及运行实例结果
- python最简单直接的自定义模块导入方法
- 【重构模块】url
- 公共模块禁止直接访问
- 项目重构方案设计
- python CGI模块获取中文编码问题解决- 部分方案
- 关于第三方直接访问smartbi发布出去的文件夹(不是资源或者模块)
- 重构以后的业务模块
- 教你分分钟开发一个属于自己的python模块(一)——能够直接在浏览器打印的方法
- 一步步重构容器实现Spring框架——解决容器对组件的“侵入式”管理的两种方案--主动查找和控制反转(九)
- android源码模块单独编译方案