0

我使用复合模式来表示设备,我想在关闭它们的电源(调用它们的 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() 在那种状态下应该返回什么?连续的方法调用应该做什么?或者,我可以使用另一种设计模式来更好地表示我的问题吗?

4

1 回答 1

1

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

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

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

最后,从现实世界的对象建模只是你的类设计的初稿。如果它有助于获得更实用的设计和更好的用户体验,请不要担心不坚持真实世界的对象所做的事情。

于 2020-09-18T10:18:02.753 回答