Design patterns 有状态DLL是状态模式的良好候选对象吗?

Design patterns 有状态DLL是状态模式的良好候选对象吗?,design-patterns,dll,Design Patterns,Dll,我有一个DLL,它导出许多函数,用于获取或设置一些底层数据对象中的各种值。在某些情况下,DLL将通过注册的回调函数指针向使用它的应用程序发出通知。然后,应用程序应该通过DLL接口中的特定函数响应通知(尽管不是立即响应)。在收到响应之前,DLL中的数据对象可以读取,但不能写入 当然,DLL必须全局导出所有方法。但是,如果发出通知,则所有setter函数都是禁止使用的 我可以想出两个解决方案:我可以实现一个简单的基于标志的状态机制,并将每个setter封装在一个if语句中,检查这个标志。或者我可以根

我有一个DLL,它导出许多函数,用于获取或设置一些底层数据对象中的各种值。在某些情况下,DLL将通过注册的回调函数指针向使用它的应用程序发出通知。然后,应用程序应该通过DLL接口中的特定函数响应通知(尽管不是立即响应)。在收到响应之前,DLL中的数据对象可以读取,但不能写入

当然,DLL必须全局导出所有方法。但是,如果发出通知,则所有setter函数都是禁止使用的

我可以想出两个解决方案:我可以实现一个简单的基于标志的状态机制,并将每个setter封装在一个if语句中,检查这个标志。或者我可以根据状态模式实现这两种状态

第一个解决方案的构建成本应该很低,但要求所有开发人员在实现新的导出setter函数时记住检查标志。如果在某个时刻只读状态期望基于原始通知的某种类型的响应,那么它可能会变得丑陋。 第二种解决方案需要在两种状态下实现新的导出函数,促使开发人员考虑函数在只读模式下的功能。但是大多数方法在两种状态下都会做相同的事情,其余的应该什么都不做,甚至抛出异常


有没有更好的方法来实现类似的功能?

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


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

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


另一种选择是指向成员函数的指针:不使用多态调用,而是调用指向成员函数的指针。切换到只读模式时,请更改所有指针,使其指向只读模式成员函数。这样,您也可以避免在dll接口中重复函数。

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