标签: template-method-pattern

javascript中的模板方法

我想在javascript中实现模板方法模式.

我有一个带有一些子类的PropertyDecorator:OpenButtonDecorator,SeeButtonDecorator等等.我想在Property decorator中有下一个函数:

var build = function(){
   decorate(); //Abstract in PropertyDecorator, defined in subclasses
   return le.build();
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能使这个场景有效?也许我实现了错误的继承:S(也帮助:))

先感谢您.

javascript inheritance template-method-pattern

5
推荐指数
1
解决办法
3700
查看次数

模板方法和策略设计模式之间有什么相似之处

这是TemplateMethod Pattern的一个例子吗?

public abstract class Character{

    public final void useWeapon(){
        useBusterSword();
        useMateriaBlade();
        useUltimateWeapon();
    }

    public abstract void useBusterSword();
    public abstract void useMateriaBlade();
    public abstract void useUltimateWeapon();
}

public class Cloud extends Character{

    public void useUltimateWeapon() {
        System.out.println("Change Weapon to Ultima Weapon");
    }


    public void useBusterSword() {

    }


    public void useMateriaBlade() {

    }
}


public class TestGame {
    public static void main(String[] args){
        Character cloud = new Cloud();
        cloud.useWeapon();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果是这样,使用这种模式比战略模式有什么好处?

战略模式

public class Character {
    WeaponBehavior w;
    public void …
Run Code Online (Sandbox Code Playgroud)

java design-patterns strategy-pattern template-method-pattern

5
推荐指数
1
解决办法
1014
查看次数

基类中模板方法的用途是什么?

嗯,我正在经历这个关于"在MSDN上的优秀文章基类用途 ".虽然我理解基类和接口的概念,但我无法理解本文第二段中的模板方法的用法(" 受保护的方法和构造函数 ").

有没有人可以借助一个简单的实际例子帮助我理解这个概念?或许,理解模板方法的概念是一个很好的起点.

提前致谢.

c# base-class template-method-pattern

5
推荐指数
1
解决办法
397
查看次数

是否可以在构造函数中使用模板方法模式?

可能的重复:
在构造函数内调用虚函数

我有一个 Shape 类及其子类 Sphere :

//Shape : 

class Shape
{
    public:
        Shape(const string& name);
        virtual ~Shape();

        virtual string getName();

    protected:

        string mName;

};

Shape::Shape(const string& name) : mName(name)
{
   /*Some stuff proper to Shape*/

   /*Some stuff proper to subclass (sphere)*/

   /*Some stuff proper to Shape*/
}

Shape::~Shape(){}

string Shape::getName(){ return mName; }


//Sphere :

class Sphere : public Shape
{
    public:
        Sphere(const string& name, const float radius);
        virtual ~Sphere();

        virtual string getRadius();

    protected:

        float mRadius;
}

Sphere::Sphere(const string& …
Run Code Online (Sandbox Code Playgroud)

c++ virtual constructor template-method-pattern

5
推荐指数
1
解决办法
1197
查看次数

没有继承的模板方法模式

如何实现模板方法模式的变体,其中具体类不从基类继承,但保持模式的整体特征。它不能继承的原因是它被迫从另一个类继承,并且多重继承不可用。

例如,假设以下 Tempate Method 模式:

public abstract class BaseClass {
    public void Alpha() {
        Beta();
    }

    public abstract void Beta();

    public void Gamma() {
        Delta();
    }

    public abstract void Delta();

}

public ConcreteClass : BaseClass {
    public override void Beta() {
        Gamma();
    }

    public override void Delta() {
        Console.WriteLine("Delta");
    }
}

...
var object = new ConcreteClass();
object.Alpha(); // will outout "Delta"
Run Code Online (Sandbox Code Playgroud)

如何在没有 ConcreteClass 继承 BaseClass 的情况下获得相同的结果?

.net c# oop design-patterns template-method-pattern

5
推荐指数
1
解决办法
1663
查看次数

为什么 JdbcTemplate 是模板方法设计模式的一个示例

当我的注意力被这个吸引时,我正在阅读有关设计模式的内容,特别是有关模板方法的内容

\n\n

阅读解释和具体代码后,我仍然想知道为什么这是“模板方法”设计模式的示例。

\n\n

根据 GoF 的说法,这种模式的目的是:

\n\n
\n

\xe2\x80\x9c 定义操作中算法的骨架,将一些步骤推迟到子类。模板方法允许子类重新定义算法的某些步骤,而不更改算法\xe2\x80\x99s 结构。\xe2\x80\x9d

\n
\n\n

并且有两个参与者:

\n\n
\n

AbstractClass
\n - 定义具体子类定义的抽象基元操作,以实现算法的步骤
\n - 实现定义算法骨架的模板方法。模板方法调用原始操作以及 AbstractClass 或其他对象中定义的操作。
\n 具体类
\n 实现原始操作以执行算法的子类特定步骤。

\n
\n\n
\n\n

为什么“JdbcOperations”中的代码被认为是“模板方法”设计模式?

\n\n
    \n
  • 即使我将其与类似文件(如“JmsTemplate”)中的代码进行比较,我也没有看到在超级/抽象类中定义任何“全局/通用”算法。
  • \n
  • 具体类中实现的函数都没有在超类中定义。所有定义的方法都是通过使用接口添加的,在本例中是接口“JdbcOperations”,并且没有一个方法实际上覆盖父级中的方法。
  • \n
\n\n

我发现它对于消除 样板代码非常方便非常方便。但为什么这是一个模板方法而不仅仅是一个漂亮的编码技巧。对我来说,它看起来不像模板方法所具有的任何特征。

\n

java algorithm spring design-patterns template-method-pattern

5
推荐指数
1
解决办法
5020
查看次数

在Golang中实现模板方法模式的优雅方式

在Go中实现模板方法模式是否有一种优雅的规范方法?在C++中,它看起来像这样:

#include <iostream>
#include <memory>

class Runner {
public:
    void Start() {
        // some prepare stuff...
        Run();
    }
private:
    virtual void Run() = 0;
};

class Logger : public Runner {
private:
    virtual void Run() override {
        std::cout << "Running..." << std::endl;
    }
};

int main() {
    std::unique_ptr<Runner> l = std::make_unique<Logger>();
    l->Start();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在golang我写了这样的东西:

package main

import (
    "fmt"
    "time"
)

type Runner struct {
    doRun func()
    needStop bool
}

func (r *Runner) Start() {
    go r.doRun()
} …
Run Code Online (Sandbox Code Playgroud)

c++ go template-method-pattern

5
推荐指数
2
解决办法
1590
查看次数

实现模板化模板方法

注意:以下问题与模板方法设计模式C ++函数模板有关。为了区分两者,在引用设计模式时将使用斜体,在引用C ++模板时将使用粗体

模板方法模式的思想是使算法的各个部分可互换。这通常是通过继承来实现的,子类提供了具体的实现,这些实现被插入到基类的算法中。但是,如果挂钩方法需要为template,则此方法将无法工作,因为模板不能是虚拟的。这是一个不编译的简单示例:

class Base
{
public:

    // This is the template method
    template <typename T>
    void doSomething(T input)
    {
        //...
        auto converted = ConvertInput(input);
        //...
        std::cout << converted;
    }

protected:
    //compile error "member function templates cannot be virtual"
    template <typename T>
    virtual T ConvertInput(T input) = 0;
};

class Derived : public Base
{
protected:
    template <typename T>
    T ConvertInput(T input)
    {
        return 2 * …
Run Code Online (Sandbox Code Playgroud)

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

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

了解模板方法模式

据我所知,Template方法只不过是调用子类中定义的虚方法或抽象方法的普通方法.我是对的,或者我想念这个模式还有其他重要的东西吗?

abstract class Foo {
  public void IamTemplateMethod() { // which will be called in child class object
    method1(); // because this...
    method2(); // ...or this method was called in me
  }
  public virtual void method1() { ... } // to be overriden in child class
  public abstract void method2() { ... } // to be defined in child class
}
Run Code Online (Sandbox Code Playgroud)

如果我是对的,有没有其他常用方法来实现Template方法?

design-patterns template-method-pattern

2
推荐指数
1
解决办法
691
查看次数

私有方法模式的私有覆盖?(答案:NVI)

什么是可接受的术语(如果有的话),用于描述只能虚拟调用的方法以及基础中的其他方法?我偶尔会看到这被称为回调,但这似乎偏离了该术语的原始定义.我甚至不确定这是一种被称为模式的优点,但我正试图在评论我的代码时变得更加精确.谢谢您的帮助!

// Abstract class.
class A {
public:
  void run() { while (call()) { /* ... */ } }
private:
  virtual bool call() = 0;
};

// Completion/specialization of A.
class B : public A {
private:
  // Standard term to indicate this pattern?
  bool call();
};
Run Code Online (Sandbox Code Playgroud)

摘要:这似乎被称为非虚拟接口模式,这是模板方法模式的一个特例.感谢Nick和Steven的帮助!

virtual design-patterns private non-virtual-interface template-method-pattern

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

c ++中的模板方法模式和长参数列表

在对上一个问题的有用答案之后,我开始使用模板方法模式来创建具有许多不同选项的类.如果没有全部实现它们,那么我对该类对象的当前声明现在看起来像这样:

pc < prg, tc, 9, 0, 4, 4, test, true, true, true, true, false, true, true, 10, 0, -1, 3, 3 > mp;
Run Code Online (Sandbox Code Playgroud)

你如何处理长模板参数列表?我应该使用枚举/定义而不是真/假和数字吗?有常用的替代品吗?

c++ templates template-method-pattern

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

使用Ada的My_Class'Class(This)强制模仿模板方法设计模式

语境

我最近遇到了一个基本的OOP / Ada 2012设计问题。

基本上,我有一个实现接口协定的父类。这是在实现提供程序(ConcreteX)中分几个步骤完成的。子类通过仅覆盖其中一个步骤(DerivedY,Step_2)来扩展此实现。(试图获得一些SOLID属性)

我天真地认为会发生调度。没有。我重新发现调度与Java或其他OOP中的调度不同,并提供了解决方案。

在阿达调度经常问/回答/记录了几个问题:动态调度Ada中动态调度Ada中,访问类型阿达T'Class基础

而不是使用:

This.Step_1; This.Step_2;
Run Code Online (Sandbox Code Playgroud)

我最终使用:

T_Concrete_X'Class (This).Step_1; T_Concrete_X'Class (This).Step_2;
Run Code Online (Sandbox Code Playgroud)

在Ada OOP类设计中,我在两种选择之间挣扎:

  1. 在父类中,定义行为+原语并提供默认实现,即Current_Class'Class(This).method()(=下面提供的工作示例)

  2. 使用模板设计模式,以便将执行步骤的实现委派给另一个类

即在给定的示例中:

-- T_Concrete_X does not have a child class (current example)
overriding procedure If_A_Proc_1 (This : in out T_Concrete_X) is
begin
   -- This.template_executor being set with different classes realizing the Step_1/Step_2 contracts(current example)
   This.template_executor.Step_1;
   This.template_executor.Step_2;
end If_A_Proc_1;
Run Code Online (Sandbox Code Playgroud)

1是应避免达到预期行为的语法“技巧”吗?

我总是觉得当我写一个显式的演员表时,那是设计不力的标志。


工作示例:

src / interfacea.ads

package InterfaceA is

   type T_InterfaceA is interface;
   type T_InterfaceA_Class_Access …
Run Code Online (Sandbox Code Playgroud)

oop inheritance ada template-method-pattern ada2012

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

C#中的外观和模板方法模式有什么区别?

Facade 和 Template 方法模式有什么区别?它们都提供子系统的高级视图并对用户隐藏它。

外观图案

 internal class SubsystemA
    {
        internal string A1()
        {
            return "Subsystem A, Method A1\n";
        }
        internal string A2()
        {
            return "Subsystem A, Method A2\n";
        }
    }
    internal class SubsystemB
    {
        internal string B1()
        {
            return "Subsystem B, Method B1\n";
        }
    }
    internal class SubsystemC
    {
        internal string C1()
        {
            return "Subsystem C, Method C1\n";
        }
    }

    public static class Facade
    {

        static SubsystemA a = new SubsystemA();
        static SubsystemB b = new SubsystemB();
        static SubsystemC c …
Run Code Online (Sandbox Code Playgroud)

c# design-patterns facade template-method-pattern

0
推荐指数
1
解决办法
1759
查看次数