0. 前言

写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦~此篇总结整理设计模式中的模版方法模式。

本文原创,转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52817173

 

1.  模版方法模式介绍

模版方法模式定义:

定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。

模版方法模式的使用场景:

(1)多个子类含有公共的行为时。

(2)面对重要复杂的算法,可以把核心算法设计为模版方法,周边相关细节功能则由各个子类实现。

(3)需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。

模版方法模式角色介绍:

(1)Abstract Template类,抽象模版角色,定义一套算法框架。

(2)Concrete Template类:抽象模版实现类,实现父类所定义的一个或多个抽象方法。

2.  实例介绍

在本例中,我们使用一个常见的场景,我们每个人都上了很多年学,中学大学硕士,有的人天生就是个天才,中学毕业就会微积分,因此得了诺贝尔数学奖;也有的人在大学里学了很多东西,过得很充实很满意,也有的人在大学里一直沉迷LOL毕业后耽误了自己的前途。这个场景就可以用模版方法模式来设计。


2.1  AbstractTemplate抽象模版类

public abstract class AbstractTemplate{
//Final表示算法框架不能被覆写
public final void education(){
//中学
middleSchool();
//如果这孩子小学毕业就会微积分
if(knowCalculus ()) {
winNobel ();;
}
//钩子方法
hook();
//大学
university();
//硕士
master();
} //空实现方法
protected void hook(){}
protected void middleSchool(){
System.out.println("义务教育到此结束");
}
protected abstract void winNobel();
protected abstract void university ();
protected abstract void master ();
protected boolean knowCalculus(){
return true;
}
}

需要注意的是这个抽象类包含了三种类型的方法,分别是抽象方法、具体方法和钩子方法。

抽象方法是交由子类去实现,本例中代表每个人不同的大学生活。

具体方法则在父类实现了子类公共的方法实现,在上面的例子就是每个人都会经过义务教育的中学阶段。

钩子方法则分为两类,第一类是空实现的hook()方法,子类可以视情况来决定是否要覆盖它,在本例中代表有没有找到女朋友=。=;第二类是knowCalculus()方法,这类钩子方法的返回类型通常是布尔类型的,在本例中代表有没有获得诺贝尔奖的资质,一般用于对某个条件进行判断,如果条件满足则执行某一步骤,否则不执行。

2.2     ConcreteTemplate抽象模版实现类

这里模拟了张三和李四为我们的具体实现类。张三天赋异禀,初中毕业就获得了诺贝尔奖,并在大学里学习刻苦,期间还交到了一个漂亮女朋友,毕业后找到了一份理想的工作。李四既没有张三的天赋,也没有在大学里认真学习,反而沉迷于网络游戏,最终只找到了一份不太理想的工作,当然,他肯定也是单身。

public class ZhangSan extends AbstractTemplate {
@Override
protected void winNobel() {
System.out.println("张三同学获得了诺贝尔奖");
} @Override
protected void hook() {
System.out.println("张三同学获得女朋友一个");
} @Override
protected void university () {
System.out.println("张三同学大学毕业啦,他成绩优异并考上了一所名牌大学的研究生");
} @Override
protected void master() {
System.out.println("张三同学硕士毕业啦,他成绩优异并找到了一份年薪30W的工作");
} @Override
protected boolean knowCalculus () {
return true;
}
}
public class Lisi extends AbstractTemplate {
@Override
protected void winNobel() {} @Override
protected void university () {
System.out.println("李四同学大学毕业啦,他游戏打到了钻石分段并考上了一所普通大学的研究生");
} @Override
protected void master() {
System.out.println("李四同学硕士毕业啦,他游戏打到了王者分段并找到了一份年薪10W的工作");
} @Override
protected boolean knowCalculus () {
return false;
}
}

2.3  使用时

public class Client{
public static void main(String[] args) {
ZhangSan zhang = new ZhangSan();
zhang.education();
Lisi li = new Lisi();
li.education();
}
}

3.   运行结果

3.  模版方法模式的优缺点

模版方法模式的优点:

(1)模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。

(2)子类实现算法的某些细节,有助于算法的扩展。

模版方法模式的缺点:

(1)每个不同的实现都需要定义一个子类,这会导致类的个数的增加。

(2)代码可读性下降,会让用户觉得难以理解。

至此关于模版方法模式的介绍到此结束。转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52817173

