通常需要完成以下任务:更改某些内容的状态,执行操作,然后将状态更改回原始状态.例如,在Win32 GDI中,需要更改背景颜色,然后进行一些绘制,然后再更改颜色.
它可以直接完成:
COLORREF oldColor = SetBkColor( deviceContext, newColor );
drawStuff( deviceContext );
SetBkColor( deviceContext, oldColor );
Run Code Online (Sandbox Code Playgroud)
或者通过一个括号类,它将在构造函数中进行向前更改并在析构函数中进行向后更改:
CBkColorSwitcher switcher( deviceContext, newColor );
drawStuff( deviceContext );
//once control reaches end of block the switcher is destroyed and the change is reverted
Run Code Online (Sandbox Code Playgroud)
括号类的优点是显而易见的 - 如果在更改之间抛出异常,则更改将被正确恢复.有什么缺点?