设计:将共同的功能公开给两个不同的类

时间:2019-11-11 14:26:34

标签: c++ oop

有一个公共模块Logging。还有另外两个模块FooBar将使用Logging提供的功能。一种方法是拥有一个全局Logging对象,并在构造期间将该对象传递给FooBar,它们将维护对此Logging对象的引用。

Logging Logger;
Foo foo(Logger);
Bar bar(Logger);

Bar中的某个地方:

Bar::SomeFunc()
{
    this->Logger.func();
}

这可以工作,但是我必须创建和维护全局Logger对象。同样,如果明天出现诸如Reporting之类的另一个通用模块,我也必须将其传递给FooBar

另一种方法是使Logger作为静态对象的基类Common。现在FooBar将从Common继承并可以访问Logger公开的功能,并且即使FooBar也是静态的,会有自己的common,只有一个基础Logger

这有效,但看起来不像是继承的用例。 有更好的设计来解决这个问题。

1 个答案:

答案 0 :(得分:0)

对于日志记录,我个人的建议是使用单例Logger类,并通过静态方法访问它。

如果您需要不同的记录器,则可以扩展此Logger类以在其中进行某种形式的依赖注入,但要使客户端保持简单并且不要过度设计它们。

对此问题的“设计模式”惯用答案是使用依赖注入。

FooBar将具有一个构造函数,该构造函数使用ILogger *指针并将其存储在内部。您将通过该指针登录。 Foo&Bar的用户会将指针传递到相关的Logger实现。

我不喜欢这种简单用例的解决方案,我认为这不是一个好的设计。我只是为了完整性而添加它。