首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您如何命名此c++设计模式?

您如何命名此c++设计模式?
EN

Stack Overflow用户
提问于 2014-08-07 08:34:24
回答 3查看 112关注 0票数 0

我知道这可能是一个不恰当的问题(因为答案只能基于个人的主观意见),我仍然冒着问这个问题的风险:

我们编写了一些代码,并提出了以下构造

代码语言:javascript
复制
#include <iostream>
#include <string>

class Generic
{
public: virtual void do_work() = 0;
};

class SomeAppDescriptor : public Generic
{
public: static std::string name() { return "SomeAppDescriptor"; }
};

template <class TGenericApp> 
class CommonFunctionalities : public TGenericApp
{
public: void do_common_work() {
            std::cout << "do_common_work for " << TGenericApp::name();
        }
};

class RealClass : public CommonFunctionalities<SomeAppDescriptor>
{
public: virtual void do_work() {
            do_common_work();
            std::cout << "and doing the work" << std::endl;
        }
};

int main(int argc, char const *argv[])
{
    RealClass a;
    a.do_work();
    return 0;
}

现在我们正处于文档阶段..。我们需要为CommonFunctionalities从模板成员继承的构造找到一个名称.并且正在使用SomeAppDescriptor的属性,它实际上是模板成员.如果要命名这个构造,那么它的合适名称是什么?

编辑

其主要思想是有许多AppDescriptor类从配置文件(名称、ip、数据库等)中读取一些数据,并且有一个中间层(这里用CommonFunctionalities表示,它负责工作(但在某个模糊的点,CommonFunctionalities对象被映射到name() (字符串和泛型映射)以获得do_work()的功能),最后有人调用了Genericdo_work,它是在一组“上层”类(RealClass)中实现的。

EN

回答 3

Stack Overflow用户

发布于 2014-08-07 09:30:23

在我看来,这就像是一次拙劣的装潢工尝试。

  • SomeAppDescriptorCommonFunctionalities不覆盖do_work,因此它们不需要继承Generic;然而,do_common_work的使用表明这可能是有用的。
  • 如果RealClass直接从Generic继承,那么它就可以通过组合来获取CommonFunctionalities

使用Decorator模式,我最终会得到:

代码语言:javascript
复制
class Generic { public: virtual void do_work() = 0; };

template <typename App>
class CommonFunctionalities: public Generic {
public:
    virtual void do_work() override {
        std::cout << "CommonFunctionalities - " << App::name() << "\n";
    }
};

class RealClass: public Generic {
public:
    RealClass(std::unique_ptr<Generic> p): previous(std::move(p)) {}

    virtual void do_work() override {
        if (previous) { previous->do_work(); }
        std::cout << "RealClass\n";
    }

private:
    std::unique_ptr<Generic> previous;
};

int main() {
    RealClass rc{std::make_unique< CommonFunctionalities<SomeAppDescriptor> >()};

    Generic& g = rc;
    g.do_work();

    return 0;
}

Decorator是专门为工作层创建的,没有任何类比接口类更清楚,这样您就可以在运行时选择要使用的层。即使运行时的灵活性不是必需的,使用这种方法仍然是有利的,因为它减少了依赖:RealClass不知道CommonFunctionalities

注意:在C++中,由于模板的存在,您也可以使用没有接口的Decorator方法。

票数 2
EN

Stack Overflow用户

发布于 2014-08-07 09:05:43

奇怪的是反复出现的模板模式

票数 0
EN

Stack Overflow用户

发布于 2014-08-07 09:10:14

我认为这有点像是对奇怪的是反复出现的模板模式的升级。

看上去不错。:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25177779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档