我正在为各种目标编写跨平台的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 ) {}
}


这迫使我不得不拥有一个ImmediateContainerVisualRetainedContainerVisual类,这些类开始显得肿。有更好设计的想法?

最佳答案

最好的选择是将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。

08-27 21:40