2011-08-30 41 views
1

我有一个DLL导出一些函数用于获取或设置一些底层数据对象中的各种值。在某些情况下,DLL会通过注册的回调函数指针向应用程序发出通知。然后,应用程序应该通过DLL接口中的特定功能来响应通知(尽管不是很快)。在收到响应之前,DLL中的数据对象可能会被读取但不能写入。有状态的DLL是状态模式的良好候选者吗?

该DLL必须全局导出所有的方法。但是如果通知被提出,所有的设置功能都是禁止的。

关闭我的头顶我可以想到两个解决方案:我可以实现一个简单的基于标志的状态机制,并将每个setter包装在if语句中检查此标志。或者我可以按照国家模式实施这两个国家。

第一个解决方案应该便宜,但要求所有开发人员记得在实现新导出的setter函数时检查该标志。如果在某一时刻只读状态期望基于原始通知的某种类型的响应,则它可能变得难看。 第二种解决方案需要在两种状态下都实现新的导出函数,这提示开发人员考虑函数在只读模式下执行的操作。但大多数方法都会在两种状态下做同样的事情,其余的都不应该做任何事情,甚至抛出异常......

有没有更好的方法来实现类似的东西?

回答

1

怎么样:去第二个解决方案,但不要复制你的功能,让它们保持原样。相反,将它们全部委托给由两个类实现的接口:一个表示正常状态下的行为,另一个表示只读状态。当您切换到只读状态时,请将您使用的指针指向只读实现。如果您担心在两个类中重复状态,请使用包含所有常用数据而不是接口的抽象类。

另一种选择是指向成员函数的指针:不使用多态调用,而是调用指向成员函数的指针。当您切换到只读模式时,请更改所有指针,以便它们指向只读模式成员函数。这样,你也避免了在你的dll界面中复制函数。

+0

我可能有点不清楚,但我认为你的一些建议与我的想法相似。我不打算在DLL接口中复制函数 - 我希望DLL的有状态对使用DLL的应用程序是透明的。 有趣的想法与函数指针...但是当我切换到只读模式(对不同类型的对象的几个setter)时,可能会有相当多的函数指针改变。我想我可以把它们放在一个静态表中并切换整个表格...... –