Dongle烧写模块重构(六)--单模块单功能下的命令模式尝试
2014-10-23 22:16
274 查看
前面的几篇博文对模块如何应对下层接口变化和方案商变化做了设计,然而,模块怎么良好地和Android层的应用交互,这个需要怎么设计呢?考虑到我们的应用通过Dongle模块和底层交互实现一些功能,上层发送指令,要求Dongle模块做某件事情即可。二者可以用命令模式来交互.
总图是这样子,我们设计需要达到的目的:
1.方案商层面的变化(方案商增加,方案商减少,方案商的实现逻辑发生变化)。
2.要能够应付模块层的变化(模块增加,模块减少,模块实现逻辑发生变化),
这里我们着重看下新增加的命令模式,对App和模块层交互的影响:
首先看下初版的代码:
1.m测试代码:
2.执行cmd的execute函数
4.
这里,如果要执行一个模块行为,我们就必须为这个模块
这个时候我们会发现这个命令模式是有问题的。简单的命令模式是让请求者和接收者之间解耦,如果我们的app需要做的功能是:
操纵某个模块而不是操纵某个模块的某个方法。那么这样将模块构建成命令打包发送过去,就OK了。
然而我们的需求恰恰是应用要操纵某个模块的某个方法。所以只是将模块打包成命令发送过去是不行的,还需要一些参数才行。
比如,这里bool DongleModuleCommand::execute()不带参数的话,就只能指定一种行为。因此这里需要作更改,可能还需要参数。
先前的设计,是将模块,比如DongleModule的一个大功能的接口,比如BurnDongle直接暴露给应用,然后app层的应用调用这些接口去完成功能取得返回值就OK了。
然而,如果有这种需求:现在有一个新功能,需要利用到和BurnDongle平级的好几个接口来实现一个新功能,那么就要重新设计一层封装?,这个后续再考虑。
总图是这样子,我们设计需要达到的目的:
1.方案商层面的变化(方案商增加,方案商减少,方案商的实现逻辑发生变化)。
2.要能够应付模块层的变化(模块增加,模块减少,模块实现逻辑发生变化),
这里我们着重看下新增加的命令模式,对App和模块层交互的影响:
首先看下初版的代码:
1.m测试代码:
cout << "test begin.." << endl; ModuleControl *moduleControl = new ModuleControl(); //先创建一个方案商工厂,专门用来创建方案商 SolutionProviderFactory *factory = new SolutionProviderFactory(); DongleModule *dongleModule = new DongleModule(factory); DongleModuleCommand dongleModuleCommand(*dongleModule); moduleControl->SendCommand(&dongleModuleCommand); cout << "test end..." << endl;当执行: moduleControl->SendCommand(&dongleModuleCommand);的时候:
2.执行cmd的execute函数
void ModuleControl::SendCommand(Command *cmd) { cout<<"ModuleControl::SendCommand(Command cmd)..."<<endl; command = cmd; command->execute(); }3.而这个cmd是DongleModuleCommand类型,所以最后调用到的是:
bool DongleModuleCommand::execute() { //在这里确定传递的方案商参数是否合适? cout<<"DongleModuleCommand::execute() excuting!!!!!!!!!!!!"<<endl; dongleModule.BurnDongle(1); return true; }
4.
这里,如果要执行一个模块行为,我们就必须为这个模块
这个时候我们会发现这个命令模式是有问题的。简单的命令模式是让请求者和接收者之间解耦,如果我们的app需要做的功能是:
操纵某个模块而不是操纵某个模块的某个方法。那么这样将模块构建成命令打包发送过去,就OK了。
然而我们的需求恰恰是应用要操纵某个模块的某个方法。所以只是将模块打包成命令发送过去是不行的,还需要一些参数才行。
比如,这里bool DongleModuleCommand::execute()不带参数的话,就只能指定一种行为。因此这里需要作更改,可能还需要参数。
先前的设计,是将模块,比如DongleModule的一个大功能的接口,比如BurnDongle直接暴露给应用,然后app层的应用调用这些接口去完成功能取得返回值就OK了。
然而,如果有这种需求:现在有一个新功能,需要利用到和BurnDongle平级的好几个接口来实现一个新功能,那么就要重新设计一层封装?,这个后续再考虑。
相关文章推荐
- Dongle烧写模块重构(七)-加入当前已有的Dongle烧写功能
- Dongle烧写模块重构(三)--用策略模式自定行为框架,再交由方案商实现
- Dongle烧写模块重构(四)--用工厂模式将方案商从功能代码中抽离
- Dongle烧写模块重构(二)--让方案商直接面对接口编程
- Dongle烧写模块重构(五)--当前的设计
- Dongle烧写模块重构(一)--最基本的设计,以继承可以组织多个方案商
- 一个应用策略模式(Strategy)的小实例----对TreeView功能菜单的功能选择模块进行解耦重构
- Dongle烧写模块重构(八)--添加自测模块方便根据通信协议进行自测试
- Dongle烧写模块重构(九)-Makefile的简化修改及工程模块的独立
- 装饰者模式---使用装饰者模式实现带日志记录功能的数据库命令执行类
- 常规功能和模块自定义系统 (cfcmms)—012Extjs6的开发模式和发布模式
- seajs学习日志 简单尝试模板+数据合并、模块异步加载、非标准CMD模式定义define模块
- 分享一个近期工作中订单功能模块重构设计图(修改后对比图)
- 如何在emacs中打开shell模式时实现shell命令记忆功能
- webgame设计之功能模块的代理模式
- 一次运用设计模式对现有系统进行重构的尝试(二)
- javascript【AMD模块加载器】浅析V3(添加CSS加载功能,重构内部流程)
- u-boot-2012.10 shell模式命令自动补齐功能 源代码分析
- 一次运用设计模式对现有系统进行重构的尝试(一)
- [重构到模式-Command Pattern]银行ATM机服务功能