小谈设计模式(11)—模板方法模式 专栏介绍 主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。 模板方法模式 这是一种行为型设计模式,用于定义算法的框架,将算法的具体实现延迟到子类中。 抽象方法是模板方法中的基本方法,用于完成算法的一部分。 具体方法(Concrete Method) 具体方法是在抽象类中已经实现的方法,可以在模板方法中直接调用。 Java代码实现 // 抽象模板类 abstract class AbstractClass { // 模板方法,定义了算法的骨架 public final void templateMethod 总结 模板方法模式是一种简单但非常实用的设计模式,它通过将算法的框架固定在抽象类中,将具体实现延迟到具体子类中,提供了一种灵活而可扩展的算法设计方案。
1.概述 使用设计模式可以提高代码的可复用性、可扩充性和可维护性。 缺点: 每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计也更加抽象,但是更加符合“单一职责原则”,使得类的内聚性得以提高。 4.小结 (1)模板方法模式定义了算法的步骤,将这些步骤的实现延迟到了子类。 (2)模板方法模式为我们提供了一种代码复用的重要技巧。 (3)模板方法模式的抽象类可以定义抽象方法、具体方法和钩子方法。 两者的目标都是在于解耦,依赖倒置原则更加注重如何在设计中避免依赖。 ---- 参考文献 [1]设计模式(九)模版方法模式 [2]Head First 设计模式(中文版):275-311 [3]设计模式读书笔记—–模板方法模式
描述 模板设计是 FineReport 学习过程中的主要难题所在,FineReport 模板设计主要包括普通模板设计、决策报表设计和聚合报表设计三种模板设计类型。 ? 普通模板设计:是 FineReport 最常用,用的最多的设计模式,保存的文件类型为 cpt,依靠着单元格的扩展与父子格的关系来实现模板效果,可进行参数查询,填报报表,图表设计等等,但是在分页预览模式下不能在报表主体中展示控件 普通报表 普通模板就是指以 cpt 为后缀名的模板,最常用的设计模式,FineReport 默认设计模型就是普通模板设计。 普通模板设计是单元格设计模型,通过单元格扩展,单元格之间的父子格关系来实现模板效果,可直接点击快捷工具栏中的新建模板按钮新建一张空白的普通模板,也可点击文件>新建普通报表来新建,如下图: ? 详细请参照 普通模板设计; 3. 聚合报表 普通模板设计单元格扩展是相互影响的,那么如果想成块的显示一些内容,并且想保持独立性,块间不相互影响,此时就可以使用聚合报表,如下图: ?
1.函数模板默认模板参数简介 函数模板与类模板在C++98一起被引入,因种种原因,类模板可以拥有默认模板参数,而函数模板不可以。从C++11开始,这个限制被解除了,即函数模板同样可以拥有默认模板参数。 static void _printTypeName() { cout<<"T="<<typeid().name()<<endl; } }; //函数<em>模板</em>的默认<em>模板</em>参数,C++<em>11</em>开始支持 2.函数<em>模板</em>默认<em>模板</em>参数的特点 函数<em>模板</em>默认<em>模板</em>参数的用法虽然与类<em>模板</em>默认<em>模板</em>参数和函数默认参数的用法类似,但是有一个显著的特点,即当函数<em>模板</em>拥有多个默认<em>模板</em>参数时,其出现的顺序可以任意,不需要连续出现在<em>模板</em>参数的最后面 ,而在C++<em>11</em>中,函数<em>模板</em>的默认<em>模板</em>参数出现的位置则比较灵活,可以出现在任意位置。 ---- 参考文献 [1]深入理解C++<em>11</em>[M].2.11<em>模板</em>函数的默认<em>模板</em>参数
3.1消除重复代码 3.2实现泛化的delegate 4.总结 参考文献 1.概述 变参模板(variadic template)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0 同时还用到了C++11的另外一个特性——列表初始化,通过列表初始化来初始化一个变长数组, {(printarg(args), 0)…}将会展开成((printarg(arg1),0), (printarg ,比如C++11中的元祖std::tuple就是一个可变模板类,它的定义如下: template< class... 其实,可变模版参数的作用远不止文中列举的那些作用,它还可以和其它C++11特性结合起来,比如type_traits、std::tuple等特性,发挥更加强大的威力。 ---- 参考文献 [1]泛化之美–C++11可变模版参数的妙用
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/138377.html原文链接:https://javaforall.cn
类模板与友元 #include<iostream> #include<string> using namespace std; //提前让编译器知道person类存在 template<class T1 > void printPerson1(person<T1, T2>& p) { cout << "姓名:" << p.name << " 年龄:" << p.age << endl; } //类模板与友元 class T2> class person { //全局函数做友元在类内实现(一般是只写函数声明,不做定义) friend void printPerson(person<T1,T2>&p) //类模板对象做函数参数 { cout << "姓名:" << p.name << " 年龄:" << p.age << endl; } //全局函数做友元在类外实现 //1.加空模板参数列表 //2.如果是全局函数
定义 模板方法设计模式的定义如下: 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 ,主要因为这种设计模式会在抽象类中定义逻辑行为的执行顺序。 另外,模板模式也是为了解决子类通用方法,放到父类中优化设计。让每一个子类只做子类需要完成的内容,而不需要关心其他逻辑。再提取公用代码,行为由父类管理,扩展可变部分,也就非常有利于开发拓展和迭代了。 重要的、复杂的方法,可以考虑作为模板方法。 注意事项:为防止恶意操作,一般模板方法都加上 final 关键词。 Copyright: 采用 知识共享署名4.0 国际许可协议进行许可 Links: https://lixj.fun/archives/设计模式-模板方法设计模式
模板模式:一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。 模板模式主要由抽象模板(Abstract Template)角色和具体模板(Concrete Template)角色组成。 抽象模板(Abstract Template): 定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤;定义并实现了一个模板方法。 具体模板(Concrete Template): 实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤;每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法 创建一个抽象类,它的模板方法被设置为 final,这样它就不会被重写。
Prepared by 拟制 Date 日期 2010-11-23 Reviewed by 评审人 Date 日期 . 7 5.1 系统结构设计及子系统划分. 7 5.2 系统功能模块详细设计. 8 5.3 系统界面详细设计. 8 5.3.1 外部界面设计. 8 5.3.2 内部界面设计. 9 5.3.3 用户界面设计. 9 6、 数据库系统设计. 9 6.1设计要求. 9 6.2 信息模型设计. 9 6.3 数据库设计. 9 6.3.1 设计依据. 9 6.3.2 5.2 系统功能模块详细设计 按结构化设计方法,在系统功能逐层分解的基础上,对系统各功能模块或子系统进行设计。此为详细设计的主要部分之一。 5.3.3 用户界面设计 规定人机界面的内容、界面风格、调用方式等,包括所谓的表单设计、报表设计和用户需要的打印输出等设计。此部分内容可能比较多。
具有这种特征的模式即为模板方法。 显而易见,抽象类中定义了模板方法,但又需要子类自己的逻辑去配合父类的模板方法才能完成最终的方法调用。 ||||||||||||| 正如示例代码所示: 1、父类(抽象类)定义了抽象方法和模板方法 2、子类实现抽象方法 3、在执行父类的模板方法的时候发现,具体的逻辑会根据具体的子类型来确定。 这就 实现了一个模板算法下的不同的实现内容 到此大家应该也对模板方法有了个大概的认识,下面我们来总结一下模板方法的重要特征(敲黑板): 1、关于模板方法Template Method的角色划分:抽象类和具象子类
菜鸟:大家伙儿常说的模板方法是什么? 码农:设计模式的经典名著中Design Patterns: Elements of Reusable Object-Oriented Software(《设计模式——可复用面向对象软件的基础》)提出的一种软件编码思想模式 菜鸟:这跟模板方法有什么关系? 码农:模板方法就是来解决这个问题的;将完成一件事情的稳定和变化独立开来,定义好一个操作的算法骨架(稳定),而将一些步骤延迟到具体场景中实现(变化);模板方法使得不同场景复用同一个算法框架,具体的场景重定义算法的某些特定步骤 子类扩展变化virtual bool step4() {//do somethingstd::cout << "application step4" << std::endl;return true;}};使用模板方法
稍以琢磨,定义抽象类倒有不少好处—— 一,对于不需要搓澡人自定义的步骤,直接在抽象类中功能实现即可,不用绕圈子;哪怕谁对步骤有自定义需求,子类覆盖父类方法即可(也看个人设计是否允许覆盖); 上面代码中的 bathing 方法,即是所谓的模板方法—— 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中去;模板方法可以在子类不改变算法结构的情况下,重新定义算法中的某些步骤。 如何将决定权交给搓澡人自己呢,这也是模板方法这种模式中经常运用到的,通过添加钩子判断函数,让搓澡人根据心情去覆写改变判断逻辑,从而达到间接干预模板方法执行流的目的。 那么,关于设计模式的学习,你觉得你应该形似还是神似呢?学其形,势必要刻板的遵循定义,依葫芦画瓢,那只是没有灵魂的模仿;悟其神,参透模式背后的设计思想,才是你能灵活运用的基本前提。 是的,人家只是要基于代码整洁的考虑,将复杂的业务通通封装成一个个单独的方法,逻辑清晰明了,代码整洁不冗余,这样的模板方法可不完全符合模板方法的定义的,但看起来爽啊!
模板模式 模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。 2.缺点 对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。 3.代码示例 3.1 模板方法类 public abstract class AbstractClass { /** * 功能描述: * 〈模板方法〉 * abstract void abstractMethod1(); //抽象方法1 public abstract void abstractMethod2(); //抽象方法2 } 3.2 模板方法的拓展类
模板方法 使用基类定义整体步骤,即若干方法的调用过程,将一些可变的步骤由子类去重写。这样就可以利用多态在不改变操作的整体结构下定制一些特殊细节。 代码解释 可以联想在线电子邮件和普通邮递的区别。 模板方法强调抽象过程的不变性,某些细节的可变性。
背景 当房子建好后,相同的房间规格,但是可以根据不同的需求进行不同的装修,有把天花板刷黄,有些刷绿,有些乱刷...这个很类似于设计模式中的模板模式,根据相同的模板生成出来后内部装修可以自定义。 模板模式是什么? 模板模式(Template Pattern),定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 角色: 抽象的模板(Abstract Template):主要用于定义骨架和方法操作,提供给具体模板继承的一个顶级模板。 具体模板(Concrete Template):具体实现抽象模板的一些方法及实现自己的逻辑和步骤。 模板模式可以干嘛? 模板模式类图 ?
模板设计模式定义: 定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。 DodishTemplate bouilli = new Bouilli(); bouilli.dodish(); } } 这样我们就实现了使用模板模式的一个完整的实例 模板设计模式常在数据库操作中使用,我现在使用模板模式做一个JDBC的查询模板: (1) 抽象查询父类 public abstract class AbstractDao { /** Integer age; private String sex; private String address; //set...get省略 } 如上就使用模板模式做的查询 模板模式的优点 (1)具体细节步骤实现定义在子类中,子类定义详细处理算法是不会改变算法整体结构。 (2)代码复用的基本技术,在数据库设计中尤为重要。
链接大部分都是官方文档的链接,现在搬运过来只是为了添加自己的心得体会 [财务][数据化分析][帆软]报表设计-模板预览 1. 描述 模板预览就是指在 Web 端查看模板效果,FineReport 提供了多种不同的预览方式,来满足用户的多样化需求。 FineReport 中普通模板总共有5种不同的预览模式:分页预览、填报预览、新填报预览、数据分析、移动端预览,如下图: ? 决策报表下为 决策报表预览、移动端预览,如下图: ? 2. op=view) 4 新填报预览 新填报预览,采用了新样式的控件,加载速度快,采用了分页加载 新填报预览(op=write_plus) 5 移动端预览 通过扫码直接在手机上展现报表,让用户直观地看到当前设计模板的实际效果 移动端预览(op=mobile) 6 决策报表预览 决策报表预览是针对于决策报表设计模式而言的 决策报表预览
设计模式——模板模式 强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码 在面向对象程序设计过程中,程序员常常会遇到如下情况:设计一个系统时知道算法所需的关键步骤,且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关 2)、简单说,模板方法模式定义了一个操作中的算法骨架,而将步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤。 3)、这种类型的设计模式属于行为型模式。 模板方式的缺点:【1】对每个不同的实现都需要定义一个子类,这个导致类的个数增加,系统更加庞大,设计也更加抽象。 【5】模板方式的使用场景:存在执行一系列步骤,且一类产品的此步骤基本相同,但其中个别步骤的实现细节不同时,通常可以考虑使用模板方法模式。 所属专题 设计模式
前言: 上文我们学到右值引用及其移动语义,学习到了C++11中对性能提升对重要的更新之一。C++11进阶之路:右值引用和移动语义,让代码跑得更快! -CSDN博客 本文我们来讲讲,C++11的下一个新语法:可变参数模板 1.基本原理 C++11支持可变参数模板。既支持可变参数的函数模板、可变模板参数的类模板。 模板参数包:包含零或多个模板参数。 2. 函数参数包:包含零或多个函数参数。 可变参数模板的本质其实就是在编译过程中对应的实例化出零或多个参数。 在可变参数模板中可以通过sizeof... 运算符得到可变参数模板中有几个参数。 Args> iterator emplace (const_iterator position, Args&&... args); emplace是C++11提供的新类成员函数。