设计模式(7)——模板方法模式

本文深入探讨了模板方法模式,一种使子类可以在不改变算法结构的情况下重定义算法特定步骤的设计模式。通过明星演唱会的实例,详细阐述了抽象模板类与具体子类的角色,以及模板方法模式的优点与应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模板方法模式

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

角色扮演

具体子类(RealClass)

由子类实现的方法,并且在模板方法中被调用

抽象模板类(AbstranctClass)

是一个或者多个,一般是一个具体方法/框架,实现对基本方法的调度,来完成固定的业务逻辑

举例说明

现在某明星要开一场演唱会,那么久有如下基本预备工作,1.与经纪公司洽谈合作2.筹备阶段(场地、时间。。。)3.宣传工作(要赚钱啊),主要阶段如上,但是仅是是一场演唱会,而存在哪位明星,哪家经纪公司,地点、时间等不定因素,但是流程是一致的,这也说明模板是一个框架。

//抽象模板类
class AbstranctClass
{
  public:
    AbstranctClass();
    virtual ~AbstranctClass();
    void process(){
      cout<< "开场演唱会---"<< endl;
      cout<<"-----------------"<<endl;
      cout<<"-----------------"<<endl;
      funcA();
      funcB();
      funcC();
    }
    virtual void funcA() = 0;
    virtual void funcB() = 0;
    virtual void funcC() = 0;
  protected:
  private:
};

//具体实现子类
class RealClass :public AbstranctClass
{
  public:
    RealClass();
    virtual ~RealClass();
    void funcA(){
      cout << "洽谈阶段---明星A与公司B" << endl;
    }
    void funcB(){
      cout << "筹备阶段---地点:成都:时间:2018:09:12" << endl;
    }
    void funcC(){
      cout << "宣传阶段---赞助商C。。" << endl;
    }
  protected:
  private:
};

demo:

int main(){
    AbstranctClass *abstran = new RealClass();
    abstran->process();
return 0;
}

结果:

 

优点

1:具体细节步骤由子类实现,子类定义详细的处理逻辑不会改变整个框架结构

2.:代码复用的基本 技术,在数据库设计中尤为重要

3:存在一种反向的控制结构,通过一个父类调用其子类的造作,通过子类对父类进行扩展和实现,完全符合开闭原则

缺点

每个不同的实现都需要定义一个子类,会导致类的个数增加,系统更加庞大。

应用场景

多个子类有共有的方法,并且逻辑相同/逻辑相同,细节有差异

对重要,复杂的算法,可以讲核心算法设计为模板方法,周边细节由子类实现

重构时,经常使用的方案,将相同的代码抽象到父类,通过钩子函数约束行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值