我目前正在设计一个 API,我不确定我的函数是否应该采用shared_ptr
or weak_ptr
。有些小部件包含查看器。观众有一个功能add_painter
这为观看者添加了一位画家。当查看器需要重绘时,它使用其绘制器绘制到缓冲区并显示结果。我得出的结论是观众应该用weak_ptr
:
- 一个画家可能被多个观看者使用,因此观看者不能拥有该画家。
- 删除画家应该将其从查看器中删除。这样,用户不需要记住他们必须调用
remove_painter
功能。
可能有不同类型的查看者,因此他们隐藏在界面后面。什么签名最适合add_painter
界面中的功能?
我应该直接使用void add_painter(weak_ptr<Painter> const& p)
?这意味着具体的实现存储了画家使用的weak_ptr
,但我不能强制执行:实施可以做到painters.push_back(weak_ptr.lock())
并存储一个shared_ptr
.
我应该使用void add_painter(shared_ptr<Painter> const& p)
反而?这意味着观看者拥有很强的参考,因此删除画家并不一定会将其从观看者中删除。
我也考虑过将画家直接存储在接口类中,但这样就不再是真正的接口了,不是吗?
您不应该尝试使用智能指针来缓解观察者模式,并且绝对应该避免客户端(视图)可以通过将弱指针转换为共享指针并无限期存储它以防止服务器释放它来骚扰服务器的情况。
你真的应该考虑一下经典的观察者模式,要求 View 提供一个painter_destroyed
回调函数。这可能会很麻烦,但一旦画家被摧毁,客户也有机会实施一些额外的行动。否则,当人们想要使用画家时发现它不再存在可能会非常令人恼火,并影响整体程序性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)