模板设计模式

模板方法模式是一种设计模式,用于定义算法的骨架并允许子类替换具体步骤。通过将固定算法流程抽象出来,子类可以在不改变整体结构的情况下重定义部分行为。博客中展示了如何使用模板方法模式改进动物园表演流程,使得流程控制在父类中,而具体的表演细节由子类实现,从而实现多态和接口隔离。

模板方法

定义

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤

就是说一个算法中间又可以分为很逗步骤,但是流程是固定的就可以使用该模式。由于算法的流程是一个不变的那么就应该把其抽象出来,用子类去实现过程的实现

例如:某个品牌动物园,有一套固定的表演流程,但是其中有若干个表演子流程受欢迎程度比较低,希望将这几个表演流程创新,以尝试迭代更新表演流程;

直接上代码,下面这个是普通的写法,

#include <iostream>
using namespace std;

class ZooShow {
public:
    void Show0(){
        cout << "show0" << endl;
    }
    void Show2(){
        cout << "show2" << endl;
    }
};

class ZooShowEx {
public:
    void Show1(){
        cout << "show1" << endl;
    }
    void Show3(){
        cout << "show3" << endl;
    }
};

int main () {
    ZooShow *zs = new ZooShow;
    ZooShowEx *zs1 = new ZooShowEx;
    // 流程是固定的(稳定点),应该抽象出来;另外子流程是不应该暴露给客户,违反了接口隔离原则;
    zs->Show0();
    zs1->Show1();
    zs->Show2();
    zs1->Show3();
    return 0;
}

//可以看出来很挫,每个步骤手动调用

由于是固定的算法流程是固定的,我们可以将算法的流程抽象出来

#include <iostream>
using namespace std;

class ZooShow {
protected:    
    virtual void Show0(){
        cout << "show0" << endl;
    }
    virtual void Show2(){
        cout << "show2" << endl;
    }

    virtual void Show1(){
    }

    virtual void Show3(){
    }

public:
    void show(){
        Show0();
        Show1();
        Show2();
        Show3();
    }
    
};

class ZooShowEx : public ZooShow{
protected:
    virtual void Show1(){
        cout << "show1" << endl;
    }
    virtual void Show3(){
        cout << "show3" << endl;
    }
};

class ZooShowEx1 : public ZooShow{
protected:
    virtual void Show2(){
        cout << "show2+++" << endl;
    }
    virtual void Show0(){
        cout << "show0---" << endl;
    }
    virtual void Show1(){
        cout << "show0~~~" << endl;
    }
};



int main () {
    ZooShow *zs = new ZooShowEx;
    ZooShow *zs1 = new ZooShowEx1;

    zs->show();
    zs1->show();
}

使用多态,让接口在子类中实现,同时使用protected限定方法,让子类中无法使用该方法,只有在父类中才可以调用。

总结: 通过算法骨架来约束子类的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值