描述:
问题描述:现有一接收数据包服务,定制了三个类 CAppMain、CIOCP、CDatabase,其中CIOCP和CDatabase聚合形成CAppMain,现在CAppMain有一个Init()方法,可以初始话CIOCP实例和CDatabase实例,CIOCP是完成端口的封装,包含的方法有RecvData(),CDatabase用于创建OLEDB对象,用于操作数据库,其中提供了一个方法CreateSQL()和WriteToDB(),现在的问题是,RecvData方法中包含验证数据包合法性的程序和解包的程序,而CreateSQL中含有创建存储过程的语句,WriteToDB中包含调用特定的存储过程的语句,现在要求,以COM方式对这个服务进行泛化,并且提供三个方法,要求,不管在什么方法下,只要传入三个函数指针,就可以进行特定的解包、创建存储过程、和写库,大家考虑考虑如何做?
解决方案1:
没明白你的意思,你自己不是已经说了如何做了吗?
使用三个COM组件,分别实现接口IAppMain、IIOCP、IDatabase(分别对应着CAppMain、CIOCP、CDatabase),要实现不同的数据协议和存储过程的联合,实现特定的支持IAppMain接口的COM组件即可。
不过我以为你的这个设计不好,应为IAppMain的功能只是生成另外两个COM组件的实例,所以IAppMain的Init应该改为HRESULT Init( [in] CLSIDREF clsidIOCP, [in] CLSIDREF clsidDatabase );在Init的实现中通过调用CreateInstance直接动态创建另外两个COM组件的实例,因此是包容,不是聚合,但是仍可以用聚合的外貌对人(即给人以是聚合的假象),不过有违COM的祖讯(对QueryInterface的调用失败一次,则永远失败)。