复合模式中的异常安全

Exception safety in the composite pattern

我使用复合模式来表示设备,我想在关闭它们的电源(调用它们的 dtor)之前将其关闭。 我 运行 在尝试对设备进行分组时遇到问题,尤其是关于它们的状态。

在以下情况下我将如何进行:

class IDevice
{
public:
    virtual void shutdown() = 0;
    virtual void turn_on() = 0;
    virtual bool is_on() const = 0;
}

class Router: public IDevice {...};
class Computer: public IDevice {...};
class Monitor: public IDevice {...};
// etc...

class WorkStation: public IDevice {...};

工作站可能包含多个设备,您希望在切断工作站电源之前安全地关闭所有这些设备。 (在这个比喻中,我很便宜)。 还值得注意的是,我永远不希望任何一个设备自行打开 - 一切都将始终作为一个单元。

当其中一个内部设备不想安全关闭时就会出现问题 - 它会抛出异常(例如计算机的程序阻止它关闭)。

is_on() return 在那种状态下应该是什么?连续的方法调用应该做什么? 或者,我可以使用哪种设计模式来更好地表示我的问题?

主要的大问题是你想从dtor中抛出。 https://www.kolpackov.net/projects/c++/eh/dtor-1.xhtml 很好地解释了为什么这不能很好地与语言及其习语配合使用。

一般来说,如果您预计设备会在关闭时失败,那么您应该明确地处理这部分,因为它不是“异常”发生的事情。

例如,您可以让析构函数尝试正常关闭设备,并在出现错误(或异常)时应用强制关闭。那么,如果你的系统用户想要处理设备无法关机的情况,他仍然可以直接调用关机。

最后,根据真实世界对象建模只是 class 设计的初稿。如果它有助于获得更实用的设计和更好的用户体验,请不要担心不遵守现实世界对象的功能。