标签: template-method-pattern

模板方法和策略模式有什么区别?

有人可以向我解释模板方法模式和策略模式之间的区别是什么?

据我所知,它们是99%相同 - 唯一的区别是模板方法模式有一个抽象类作为基类,而策略类使用由每个具体策略类实现的接口.

但是,就客户而言,它们的使用方式完全相同 - 这是正确的吗?

design-patterns strategy-pattern template-method-pattern

155
推荐指数
8
解决办法
6万
查看次数

在Python中继承方法的文档字符串

我有一个带有文档字符串的OO层次结构,它需要与代码本身一样多的维护.例如,

class Swallow(object):
    def airspeed(self):
        """Returns the airspeed (unladen)"""
        raise NotImplementedError

class AfricanSwallow(Swallow):
    def airspeed(self):
        # whatever
Run Code Online (Sandbox Code Playgroud)

现在,问题是AfricanSwallow.airspeed不继承超类方法的docstring.我知道我可以使用模板方法模式保留文档字符串,即

class Swallow(object):
    def airspeed(self):
        """Returns the airspeed (unladen)"""
        return self._ask_arthur()
Run Code Online (Sandbox Code Playgroud)

_ask_arthur在每个子类中实现.但是,我想知道是否还有另一种方法可以继承docstrings,也许还有一些我尚未发现的装饰器?

python oop inheritance docstring template-method-pattern

51
推荐指数
3
解决办法
6159
查看次数

策略,访问者和模板方法之间的区别是什么?

