模板模式Template Method

模板模式Template Method模板模式Template Method组件协作典型模式案例模式定义重要总结组件协作现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,”组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是两者之间协作时常用的模式典型模式Template MethodStrategyObserver / Event动机在软件构造过程中,对某一项任务,它常常有稳定的的整体操作骨架,但各个子步骤 却有很多改变的需求,或者由于固有的原因,(比如框架和应用之间的关系)而无法和任务的整体结构同时

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

组件协作

现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,”组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是两者之间协作时常用的模式

典型模式

  • Template Method
  • Strategy
  • Observer / Event

动机

在软件构造过程中,对某一项任务,它常常有稳定的的整体操作骨架,但各个子步骤 却有很多改变的需求,或者由于固有的原因,(比如框架和应用之间的关系)而无法和任务的整体结构同时实现

如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或晚期实现需求?

案例

使用模板方法前

//程序开发人员
class Library
{ 
   
private:
public:
    void step1(){ 
   
        //..
    }
    void step3(){ 
   
        //..
    }
    void step5(){ 
   
        //..
    }
};

//应用程序开发人员
class Application
{ 
   
public:
bool step2(){ 
   
    //..
}
bool step4(){ 
   
    //..
}
};

int main(){ 
   
    Library lib();
    Application app();

    lib.Step1();
    if(app.Step2()){ 
   
        lib.Step3();
    }
    for(int i = 0;i < 4;i ++){ 
   
        app.Step4();
    }

    lib.Step5();
}

使用模板方法后

//程序库开发人员
class Library
{ 
   
private:
public:
    //稳定 template method
    void Run(){ 
   
        Step1();
        if(Step2()){ 
       //支持变换==>虚函数的多态调用
            Step3();
        }
        for(int i = 0;i < 4;i ++){ 
   
            Step4();//支持变化//==>虚函数调用多态
        }
        Step5();
    }
    virtual ~Library(){ 
   };
protected:
    void Step1(){ 
   
        //稳定
        //..
    }
    void Step3(){ 
   
        //稳定
        //..
    }
    void Step5(){ 
   
        //稳定
        //..
    }
    virtual bool Step2() = 0;//变换
    virtual bool Step4() = 0;//变换
};


//应用程序开发人员
class Application
{ 
   
protected:
    virtual bool Step2(){ 
   
        //..子类重写
    }
    virtual bool Step4(){ 
   
        //..子类重写
    }
};

int main(){ 
   
    Library * Plib = new Application();
    lib-Run();
    delete Plib;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

模式定义

定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override重写)该算法的某些特定步骤

重要总结

  • Template Method模式是一种非常基础的设计模式,再面向对象系统中有大量的应用,它用最简洁的机制(虚函数的多态),为很多应用程序框架提供了灵活的扩展点,是代码复用方面的实现结构。
  • 除了可以灵活应对子步骤的变换外,“不要调用我,让我来调用你”的反向控制结构Template Method的典型应用
  • 在具体实现方面,被Template Method调用的虚方法可以实现,也可以没有任何实现(抽象方法,纯虚方法)一般设置他们为protected方法。

笔记

  • 扩展点:继承+虚函数就是扩展
  • 反向控制结构“不要调用我,让我来调用你” –> library调用用户代码 晚绑定
  • 函数指针也是晚绑定机制
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/168515.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm汉化包下载[通俗易懂]

    pycharm汉化包下载[通俗易懂]把解压后的文件放到pycharm安装目录lib文件夹下即可链接:https://pan.baidu.com/s/126-yg7ojwwryywBzUuVEhQ提取码:v5j0

    2022年5月9日
    34
  • vue双向绑定数组和对象有什么区别_后端接收前端json数据

    vue双向绑定数组和对象有什么区别_后端接收前端json数据众所周知,vue中v-model会忽略所有表单元素的value、checked、selectedattribute的初始值而总是将Vue实例的数据作为数据来源。大部分情况,v-model是绑定一个对象的属性,但是如果数据库中的数据是一个数组,这种情况下,如果把数组转换成对象再绑定,然后再转换回去提交到数据库显然是一件工程量很大的事情,本着程序员偷懒的原则,我发现了一个便捷的方法,废话不多说,直接上干货。HTML代码如下:<!DOCTYPEhtml><htmllan.

    2022年9月14日
    0
  • 理解目标检测中的mAP与F1 Score

    理解目标检测中的mAP与F1 Score文章目录总述IoUTP、TN、FP、FNPrecisionRecallF1-ScoremAPmAP计算过程:总述要理解mAP与F1Score需要一些前置条件,比如:IoU、FP、TP、FN、TN、AP等IoU衡量监测框和标签框的重合程度。一张图就能解释。TP、TN、FP、FNTP,即TruePositives,表示样本被分为正样本且分配正确。TN,即TrueNegatives,表示样本被分为样本且分配正确。FP,即FalsePositives,表示样本被分为正样本但分配错

    2022年10月14日
    0
  • VLC搭建RTSP直播流,图文介绍

    VLC搭建RTSP直播流,图文介绍将一个视频转成rtsp流,通过vlc播放器,搭建一个rtsp服务器,让rtsp客户端去访问这个视频的rtsp流1需要有vlc播放器,我的版本如下2媒体–>流3添加视频文件,点击添加一个mp4文件4选择串流,然后点击”下一个”5选择新目标,RTSP,然后点击添加6端口默认,路径添加个自定义名……

    2022年10月20日
    0
  • mysql 隐式类型转换_scala的隐式转换

    mysql 隐式类型转换_scala的隐式转换在mysql查询中,当查询条件左右两侧类型不匹配的时候会发生隐式转换,可能导致查询无法使用索引。下面分析两种隐式转换的情况看表结构phone为int类型,name为varcharEXPLAINselect*fromuserwherephone=’2’EXPLAINselect*fromuserwherephone=2两种情况都可以用到索引,这次等号右侧…

    2022年10月11日
    1
  • 记笔记最好用的超高颜值软件之一!Typora 你值得拥有!「建议收藏」

    记笔记最好用的超高颜值软件之一!Typora 你值得拥有!「建议收藏」之前一直在寻找一款比较好用的记笔记软件,OneNote很强大,但是有时总是出现同步失败的问题,而且对代码类型的笔记不太友好。之后意外了解到markdown(一种富文本的记笔记形式),类似CSDN,于是就了解到Typora这款颜值超高还免费的软件!它支持多种好看的主题,支持代码高亮,文字注释…

    2022年5月12日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号