我正在为各种目标编写跨平台的UI工具包,其中一些目标是嵌入式的。这些平台中的一些支持“保留”渲染模式,而另一些则更“即时”,因此我认为对于我的视觉效果,我有两棵树-伪代码:
abstract class Visual
{
Visual( Widget widget ) { this.widget = widget; }
}
abstract class RetainedVisual : Visual
{
abstract void Setup( Renderer r );
abstract void Teardown( Renderer r );
}
abstract class ImmediateVisual : Visual
{
abstract void Paint( Renderer r );
}
到目前为止,一切都很好。但是现在我还有
ContainerVisual
类,它们对小部件层次进行编码:abstract class ContainerVisual : Visual
{
void AddChild( Visual child ) {}
}
这迫使我不得不拥有一个
ImmediateContainerVisual
和RetainedContainerVisual
类,这些类开始显得肿。有更好设计的想法? 最佳答案
最好的选择是将3个类组合到同一个Visual类中:
class Visual {
Visual(Widget w);
bool SupportsSetupTearDown();
bool SupportsPaint();
abstract void Setup(Renderer r);
abstract void TearDown(Renderer r);
abstract void Paint(Renderer r);
};
然后,容器小部件将不会有任何问题。所有视觉效果都应实现两种渲染方法,并且当目标更改时,系统将开始调用不同的功能。这也允许有条件地不实现一种方法,并且可以构建特殊的视觉效果,这些视觉效果从SetupTearDown转换为Paint,从Paint转换为SetupTearDown。