1 接口规定形式,组件实现内容\n 2 一个组件可以有多接口。\n 3 多个组件可以有共同的接口,但接口的内容各自组件,各自规定。\n 4 接口定义好一般就不改了。需要新功能时可以追加接口、追加组件。\n 5 由于组件内实现了接口,接口生存周期要长于组件。\n \n\n 客户端调用组件\n\n\n\n 以上模式至少实现了:\n\n客户端和组件分隔\n组件和接口分割\n接口和接口实现分隔\n各自维护互不影响\n三、接口实现原理\n 接口的实现原理:\n\nclass IX{ //first interface\npublic:\n virtual void Fx1()=0;\n virtual void Fx2()=0;\n};\n \nclass Iy{ //second interface\npublic:\n virtual void Fy1()=0;\n virtual void Fy2()=0;\n};\n \nclass CA:public Ix,public Iy{\n public:\n virtual void Fx1(){ cout\u003C\u003C\"Fx1\"\u003C\u003Cenl;}\n virtual void Fx2(){ cout\u003C\u003C\"Fx2\"\u003C\u003Cenl;}\n \n virtual void Fy1(){ cout\u003C\u003C\"Fy1\"\u003C\u003Cenl;}\n virtual void Fy2(){ cout\u003C\u003C\"Fy2\"\u003C\u003Cenl;} \n};\n 以上代码是个比喻,是展现实现的效果,至于如何实现,下面的设计更巧。 \n\n 在上面实现中Ix和Iy是实现接口的纯抽象类。该类内部仅仅包含纯虚函数,这个函数仅仅用来指针占位,并无实质的实现。\n\n 为了实现纯虚函数的实体,在组件CA中继承两个接口Ix和Iy,在CA中实现了虚函数的集体化。可以将抽象类看成是空的表单,在派生类(CA)中实现表单填写。\n\n 四、实质的接口定义\n4.1 首先定义一个接口符号\n 在objbase.h中,定义了一个interface的名词术语。\n\n #define interface struct\n 注意:这里interface定义成struct,是因为在struct内的成员全部是public无需特殊生命。\n\n4.2 更真实的接口定义\n#ifndef __OBJBASE__\n#define __OBJBASE__\n \n#include \u003Cobjbase.h>\ninterface IX{ //first interface\n virtual void Fx1()=0;\n virtual void Fx2()=0;\n};\n \ninterface Iy{ //second interface\n virtual void Fy1()=0;\n virtual void Fy2()=0;\n};\n \n#endif\n 4.3 一个实例\nca.cpp\n\n \n#include \u003Cistream.h>\n#include \u003Cobjbase.h>\n \nvoid trace(const char *pMsg ) {cout \u003C\u003CpMsg \u003C\u003Cendl;}\n \n \ninterface IX{ //first interface\n virtual void Fx1()=0;\n virtual void Fx2()=0;\n};\n \ninterface Iy{ //second interface\n virtual void Fy1()=0;\n virtual void Fy2()=0;\n};\n \nclass CA:public Ix,public Iy{\n public:\n virtual void Fx1(){ cout\u003C\u003C\"CA::Fx1\"\u003C\u003Cenl;}\n virtual void Fx2(){ cout\u003C\u003C\"CA::Fx2\"\u003C\u003Cenl;}\n \n virtual void Fy1(){ cout\u003C\u003C\"CA::Fy1\"\u003C\u003Cenl;}\n virtual void Fy2(){ cout\u003C\u003C\"CA::Fy2\"\u003C\u003Cenl;} \n};\n \nint main(){\n \nCA *pA = new CA;\ntrace(\"this is client call component \");\nIx *pIx = pA;\ntrace(\"client: use the Ix interface\");\npIx->Fx1();\npIx->Fx2();\ntrace(\"client: use the Iy interface\");\npIy->Fy1();\npIy->Fy2();\ntrace(\"client:delete interface\");\n \ndelete pA;\nreturn 0;\n}\n输出: \n\nthis is client call component\nclient: use the Ix interface\nCA::Fx1\nCA::Fx2\nclient: use the Iy interface\nCA::Fy1\nCA::Fy2\nclient:delete interface\n五、结论\n 客户端调用组件,组件调用接口,接口调用接口的实现,每一步都有一个节点环节,这样就使得【客户端】与【接口实现】这两个实质性的程序不产生关系,达到独立维护的目的。\n\n 当客户程序和组件在一个源文件中时,并无必要将其分开。但当客户和组件是在动态链接库中时,此种隔离是必须的。下章将进一步隔离抽象,让客户端不再使用CA的指针。\n\n参考资料
C组件编程结论
最新推荐文章于 2024-05-11 05:57:47 发布