一、什么是模板方法模式

概念:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
通俗的讲,模板方法模式是通过把不变行为搬到超类,去除子类里面的重复代码提现它的优势,它提供了一个很好的代码复用平台。当不可变和可变的方法在子类中混合在一起的时候,不变的方法就会在子类中多次出现,这样如果摸个方法需要修改则需要修改很多个,虽然这个这个问题在设计之初就应该想好。这个时候模板方法模式就起到了作用了,通过模板方法模式把这些重复出现的方法搬到单一的地方,这样就可以帮助子类摆脱重复不变的纠缠。
举个好懂的例子,小时候笔者家里穷,在农村上小学的时候考试都是每个学生手抄试卷,因为那个时候学校还没有试卷印刷。全班五十多个学生每个学生都要重复抄一遍黑板的试卷,并且像笔者这样的近视眼很容易就抄错了,8抄成3,7抄成1等到,然后明明做对了但是分数就是不高,导致笔者一直是全班倒数。这就是个很严重的重复不可变的问题,现在条件好了不少,学生不需要抄试卷,试卷印刷就解决了这个重复抄试卷的问题。模板方法也是类似。
二、模式对比
1、抄试卷模式
笔者就以抄试卷模式为名来阐述重复不变带来的不便,下面会对该模式进行改进。
学生甲抄的试卷
public class TestPaperA {
//试卷第一题
public void testQuestion1(){
System.out.println("小龙女是杨过的什么亲戚?() A.小姨妈 B.大姨妈 C.姑妈 D.舅妈");
System.out.println("答案:C");
}
//试卷第二题
public void testQuestion2(){
System.out.println("全真教的首任掌门是谁?A.周伯通 B.欧阳锋 C.王重阳 D.西门吹牛");
System.out.println("答案:C");
}
//试卷第三题
public void testQuestion3(){
System.out.println("《天龙八部》中被封为南院大王的大侠是谁?A.段誉 B.乔峰 C.慕容复 D.段智兴");
System.out.println("答案:B");
}
}
学生乙抄的试卷
public class TestPaperB {
//试卷第一题
public void testQuestion1(){
System.out.println("小龙女是杨过的什么亲戚?() A.小姨妈 B.大姨妈 C.姑妈 D.舅妈");
System.out.println("答案:A");
}
//试卷第二题
public void testQuestion2(){
System.out.println("全真教的首任掌门是谁?A.周伯通 B.欧阳锋 C.王重阳 D.西门吹牛");
System.out.println("答案:C");
}
//试卷第三题
public void testQuestion3(){
System.out.println("《天龙八部》中被封为南院大王的大侠是谁?A.段誉 B.乔峰 C.慕容复 D.段智兴");
System.out.println("答案:D");
}
}
客户端代码
public class ShowAnswer {
public static void main(String[] args) {
System.out.println("学生甲的试卷");
TestPaperA stuA = new TestPaperA();
stuA.testQuestion1();
stuA.testQuestion2();
stuA.testQuestion3();
System.out.println("学生乙的试卷");
TestPaperB stuB = new TestPaperB();
stuB.testQuestion1();
stuB.testQuestion2();
stuB.testQuestion3();
}
}
很容易发现上面两个学生抄的试卷有很多重复的地方,比如试卷的题目,输出答案的方法,这些都在每个学生试卷类中混合在一起了,既不利于维护,也不利于浏览,下面看一下模板方法模式是怎么改进的。
2、模板方法模式
将每个学生试卷的重复部分提取出来,题目,作答等等。
首先改造试卷类,将该类改为抽象类,在该类中我添加了三个抽象的方法用于子类实现,学生都是要作答的,但是答案不一样,所以可以将作答的过程作为重复不变的方法提取出来,代码如下。
public abstract class TestPaper {
//试卷第一题
public void testQuestion1(){
System.out.println("小龙女是杨过的什么亲戚?() A.小姨妈 B.大姨妈 C.姑妈 D.舅妈");
System.out.println("答案:" + answer1());
}
//试卷第二题
public void testQuestion2(){
System.out.println("全真教的首任掌门是谁?A.周伯通 B.欧阳锋 C.王重阳 D.西门吹牛");
System.out.println("答案:" + answer2());
}
//试卷第三题
public void testQuestion3(){
System.out.println("《天龙八部》中被封为南院大王的大侠是谁?A.段誉 B.乔峰 C.慕容复 D.段智兴");
System.out.println("答案:" + answer3());
}
//这三个钩子方法是给每个子类去实现,并返回答案的
public abstract String answer1();
public abstract String answer2();
public abstract String answer3();
//模板方法,考试的过程,定义基本的考试过程,子类回调
public void exam(){
testQuestion1();
testQuestion2();
testQuestion3();
}
}
首先来看第一个学生的考试情况
public class TestPaperA extends TestPaper{
@Override
public String answer1() {
return "A";
}
@Override
public String answer2() {
return "B";
}
@Override
public String answer3() {
return "D";
}
}
其他学生的试卷可能答案不是一样的,但是基本的答题过程就是一样的,所以就不重复写了,下面看下客户端代码。
public class ShowAnswer {
public static void main(String[] args) {
TestPaper testPaper = new TestPaperA();
testPaper.exam();
}
}
可以看待客户端代码也减轻了很多,这样逻辑清晰,利于维护,优势很明显,下面看下具体答题情况。
小龙女是杨过的什么亲戚?() A.小姨妈 B.大姨妈 C.姑妈 D.舅妈
答案:A
全真教的首任掌门是谁?A.周伯通 B.欧阳锋 C.王重阳 D.西门吹牛
答案:B
《天龙八部》中被封为南院大王的大侠是谁?A.段誉 B.乔峰 C.慕容复 D.段智兴
答案:D
3、模板方法模式的基本结构
AbstractClass是一个抽象类,其实就是一个抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体的实现,他给出了一些逻辑的骨架,而逻辑的组成在相应的抽象类中,推迟到了子类实现。代码如下
public abstract class AbstractClass {
//一些抽象行为,可以理解为重复不变的方法,提取到抽象类
public abstract void primitiveOperation1();
public abstract void primitiveOperation2();
//模板方法,给出了具体逻辑的骨架,而逻辑的组成是一些相应的抽象操作,他们都推迟到子类实现
public void templateMothed(){
primitiveOperation1();
primitiveOperation2();
}
}
ConcreteClass,实现父类所定义的一个或多个抽象方法。每一个AbstractClass都可以有一个或者多个ConcreteClass与之对应,而每一个ConcreteClass都可以给出这些抽象方法(也就是骨架的组成步骤)的不同实现,从而得到的实现都不同。
public class ConcreteClassA extends AbstractClass{
@Override
public void primitiveOperation1() {
System.out.println("子类A的操作1");
}
@Override
public void primitiveOperation2() {
System.out.println("子类A的操作2");
}
}
public class ConcreteClassB extends AbstractClass{
@Override
public void primitiveOperation1() {
System.out.println("子类B的操作1");
}
@Override
public void primitiveOperation2() {
System.out.println("子类B的操作2");
}
}
上面定义了两个具体的实现,更多的实现其实都是一致的,这里就不多多说了。下面看下客户端代码
public class Show {
public static void main(String[] args) {
AbstractClass c;
c = new ConcreteClassA();
c.templateMothed();
c = new ConcreteClassB();
c.templateMothed();
}
}
输入如下
子类A的操作1
子类A的操作2
子类B的操作1
子类B的操作2
4、UML图
三、总结
模板方法模式就是为了将重复不变的代码提取到一个抽象类中。当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# java
# 设计模式
# 模板方法模式
# Java设计模式之模板方法详解
# Java设计模式之模板方法模式详解
# 深入理解Java设计模式之模板方法模式
# Java设计模式模板方法模式(Template)用法解析
# 一文带你厉害Java设计模式中的模板方法
# 子类
# 类中
# 都是
# 杨过
# 客户端
# 段誉
# 是一个
# 王重阳
# 慕容复
# 全真教
# 大姨妈
# 出了
# 作答
# 多个
# 就不
# 很容易
# 搬到
# 抽象类
# 是个
# 也不
相关文章:
电脑免费海报制作网站推荐,招聘海报哪个网站多?
如何在香港免费服务器上快速搭建网站?
如何快速搭建二级域名独立网站?
高端企业智能建站程序:SEO优化与响应式模板定制开发
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
高性价比服务器租赁——企业级配置与24小时运维服务
婚礼视频制作网站,学习*后期制作的网站有哪些?
黑客如何利用漏洞与弱口令入侵网站服务器?
Swift中swift中的switch 语句
网站插件制作软件免费下载,网页视频怎么下到本地插件?
建站之星24小时客服电话如何获取?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
内网网站制作软件,内网的网站如何发布到外网?
如何通过主机屋免费建站教程十分钟搭建网站?
专业网站制作服务公司,有哪些网站可以免费发布招聘信息?
公司网站制作价格怎么算,公司办个官网需要多少钱?
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?
php json中文编码为null的解决办法
开心动漫网站制作软件下载,十分开心动画为何停播?
如何选择适配移动端的WAP自助建站平台?
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
如何获取上海专业网站定制建站电话?
建站之星代理如何获取技术支持?
名字制作网站免费,所有小说网站的名字?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
如何彻底卸载建站之星软件?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
Android自定义控件实现温度旋转按钮效果
如何选择高效稳定的ISP建站解决方案?
如何在Windows 2008云服务器安全搭建网站?
建站主机功能解析:服务器选择与快速搭建指南
太原网站制作公司有哪些,网约车营运证查询官网?
如何设置并定期更换建站之星安全管理员密码?
如何通过cPanel快速搭建网站?
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化
建站主机数据库如何配置才能提升网站性能?
html制作网站的步骤有哪些,iapp如何添加网页?
建站之星如何防范黑客攻击与数据泄露?
相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?
如何撰写建站申请书?关键要点有哪些?
建站VPS能否同时实现高效与安全翻墙?
宝塔面板如何快速创建新站点?
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
建站之星展会模版如何一键下载生成?
独立制作一个网站多少钱,建立网站需要花多少钱?
建站主机SSH密钥生成步骤及常见问题解答?
*请认真填写需求信息,我们会在24小时内与您取得联系。