希望每一个在校学生都不要沉迷LOL,好好学习并找到自己的女朋友~记得给我的文章点赞~

设计模式——模版方法模式详解(论沉迷LOL对学生的危害)的更多相关文章

  1. [Head First设计模式]云南米线馆中的设计模式——模版方法模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  2. Python设计模式——模版方法模式

    1.模版方法模式 做题的列子: 需求:有两个学生,要回答问题,写出自己的答案 #encoding=utf-8 __author__ = 'kevinlu1010@qq.com' class Stude ...

  3. Java设计模式の模版方法模式

    概述 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的 ...

  4. 24种设计模式--模版方法模式【Template Method Pattern】

    周三,9:00,我刚刚坐到位置,打开电脑准备开始干活.“小三,小三,叫一下其它同事,到会议室,开会”老大跑过来吼,带着淫笑.还不等大家坐稳,老大就开讲了,“告诉大家一个好消息,昨天终于把牛叉模型公司的 ...

  5. 设计模式之迭代器模式详解(foreach的精髓)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 各位好,很久没以LZ的身份和 ...

  6. 设计模式之 外观模式详解(Service第三者插足,让action与dao分手)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 各位好,LZ今天给各位分享一 ...

  7. JAVA 设计模式之 工厂模式详解

    一.简单工厂模式 简单工厂模式(Simple Factory Pattern)是指由一个工厂对象决定创建出哪一种产品类 的实例.属于创建型模式,但它不属于 GOF,23 种设计模式 (参考资料: ht ...

  8. 设计模式之 原型模式详解(clone方法源码的简单剖析)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 原型模式算是JAVA中最简单 ...

  9. Java设计模式之状态模式详解

    (本文由言念小文原创,转载请注明出处) 在实际工作中经常遇到某个对象,处于不同的状态有不同行为逻辑.且状态之间可以相互迁移的业务场景,特别是在开发通信协议栈类软件中尤为多见.<设计模式之禅> ...

随机推荐

  1. March 10 2017 Week 10 Friday

    If you love life, life will love you back. 爱生活,生活也会爱你. Love life, and it will love you back. All thi ...

  2. SQA和测试

    一.SQA计划 (1)软件工程:设计出云医院页面和其功能. (2)质量保证:进行需求分析,使用户确信产品或服务能满足规定的质量要求. (3)质量控制:采取不断的调试完善代码和程序确保产品质量. (4) ...

  3. SAP订单编排和流程增强概述

    SAP产品里的订单处理,无论是On-Premises解决方案还是云产品,我认为归根到底可以概括成四个字:订单编排,包含两个层次的内容: 1. 单个订单通过业务流程或者工作流驱动的状态迁移: 2. 多种 ...

  4. Linux下apt-get的软件一般安装路径

    apt-get安装目录和安装路径:apt-get 下载后,软件所在路径是:/var/cache/apt/archivesubuntu 默认的PATH为PATH=/home/brightman/bin: ...

  5. ZJOI2019Day1镇海中学游记(3.24~3.27)

    前言 第一次正式参加省选!不管怎么说,虽然明知自己很弱,但还是要尽力去尝试吧! 最好能进前\(100\),不然就没法去\(Day2\)了. \(Mar\ 24th\):出发 今天,我们正式从二中向宁波 ...

  6. 贪心算法,今年暑假不AC

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2037 活动安排问题,可用贪心. 1.把活动按结束时间递增排序. 2.直观上,选择相对活动为未安排活动留 ...

  7. http://codeforces.com/gym/100623/attachments E题

    http://codeforces.com/gym/100623/attachments E题第一个优化它虽然是镜像对称,但它毕竟是一一对称的,所以可以匹配串和模式串都从头到尾颠倒一下第二个优化,与次 ...

  8. hyper-net、ion、skip connection、fpn

    resnet的skip connection用的也是eltwise相加 fpn的浅层和高层融合用的eltwise相加 hyper-net和ion都是使用的concat的方式 hyper-net网络结构 ...

  9. Docker官方文档翻译1

    转载请标明出处: https://blog.csdn.net/forezp/article/details/80098675 本文出自方志朋的博客 本系列教程翻译于docker文档,文档地址:http ...

  10. MySQL数据库操作基础

    .MySQL 是什么? )软件(Software):工具(解决问题) )数据库管理系统(DBMS) )关系型(Relation)数据库管理系统(RDBMS):类似Oracle 扩展:db-engine ...