Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 模板方法模式:更改算法';s架构_Oop_Design Patterns_Ooad - Fatal编程技术网

Oop 模板方法模式:更改算法';s架构

Oop 模板方法模式:更改算法';s架构,oop,design-patterns,ooad,Oop,Design Patterns,Ooad,我在我的项目中使用模板方法模式,如下所示 类模板 { 公众: void算法(); { A(); B(); } 私人: 虚空A()=0; 虚空B()=0; } 我有一些子类以不同的方式实现方法A和B。 但是现在我需要一个新的类Template2来实现一个稍微不同的算法 类模板2 { 公众: void算法(); { A(); B(); C(); } 私人: 虚空A()=0; 虚空B()=0; void C() { //一些东西 A(); //一些东西 B(); } } C在所有子类中都是相同的,

我在我的项目中使用模板方法模式,如下所示

类模板
{
公众:
void算法();
{
A();
B();
}
私人:
虚空A()=0;
虚空B()=0;
}
我有一些子类以不同的方式实现方法A和B。
但是现在我需要一个新的类Template2来实现一个稍微不同的算法

类模板2
{
公众:
void算法();
{
A();
B();
C();
}
私人:
虚空A()=0;
虚空B()=0;
void C()
{
//一些东西
A();
//一些东西
B();
}
}
C在所有子类中都是相同的,所以我不把它设为虚拟的。
现在,我基于Template2创建了一个新的继承层次结构,但这似乎很愚蠢,因为我必须复制并粘贴这个新层次结构中每个子类的代码。
有没有更优雅的方式

编辑
对不起,我没有说清楚。
现在我有两个继承层次结构。
1.一个抽象类
模板
和一些子类
A1、A2、A3、A4…

2.一个抽象类
Template2
和一些子类
B1、B2、B3、B4…

这很好,但我想知道是否有办法以某种方式合并这两个层次结构,因为A1和B1的代码相同,只是它们分别来自模板和模板2。
解决方案是否为模板方法模式与我无关
伯斯和斯派特的答案对我都适用:)

非常感谢。

< P>首先,请原谅我的可怜的C++语法。< /P> 我建议您将
A()
B()
Template
分离,以便您可以更轻松地在
Template2
中重用它们

class Strategy
{
    public:
    virtual void A()=0;
    virtual void B()=0;
}
然后在
模板
模板2
之间有一个共同的祖先:

class AbstractTemplate
{
    public:
    virtual void algorithm()=0;
}
最后实现
Template
Template2
作为“最终”类(=不需要子类)


Template
Template2
之间的重叠最小(考虑到您不需要子类,我认为这是可以的)。

我同意Spotted,但是您是否考虑过只向
Template
类添加额外的算法?它仍然使用多种算法的模板模式。您得到了一个更胖的类,但没有代码重复。下面是一个例子

#include <iostream>

using namespace std;

class Template
{
public:
    void algorithm1()
    {
        A();
        B();
    }

    void algorithm2()
    {
        A();
        B();
        C();
    }

private: void C()
    {
    cout << endl << "start C() ";
    A();
    cout << "middle C() ";
    B();
    cout << "end C()" << endl;
    }

private:
    virtual void A() = 0;
    virtual void B() = 0;
};

class real :public Template {

    void A() { cout << "A(1)  "; }
    void B() { cout << "B(1) "; }
};

int main()
{
    real Real;
    cout << "algorithm1" <<endl;
    Real.algorithm1();
    cout << endl;
    cout << endl << "algorithm2 << endl";
    Real.algorithm2();

    return 0;
}
#包括
使用名称空间std;
类模板
{
公众:
void算法1()
{
A();
B();
}
void算法2()
{
A();
B();
C();
}
私有:void C()
{

我想你是不是把他的模板模式改成了策略模式了!不是说这不好,但OP可能在学习模板。其中一种是XY情况?:-)@bcperth首先,是的,因为OP缺乏上下文,它可能是XY情况。然而,我认为我的解决方案比“仅仅使用”更有价值模板模式:它避免了类的增殖。仅使用模板,您可能需要N^2个类(N*模板+N*模板2)。使用该策略,复杂性降低到N+2(N*策略+1*模板+1*模板2)但正如你所说,如果OP的目的是研究模板模式或XY情况,所有这些都是无关的,也不会有任何帮助。对不起,我没有把我的问题说清楚,这正是我想要的答案,谢谢。事实上,这里提出了一个
模板
类(包含两个算法)这可能是最好的方法。这真的很有帮助,我想我会使用它。好的,太好了!你可以通过单击我回答左上角上下箭头下方的勾号来结束问题。这完全不是强制性的-但对统计数据有好处:-)
#include <iostream>

using namespace std;

class Template
{
public:
    void algorithm1()
    {
        A();
        B();
    }

    void algorithm2()
    {
        A();
        B();
        C();
    }

private: void C()
    {
    cout << endl << "start C() ";
    A();
    cout << "middle C() ";
    B();
    cout << "end C()" << endl;
    }

private:
    virtual void A() = 0;
    virtual void B() = 0;
};

class real :public Template {

    void A() { cout << "A(1)  "; }
    void B() { cout << "B(1) "; }
};

int main()
{
    real Real;
    cout << "algorithm1" <<endl;
    Real.algorithm1();
    cout << endl;
    cout << endl << "algorithm2 << endl";
    Real.algorithm2();

    return 0;
}