我正在编写一个c ++(c ++ 11)库(一个OpenGL图形引擎)。
我的问题围绕着注册事件监听器的良好编程技术。
我有这样的阶级关系:
Program
- has - > SceneManager
- has - > ShaderManager
- has - > * Shader
Shader
类允许其他对象将自己注册为ShaderBindListener
,这意味着每当着色器调用它的bind()
方法时,它都会通知任何侦听器。
ShaderManager
类是外部库可以访问的类,并且可以从中创建新的Shader
对象。
现在,我希望每个Shader
对象都将Program
对象作为ShaderBindListener
,这样当绑定Shader
时,Program
对象通知并可以将矩阵数据等传递给GPU上的Shader
。
我的初始解决方案是让Program
对象将指向自身的指针传递给SceneManager
,它将指针传递给ShaderManager
,然后存储它。每当创建新的Shader
时,ShaderManager
会将Program
添加为听众。
这很好用 - 但似乎 - 我不知道,在设计方面有点不对。
也许我只是在迂腐 - 但这对你们来说这看起来不错吗?