Chinaunix

标题: 这种情况下如何使用"adapter模式"? [打印本页]

作者: GodPig    时间: 2009-05-22 11:47
标题: 这种情况下如何使用"adapter模式"?
我有一个这样的类:
class A
{
public:
   A();
   ~A();

//在A的实现部分中,GetStr仅是用来返回val

   CString *GetStr();

private:
   CString *val;
}



这个类放在一个DLL中,导出了。

因为使用了MFC的CString
我要在一个SDK程序里面使用。 所以,没办法使用这个CString,只要引入这个头文件,就会导致CString未声明的错误。

所以我就要用个中间接口来做,自己定义一个B类
然后将CString这样的不可使用类型都屏蔽起来,对外提供char *类型的来代替。
即:
class B
{
public:
   char *GetStr();

private:
   A a;   //在GetStr中调用A的操作,然后将CString转为char *

}


但是出现问题了,我只要引用了A的声明,在那个SDK程序中就会出现CString未定义的错误!!!

那我如何才能将A的声明也屏蔽掉???

也就是说,只要A的声明不在B的头文件B.h中出现,不把A的声明暴露出来就可以了。

有没有可能实现???

谢谢!
作者: nicolas.shen    时间: 2009-05-22 11:47
你的想法是对的,但是实现却隐藏了你想法的天真性
adapter有输入和输出两种接口,并且对两边都要保持独立性,就是减少依赖。
你把它做成com好了,输入,输出都是基本的com类型数据,这样就是个adapter了
作者: GodPig    时间: 2009-05-22 12:48
标题: 回复 #2 nicolas.shen 的帖子
谢谢!
呵呵,请楼上详解一下~
com目前局限于了解的水平,没用过~~~,如果改成com要多大工作量,而且我的类A也并不是很大~~~?

我天生也比较愚钝,理解力也比较差,不知道有什么方法,用尽可能少的时间,来完成我的目的???
(如果没办法的话,我就改得把A类重新改一下了~,不过因为在别处,有引用A类的,改了之后,也造成别的地方引引A类的地方也得改……,是不是我的设计仍然有问题??? 呵呵,前两天刚看了下设计模式,初学者…… )

谢谢!
作者: nicolas.shen    时间: 2009-05-22 14:03
我的建议是还是改造下A类,减少它对各种类库的依赖性,这样它的适用范围就会很广,如果做成com的确需要做很多额外的事情,毕竟那些工作和你要的逻辑没多少关系。
作者: GodPig    时间: 2009-05-22 15:41
呵呵,想到办法了

就是将A只在B的实现中暴露。

在B的声明中,只有接口,而且B中并没有成员变量。

在B.cpp中,定义一个全局的类A的变量,然后在B的实现中用就可以了。

呵呵,这么简单的方法,我不知道为啥想了那么长时间才想到。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2