讨教个设计模式方面的问题,如何设计一个模式,让我们更新代码不影响其他人使用我们的so动态库

ayw215 2011-05-31 11:33:06
我设计模式这块学的不好,有个问题不知道怎么解决
现在的需求是这样的:
A需要使用我们提供一个so动态库,A使用这个so里面的基类的方法
要求做到:他们不需要更改代码,我们这边从这个基类里面派生出子类,然后实现子类的方法。

我是这么写的:
class Base
{
public:
virtual Base* create(){return NULL;};
virtual void Parse(){};
virtual void Destory(){};
Base(){};
~Base(){};
};


class Derive :public Base
{
public:
Base* create()
{
return new Derive;
}
void Parse()
{
cout<<"From Derive\n";
}
void Destory()
{
cout<<"From Derive Destory\n";
}

};


使用的时候是这么用的:

int main()
{
Derive soft;//==============>问题在这:别人使用的时候还是得把这里修改成我写的Derive类
Base* prqt = soft.create();
prqt->Parse();
prqt->Destory();
return 0;
}

Derive soft;//==============>问题在这:别人使用的时候还是得把这里修改成我写的Derive类
不知道有什么好的方式,可以做到,我派生出子类后,调用者不用修改代码重新编译,直接使用我的so动态库?

谢谢!
...全文
350 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
用pimp(private implement)的思路+工厂+bridge+反射。
不过c++不支持反射,得自己设计。
stendson 2011-11-12
  • 打赏
  • 举报
回复
"他们不需要更改代码"
我想问LZ客户原来是怎么怎么调用子类的?
  • 打赏
  • 举报
回复
工厂方法+模板
zhengjiankang 2011-10-11
  • 打赏
  • 举报
回复
提供一个不变的接口头文件即可。
与模式无关。
//interface.h

class device
{
public:

// ..
//int f1();
//int f2(); ...
};

dll_export device* create_device(const char*);
cybzghn 2011-10-10
  • 打赏
  • 举报
回复
像你这里描述的,其实你描述的还是很简单,不足以确定用哪个或者哪些模式,所以我只想给你一些建议怎样用模式。

首先你的对各种模式,特别是一些常用的模式要熟悉,不然无从谈起怎样使用模式了。例如,design patten有三大类,creational(像abstract factory, factory method, singleton...), behavioral(像adapter, bridge, composite...) and structural(像observer, command, iterator, visitor...), 每一类都有好几种设计模式,总共有二十多种。

在熟悉的基础上,再分析你遇到的问题(不要忘了,千万不要跟什么架构混在一块了,架构可以用design pattern来实现,但design pattern不等于架构,架构是描述程序中主要模块之间是怎样交互的(workflow),但是design pattern关注点是怎样实现。 扯远了), 是creational相关的,还是behavioral相关的,或者说是structural相关得,但常常有时是跟其中两种或者多种相关得,然后根据分析,再确定用哪一种或多种。

这些都不可能一天就学会了,但试着对每个问题进行分析,不久的将来,你就是一个design的高手了,慢慢的有可能就不知不觉成为一个架构师了。
chos2006 2011-09-28
  • 打赏
  • 举报
回复
这个得让调用者传参数过来,再根据参数决定创建的实际类型吧。
luciferisnotsatan 2011-09-28
  • 打赏
  • 举报
回复
谁挖坟了
klopow 2011-09-28
  • 打赏
  • 举报
回复
没必要纠结
1、导出函数而不是导出类,更新时增加新的导出函数。
2、直接给源代码。
taodm 2011-09-14
  • 打赏
  • 举报
回复
珍惜生命,使用纯C接口的动态库。
zgysx 2011-09-14
  • 打赏
  • 举报
回复
这没有哪种模式可以最终解决你的问题.
模式不是万能的. 你可以试一下反射.
在MFC中,它也被称为动态创建.
野男孩 2011-07-31
  • 打赏
  • 举报
回复
Bridge模式啊
newsunnyyang 2011-07-15
  • 打赏
  • 举报
回复
C++ 模式
pathuang68 2011-06-14
  • 打赏
  • 举报
回复
用Adapter设计模式试试。

参考:
C++实现Adapter模式
gene639 2011-06-02
  • 打赏
  • 举报
回复
析构函数要不要声明为虚函数?哈哈 楼上有人回复中看到了两种模式 最近也在看模式 死啃
www_adintr_com 2011-06-01
  • 打赏
  • 举报
回复
可以学学 COM 组件的做法
luciferisnotsatan 2011-06-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ayw215 的回复:]

搞个配置文件那个,太麻烦了
[/Quote]
可以设个参数,不过这样,用户就要改代码,去选择用哪个子类。

如果是用户不能选择用哪个子类,而是由你们说了算,那可以直接写死,现在函数里直接返回new derive1,以后发布新版本,算法换新的derive2了,就在函数里返回new derive2。

如果你既要让用户选用哪种子类,又要对用户透明(用户不用在代码或配置文件或其他方法里注明用哪种),那这个问题本身好像就是矛盾的。
yfk 2011-06-01
  • 打赏
  • 举报
回复

class Derive1;
class Derive2;

class Base
{
public:
bool create(const int type);

void fun()
{
pBase->funA();
}

virtual void funA()
{
cout << "base::funA" << endl;
}

Base()
{
pBase = NULL;
}
~Base()
{
if(pBase != NULL)
{
delete pBase;
pBase = NULL;
}
};

private:
Base* pBase;
};

class Derive1 :public Base
{
public:
Derive1(){}
void funA(){cout << "Derive1::funA" << endl;};
};

class Derive2 :public Base
{
public:
Derive2(){}
void funA(){cout << "Derive2::funA" << endl;};
};

bool Base::create(const int type)
{
switch(type)
{
case 1:
pBase = new Derive1();
break;
case 2:
pBase = new Derive2();
break;
default:
return false;
}

return true;
}

int _tmain(int argc, _TCHAR* argv[])
{
Base b;
b.create(2);
b.fun();

getchar();
return 0;
}
yungmode 2011-06-01
  • 打赏
  • 举报
回复
主要是提供对应的派生类的创建方法就OK了。 可以用工厂模式!
ayw215 2011-06-01
  • 打赏
  • 举报
回复
搞个配置文件那个,太麻烦了
就想叫yoko 2011-06-01
  • 打赏
  • 举报
回复
学习了~~~~~~~
加载更多回复(6)

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