复合模式中的异常安全

问题描述

我使用复合模式表示设备,我想在关闭设备电源(称其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()应该返回什么?连续方法调用应该做什么? 另外,我可以使用哪种设计模式更好地表示自己的问题?

解决方法

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

通常,如果您希望设备关闭失败,那么您应该明确地处理此部分,因为它不会“异常地”发生。

例如,您可以让析构函数尝试正常关闭设备,并在发生错误(或异常)的情况下,强行关闭设备。那么,如果您系统的用户想要处理无法关闭的设备的情况,他仍然可以直接致电shutdown。

最后,从真实世界对象建模只是类设计的初稿。如果它有助于获得更实用的设计和更好的用户体验,请不要担心不遵循实际对象的作用。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...