我知道这可能是一个不恰当的问题(因为答案只能基于个人的主观意见),我仍然冒着问这个问题的风险:
我们编写了一些代码,并提出了以下构造
#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()的功能),最后有人调用了Generic的do_work,它是在一组“上层”类(RealClass)中实现的。
发布于 2014-08-07 09:30:23
在我看来,这就像是一次拙劣的装潢工尝试。
SomeAppDescriptor和CommonFunctionalities不覆盖do_work,因此它们不需要继承Generic;然而,do_common_work的使用表明这可能是有用的。RealClass直接从Generic继承,那么它就可以通过组合来获取CommonFunctionalities。使用Decorator模式,我最终会得到:
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方法。
发布于 2014-08-07 09:05:43
是奇怪的是反复出现的模板模式。
发布于 2014-08-07 09:10:14
我认为这有点像是对奇怪的是反复出现的模板模式的升级。
看上去不错。:)
https://stackoverflow.com/questions/25177779
复制相似问题