这是什么设计模式?

7

几年前,我曾经创建过类似这样的界面:

class Base
{
  public:
    virtual ~Base
    {
    }

    void foo()
    {
      doFoo();
    }

  private:
    virtual void doFoo() = 0;
};

那么一个派生类将会是:
class Derived : public Base
{
  public:
    virtual ~Derived()
    {
    }

  private:
    virtual void doFoo()
    {
    }
};

我确定在某个地方看到过这种设计模式,但现在无法找到它的任何信息,也记不得它叫什么名字。
那么,这种设计模式叫什么?

请检查Derived的定义,它肯定不完整,并且使用的继承类型在这里实际上非常重要。 - pmr
好的,已经修正了示例。对于造成的困惑表示抱歉。 - BЈовић
2个回答

8

你的foo方法不应该是虚拟的。在这种情况下,设计模式称为NVI - 非虚拟接口


6
@Stephane: 那么...呃...如果不在GoF的书中,那就不是一个设计模式了?:))) - Armen Tsirunyan
5
@Stephane:WTF与GoF有什么关系?问题中没有提到它。你知道还有其他书籍中没有涉及的设计模式吗? - Lightness Races in Orbit
1
@Stephane:我完全同意模板方法是NVI的概括。但OP的例子是NVI,而不是它的概括。这就像如果我问你4是什么类型的数字,你会说它是一个复数... - Armen Tsirunyan
1
虽然另一个答案也是正确的,但这才是我在寻找的。谢谢。 - BЈовић
1
@Stephane: 这并不改变您对一个并非错误的答案进行负评的事实,只是因为它没有出现在您喜欢的书中而已。这样做并不符合Stack Overflow的精神。请阅读常见问题解答(每个页面顶部都有链接)。 - Lightness Races in Orbit
显示剩余13条评论

8
这是模板方法模式。以下是维基百科相关摘录:
模板方法定义了算法的程序骨架。可以通过子类覆盖一个或多个算法步骤来允许不同的行为,同时确保仍然遵循总体算法。
我经常看到这种模式被用来“强制”调用基类实现(通常必须在派生类中显式执行)。

5
这并不是模板方法模式,尽管它表面上看起来很相似。正如Armen Tsirunyan所说的那样,这是非虚拟接口模式。 - James Kanze
2
为什么会被踩?我认为在阅读了链接页面上的描述之后,可以公正地说NVI只是模板方法的一个特例。是否有什么理由认为这是一种“错误”的理解呢? - sehe
1
@James:我之前没有听说过NVI,谢谢你的分享,但是我同意@sehe和@Stephane的观点。根据我在http://en.wikibooks.org/wiki/More_C++_Idioms/Non-Virtual_Interface上所读到的,模板方法模式是NVI的一般化,因此原始示例是模板方法模式的NVI形式。 - Chris Schmich
1
@James:请查看http://www.gotw.ca/publications/mill18.htm。混淆的是NVI是一个习语,而模板方法是GoF模式之一。该链接显示它们之间有关联,而不仅仅是表面上的相似。然而,这只是在讨论语义问题... - stefaanv
1
NVI模式和模板方法模式只是表面上相关。模板方法模式定义了算法的程序框架。虚函数(私有或受保护)与定义接口的公共函数没有直接关系。NVI模式用于PbC,在接口(基类)中没有实现,只有验证代码(前置条件和后置条件),并且公共函数与非公共虚函数之间存在一对一的关系。 - James Kanze
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接