描述 模板设计是 FineReport 学习过程中的主要难题所在,FineReport 模板设计主要包括普通模板设计、决策报表设计和聚合报表设计三种模板设计类型。 ? 普通模板设计:是 FineReport 最常用,用的最多的设计模式,保存的文件类型为 cpt,依靠着单元格的扩展与父子格的关系来实现模板效果,可进行参数查询,填报报表,图表设计等等,但是在分页预览模式下不能在报表主体中展示控件 普通报表 普通模板就是指以 cpt 为后缀名的模板,最常用的设计模式,FineReport 默认设计模型就是普通模板设计。 普通模板设计是单元格设计模型,通过单元格扩展,单元格之间的父子格关系来实现模板效果,可直接点击快捷工具栏中的新建模板按钮新建一张空白的普通模板,也可点击文件>新建普通报表来新建,如下图: ? 详细请参照 普通模板设计; 3. 聚合报表 普通模板设计单元格扩展是相互影响的,那么如果想成块的显示一些内容,并且想保持独立性,块间不相互影响,此时就可以使用聚合报表,如下图: ?
定义 模板方法设计模式的定义如下: 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 ,主要因为这种设计模式会在抽象类中定义逻辑行为的执行顺序。 另外,模板模式也是为了解决子类通用方法,放到父类中优化设计。让每一个子类只做子类需要完成的内容,而不需要关心其他逻辑。再提取公用代码,行为由父类管理,扩展可变部分,也就非常有利于开发拓展和迭代了。 重要的、复杂的方法,可以考虑作为模板方法。 注意事项:为防止恶意操作,一般模板方法都加上 final 关键词。 Copyright: 采用 知识共享署名4.0 国际许可协议进行许可 Links: https://lixj.fun/archives/设计模式-模板方法设计模式
模板模式:一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。 模板模式主要由抽象模板(Abstract Template)角色和具体模板(Concrete Template)角色组成。 抽象模板(Abstract Template): 定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤;定义并实现了一个模板方法。 具体模板(Concrete Template): 实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤;每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法 创建一个抽象类,它的模板方法被设置为 final,这样它就不会被重写。
. 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 用户界面设计 规定人机界面的内容、界面风格、调用方式等,包括所谓的表单设计、报表设计和用户需要的打印输出等设计。此部分内容可能比较多。 7 信息编码设计 7.3 代码结构设计 确认信息分类编码总体方案,进行分类代码结构设计。
具有这种特征的模式即为模板方法。 显而易见,抽象类中定义了模板方法,但又需要子类自己的逻辑去配合父类的模板方法才能完成最终的方法调用。 ||||||||||||| 正如示例代码所示: 1、父类(抽象类)定义了抽象方法和模板方法 2、子类实现抽象方法 3、在执行父类的模板方法的时候发现,具体的逻辑会根据具体的子类型来确定。 这就 实现了一个模板算法下的不同的实现内容 到此大家应该也对模板方法有了个大概的认识,下面我们来总结一下模板方法的重要特征(敲黑板): 1、关于模板方法Template Method的角色划分:抽象类和具象子类
稍以琢磨,定义抽象类倒有不少好处—— 一,对于不需要搓澡人自定义的步骤,直接在抽象类中功能实现即可,不用绕圈子;哪怕谁对步骤有自定义需求,子类覆盖父类方法即可(也看个人设计是否允许覆盖); 上面代码中的 bathing 方法,即是所谓的模板方法—— 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中去;模板方法可以在子类不改变算法结构的情况下,重新定义算法中的某些步骤。 如何将决定权交给搓澡人自己呢,这也是模板方法这种模式中经常运用到的,通过添加钩子判断函数,让搓澡人根据心情去覆写改变判断逻辑,从而达到间接干预模板方法执行流的目的。 那么,关于设计模式的学习,你觉得你应该形似还是神似呢?学其形,势必要刻板的遵循定义,依葫芦画瓢,那只是没有灵魂的模仿;悟其神,参透模式背后的设计思想,才是你能灵活运用的基本前提。 是的,人家只是要基于代码整洁的考虑,将复杂的业务通通封装成一个个单独的方法,逻辑清晰明了,代码整洁不冗余,这样的模板方法可不完全符合模板方法的定义的,但看起来爽啊!
菜鸟:大家伙儿常说的模板方法是什么? 码农:设计模式的经典名著中Design Patterns: Elements of Reusable Object-Oriented Software(《设计模式——可复用面向对象软件的基础》)提出的一种软件编码思想模式 菜鸟:这跟模板方法有什么关系? 码农:模板方法就是来解决这个问题的;将完成一件事情的稳定和变化独立开来,定义好一个操作的算法骨架(稳定),而将一些步骤延迟到具体场景中实现(变化);模板方法使得不同场景复用同一个算法框架,具体的场景重定义算法的某些特定步骤 子类扩展变化virtual bool step4() {//do somethingstd::cout << "application step4" << std::endl;return true;}};使用模板方法
模板模式 模板方法(Template Method)模式的定义如下:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。 2.缺点 对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。 3.代码示例 3.1 模板方法类 public abstract class AbstractClass { /** * 功能描述: * 〈模板方法〉 * abstract void abstractMethod1(); //抽象方法1 public abstract void abstractMethod2(); //抽象方法2 } 3.2 模板方法的拓展类
模板设计模式定义: 定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。 DodishTemplate bouilli = new Bouilli(); bouilli.dodish(); } } 这样我们就实现了使用模板模式的一个完整的实例 模板设计模式常在数据库操作中使用,我现在使用模板模式做一个JDBC的查询模板: (1) 抽象查询父类 public abstract class AbstractDao { /** Integer age; private String sex; private String address; //set...get省略 } 如上就使用模板模式做的查询 模板模式的优点 (1)具体细节步骤实现定义在子类中,子类定义详细处理算法是不会改变算法整体结构。 (2)代码复用的基本技术,在数据库设计中尤为重要。
设计模式——模板模式 强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码 在面向对象程序设计过程中,程序员常常会遇到如下情况:设计一个系统时知道算法所需的关键步骤,且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关 2)、简单说,模板方法模式定义了一个操作中的算法骨架,而将步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤。 3)、这种类型的设计模式属于行为型模式。 模板方式的缺点:【1】对每个不同的实现都需要定义一个子类,这个导致类的个数增加,系统更加庞大,设计也更加抽象。 【5】模板方式的使用场景:存在执行一系列步骤,且一类产品的此步骤基本相同,但其中个别步骤的实现细节不同时,通常可以考虑使用模板方法模式。 所属专题 设计模式
链接大部分都是官方文档的链接,现在搬运过来只是为了添加自己的心得体会 [财务][数据化分析][帆软]报表设计-模板预览 1. 描述 模板预览就是指在 Web 端查看模板效果,FineReport 提供了多种不同的预览方式,来满足用户的多样化需求。 FineReport 中普通模板总共有5种不同的预览模式:分页预览、填报预览、新填报预览、数据分析、移动端预览,如下图: ? 决策报表下为 决策报表预览、移动端预览,如下图: ? 2. op=view) 4 新填报预览 新填报预览,采用了新样式的控件,加载速度快,采用了分页加载 新填报预览(op=write_plus) 5 移动端预览 通过扫码直接在手机上展现报表,让用户直观地看到当前设计模板的实际效果 移动端预览(op=mobile) 6 决策报表预览 决策报表预览是针对于决策报表设计模式而言的 决策报表预览
背景 当房子建好后,相同的房间规格,但是可以根据不同的需求进行不同的装修,有把天花板刷黄,有些刷绿,有些乱刷...这个很类似于设计模式中的模板模式,根据相同的模板生成出来后内部装修可以自定义。 模板模式是什么? 模板模式(Template Pattern),定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 角色: 抽象的模板(Abstract Template):主要用于定义骨架和方法操作,提供给具体模板继承的一个顶级模板。 具体模板(Concrete Template):具体实现抽象模板的一些方法及实现自己的逻辑和步骤。 模板模式可以干嘛? 模板模式类图 ?
模板方法 使用基类定义整体步骤,即若干方法的调用过程,将一些可变的步骤由子类去重写。这样就可以利用多态在不改变操作的整体结构下定制一些特殊细节。 代码解释 可以联想在线电子邮件和普通邮递的区别。 模板方法强调抽象过程的不变性,某些细节的可变性。
-----------------------------------------------------------------深入浅出的设计模式 模板方法模式(Template Method 模板方法模式是基于继承的代码复用的基本技术,模板方法模式的结构和用法也是面向对象设计的核心。 模板方法的本质:抽象封装流程,具体进行实现 模版方法模式需要开发抽象类和具体子类的设计师之间的协作。 一个设计师负责给出一个算法的轮廓和骨架 另一些设计师则负责给出这个算法的各个逻辑步骤。 多个子类有公有的方法,并且逻辑基本相同时; 重要,复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现; 重构时,模板方法模式 是一个经常使用的模式,把相同的代码抽取到父类,然后通过钩子函数约束其行为 最后,设计模式给出的是一种设计框架,而不是条条框框,你需要用的是他真正优秀的地方! 开发实例 ?
这个就是模板方法。 一、定义 定义了一个算法骨架,允许子类为一个或多个步骤提供实现。使子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。 AbstractHouse { /** *@author liusy *@date 2020/3/6 0006 23:53 *@desc 定义一个建造房屋的固定步骤,也就是模板
模板方法模式是类的行为模式。 准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现, 然后声明一些抽象方法迫使子类实现剩余的逻辑。 这就是模板方法的用意。 模板方法模式的结构 ? 这里涉及两个角色: 抽象模板角色(Abstract Template)由如下责任: 定义了一个或多个抽象操作,以便让子类实现。 定义并实现了一个模板方法。这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体的方法。 每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法(也就是顶级路基的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。 好莱坞原则体现了模板模式的关键: 子类可以置换掉父类的可变部分,但是子类却不可以改变模板方法所代表的顶级逻辑。
模板方法模式 一、定义 模板方法模式是类的行为模式。定义一个模板结构,将具体内容延迟到子类去实现。 二、作用 在不改变模板结构的前提下在子类中重新定义模板中的内容。 模板方法模式中的方法以分为两大类:模板方法和基本方法。 ● 模板方法 一个模板方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法或一个总行为的方法。 一个抽象类可以有任意多个模板方法,而不限于一个。每一个模板方法都可以调用任意多个具体方法。 缺点 ● 需要为每一个基本方法的不同实现提供一个子类,如果父类中可变的基本方法太多,将会导致类的个数增加,系统更加庞大,设计也更加抽象, 此时,可结合桥接模式来进行设计。 (BaseActivity,BaseFragment) ● 2.重要、复杂的算法,可以把核心的算法实现设计为模板方法,细节由子类去完成。
模板模式 定义一个操作中的算法框架,将一些步骤延迟到子类中,使子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。 子类重写或实现父类的方法。再由父类的模板方法调用这些公共的方法。 重要、复杂的算法,可以把核心算法设计为模板方法,相关细节由子类实现。 重构时候,经相同代码提取到父类,再通过钩子函数约束其行为。 1业务逻辑方法1");} @Override protected void method2() { System.out.println("模板1业务逻辑方法2"); } 2业务逻辑方法1"); } @Override protected void method2() { System.out.println("模板2业务逻辑方法2"); 1业务逻辑方法1模板1业务逻辑方法2-----------------模板2业务逻辑方法1模板2业务逻辑方法2 ----
比如,我们设计一个跨系统的客户端软件,Windows需要一套展现类,Linux需要一套,mac还需要一套。 这样,只需要抽取他们的共同操作编程一个框架类,具体使用到哪个系统时,再使用对应的类,有点像C++里面的模板。 应用场景 1 一次性实现一个类的不变部分,其他的部分留到子类实现。
模式结构 模板方法模式包含以下主要角色: 抽象类:负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成。 源码导读 模板方法模式一般以“XXXtemplate”这种方式来命名,像我们所熟知的JdbcTemplate 就是采用模板方法模式设计的。 对于这种固定步骤的功能,我们就可以考虑用模板方法模式来实现了。 JDBCTemplate继承了基类JdbcAccessor和接口类JdbcOperation。 在基类JdbcAccessor的设计中,对DataSource数据源进行管理和配置。 ,类的方法被划分为这几类:模板方法(定义了算法的骨架,按某种顺序调用其包含的基本方法),基本方法(包括抽象方法,具体方法,钩子方法) 这个execute 便是它的模板方法了。