当前位置: 首页 > article >正文

设计模式之模版方法模式

前言

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

定义

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

动机

        在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。
        如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?

案例

        代码

// 版本1
class Application{
public:
	bool Step2(){
		//...
    }

    void 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{

public:
	void Step1(){
		//...
	}

    void Step3(){
		//...
    }

    void Step5(){
		//...
    }
};

// 版本2
class Application : public Library {
protected:
	virtual bool Step2(){
		//...
    }

    virtual void Step4() {
		//...
    }
};

int main()
	{
	    Library* pLib=new Application();
	    lib->Run();

		delete pLib;
	}
}

class Library{
public:
    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 void Step4() = 0;
};

类图

        

总结

        “不要调用我,让我来调用你” 的反向控制结构是典型应用

        被模版方法调用的虚函数可以实现,也可以没有任何实现(抽象方法、纯虚方法),但一般推荐设置为protected方法


http://www.kler.cn/news/325311.html

相关文章:

  • 低代码可视化-uniapp蓝牙标签打印-代码生成器
  • 天龙八部怀旧单机微改人面桃花+安装教程+GM工具+虚拟机一键端
  • @overload实际并无作用
  • C# 调用虚拟打印,尝试隐藏进度窗体
  • AfuseKt1.3.6-10110功能强大的安卓网络视频播放器,支持多种在线存储和媒体管理平台!
  • The First项目报告:解读跨链互操作性平台Wormhole
  • 点餐小程序实战教程13餐桌管理
  • 雷池 WAF 如何配置才能正确获取到源 IP
  • GAMES101(作业8)
  • MySQL 加字段锁表怎么解决??
  • 情感短视频素材上哪里找?推荐几个热门情感视频素材资源网站
  • CEPH的写入流程
  • @JsonFormat与@DateTimeFormat的区别
  • 智能监控,守护绿色能源:EasyCVR在电站视频监控中心的一站式解决方案
  • PostgreSQL数据库与PostGIS在Windows中的部署与运行
  • 25基于python的文本冒险岛游戏(源码+游戏简介+python代码学习攻略)校园招聘面试
  • 解决错误:Failed to add the host to the list of known hosts
  • node节点使用:
  • windows下tp5创建定时任务
  • SSH连接Vscode
  • 解决Qt每次修改代码后首次运行崩溃,后几次不崩溃问题
  • 17 vue3之tsx手写vite tsx插件
  • 智能工牌如何通过自然语义处理技术帮助企业提高业务复盘效率?
  • 打印机共享错误11b解决方法介绍
  • nodejs fs 模块的简介与相关案例
  • 【APM】在Kubernetes中,使用Helm安装loki-distributed 3.1.1
  • 【C++并发入门】摄像头帧率计算和多线程相机读取(上):并发基础概念和代码实现
  • 技术速递|加入 .NET 智能组件生态系统
  • [深度学习]卷积神经网络CNN
  • docker常用命令、如何查看docker 镜像的sha256值