我正在上课,我们刚刚了解了这些设计模式.但是我看不出它们之间有什么区别.它们听起来像是一样的,在抽象的类上创建具体的类.有人可以帮我解决这个疑问吗?谢谢 (:

design-patterns strategy-pattern visitor template-method-pattern

15
推荐指数
1
解决办法
4324
查看次数

为什么GoF建议在C++模板方法模式实现中使用受保护(而不是私有)的虚拟方法?

来自模板方法模式的四人帮:

三个实施问题值得注意:

  1. 使用C++访问控制.在C++中,模板方法调用的基本操作可以声明为受保护的成员.这确保了它们仅由模板方法调用.必须重写的原始操作被声明为纯虚拟.模板方法本身不应该被覆盖; 因此,您可以使模板方法成为非虚拟成员函数.

"这确保了它们只能通过模板方法调用." 不是真的,不是吗?也可以从派生类调用原始方法(如果某些是虚拟的而不是纯虚拟的).仅仅声明原始方法private是否真的确保它们仅由模板方法调用?然后,仍然可以在子类中实现(或重新实现)私有虚拟基元方法,以提供在超类中的模板方法中定义的算法中所需的专门行为.

请参阅Herb Sutter的"虚拟性":

http://www.gotw.ca/publications/mill18.htm

在哪里他说:

准则#2:更喜欢将虚拟功能设为私有.准则#3:只有派生类需要调用虚函数的基本实现时,才能使虚函数受到保护.

我没有在GoF模板方法模式中看到派生类调用虚函数的基类实现的任何要求,那么Gang of Four为什么建议使这些函数受保护而不是私有?

c++ virtual design-patterns template-method-pattern

15
推荐指数
1
解决办法
427
查看次数

模板方法模式 - 命名约定

我有一个名为RenderableEntity的抽象类.

我有一个公共方法render(),其中包含一些围绕抽象保护render()方法的逻辑.我应该如何命名这个抽象render()方法.是否有某种惯例,例如.doRender(),makeRender()对于受保护的方法render()

public abstract class RenderableEntity extends Entity {

    private boolean visible;

    public void render(){
        if(visible){
            render();
        }
    }
    protected abstract void render();
}
Run Code Online (Sandbox Code Playgroud)

编辑:我知道这个片段无法编译.我只是想知道如何命名这个抽象方法,因为我不能有相同名称和相同参数的方法.

java naming-conventions template-method-pattern

14
推荐指数
1
解决办法
1628
查看次数

构建器模式和模板方法之间的差异(构建器与模板)

模板模式在基类中提供算法,其步骤可以在派生类中进行修改.在Builder模式中,具体构建器公开了用于构建从Director类调用的产品的方法.

我知道使用这些模式的目的有所不同.模板模式是一种行为模式,它改变模板中的一个或多个步骤,而构建器模式是创建模式.

除了上述差异外,还有其他差异吗?

构建器模式中的director不是模板模式中的基本模板.具体的构建器在模板模式中的行为类似于可替换的步骤吗?

有人可以澄清一下.谢谢.

我指的是http://www.dofactory.com/Patterns/Patterns.aspx

design-patterns builder template-method-pattern

12
推荐指数
2
解决办法
6842
查看次数

模板方法和策略设计模式

这可能是一个新手问题,因为我是设计模式的新手,但我正在查看模板方法和策略DP,它们看起来非常相似.我可以阅读定义,检查UML并查看代码示例,但对我而言,似乎策略模式只是使用模板方法模式,但您恰好将其传递给对象(即组合).

就此而言,模板方法似乎只是基本的OO继承.

我错过了他们差异的一些关键方面吗?我错过了一些关于模板方法的东西,它使它更像是基本的继承吗?

注意:有一个上一篇文章(672083),但更多的是关于什么时候使用它,哪种帮助我得到它更多但我希望有效的我对模式本身的想法.

oop design-patterns strategy-pattern template-method-pattern

8
推荐指数
1
解决办法
1769
查看次数

我们应该在哪里使用模板方法 - 模式?

任何人都可以让我知道应该使用模板方法 - 模式的一些示例情况吗?

根据您自己的经验,给我一些真实的用途.

(到目前为止,我发现它仅用于映射DA层中的数据.抱歉!!!)

design-patterns template-method-pattern

8
推荐指数
3
解决办法
1万
查看次数

从纯抽象基类继承typedef

编辑:发现重复

我已经将一些问题代码缩减到最简单的工作案例来说明以下内容:我在纯抽象基类中的typedef不是由派生类继承的.在下面的代码中,我想将system_ttypedef 继承到ConcreteTemplateMethod:

#include <iostream>

// pure abstract template-method
template <typename T>   // T == Analyzer<U>
class TemplateMethod {
  public:
    typedef T system_t;

    virtual void fn (const system_t& t) const = 0;
};


template <typename T>
class Analyzer {
  public:
    void TemplatedAlgorithm (const TemplateMethod< Analyzer <T> >& a) const {
      printf ("Analyzer::TemplatedAlgorithm\n");
      a.fn(*this);  // run the template-method
    }

    void fn () const {
      printf ("Analyzer::fn\n");
    }
};


// concrete template-method
template <typename T>
class ConcreteTemplateMethod …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance design-patterns typedef template-method-pattern

8
推荐指数
1
解决办法
4965
查看次数

使用其他基类的方法满足纯抽象方法的最简单方法是什么

编辑:根据一些评论,简单来说,我的意思是a)更少的代码,b)易于维护,和c)很难出错.

编辑#2:另外,如果它确实简化了实现,那么使用包含而不是私有继承并不令人反感InterfaceImpl.

目前,我知道这样做的唯一方法是让实现者定义抽象方法并将调用委托给目标基类型的方法.例:

#include <iostream>
#include <memory>

class Interface
{
public:
    virtual void method1() = 0;
    virtual void method2(int x) = 0;
};

class MethodOneImpl
{
 private:
    void method1(int x)
    { std::cout << "MethodOneImpl::method1() " << x << std::endl; }

 public:
    void method1() { method1(0); }
};

class MethodTwoImpl
{
 public:
    void myFunc(int x)
    { std::cout << "MethodTwoImpl::myFunc(x)" << x << std::endl; }
};

class InterfaceImpl : public Interface
                    , private MethodOneImpl
                    , private MethodTwoImpl
{ …
Run Code Online (Sandbox Code Playgroud)

c++ pure-virtual template-method-pattern class-visibility

8
推荐指数
1
解决办法
470
查看次数