设计模式——模版方法模式详解(论沉迷LOL对学生的危害)
0. 前言
写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦~此篇总结整理设计模式中的模版方法模式。
本文原创,转载请注明出处:设计模式——模版方法模式详解(论沉迷LOL对学生的危害)_SEU_Calvin的博客-CSDN博客
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 {@Overrideprotected void winNobel() {System.out.println("张三同学获得了诺贝尔奖");}@Overrideprotected void hook() {System.out.println("张三同学获得女朋友一个");}@Overrideprotected void university () {System.out.println("张三同学大学毕业啦,他成绩优异并考上了一所名牌大学的研究生");}@Overrideprotected void master() {System.out.println("张三同学硕士毕业啦,他成绩优异并找到了一份年薪30W的工作");}@Overrideprotected boolean knowCalculus () {return true;}
}
public class Lisi extends AbstractTemplate {@Overrideprotected void winNobel() {}@Overrideprotected void university () {System.out.println("李四同学大学毕业啦,他游戏打到了钻石分段并考上了一所普通大学的研究生");}@Overrideprotected void master() {System.out.println("李四同学硕士毕业啦,他游戏打到了王者分段并找到了一份年薪10W的工作");}@Overrideprotected 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)代码可读性下降,会让用户觉得难以理解。
至此关于模版方法模式的介绍到此结束。转载请注明出处:设计模式——模版方法模式详解(论沉迷LOL对学生的危害)_SEU_Calvin的博客-CSDN博客
希望每一个在校学生都不要沉迷LOL,好好学习并找到自己的女朋友~记得给我的文章点赞~
设计模式——模版方法模式详解(论沉迷LOL对学生的危害)相关推荐
- 设计模式之模板方法模式详解
设计模式之模板方法模式详解 概述 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的 ...
- 设计模式之门面模式详解
设计模式之门面模式详解 文章目录 设计模式之门面模式详解 一.什么是门面模式 二.门面模式的应用场景 三.门面模式的角色组成 四.门面模式通用写法 五.门面模式在业务中的应用 六.门面模式优缺点 一. ...
- 设计模式之桥接模式详解
设计模式之桥接模式详解 文章目录 设计模式之桥接模式详解 一.什么是桥接模式 二.桥接模式的应用场景 三.桥接模式的角色组成 四.桥接模式通用写法示例 五.桥接模式优缺点 一.什么是桥接模式 桥接模式 ...
- 设计模式之策略模式详解
设计模式之策略模式详解 概述 先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车.可以坐汽车.可以坐火车.可以坐飞机. 作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有 ...
- 设计模式 模版方法模式 展现程序员的一天
继续设计模式~ 模版方法模式 老套路,先看下定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤. 简单看下定义,模版方法定义了一个算 ...
- 设计模式之工厂模式详解(附应用举例实现)
文章目录 1 工厂模式介绍 2 工厂模式详解 2.1 简单工厂模式 2.1.1 简单工厂模式结构 2.1.2 简单工厂模式实现 2.1.3 简单工厂模式应用举例 2.2 工厂方法模式 2.2.1 工厂 ...
- 设计模式之桥接模式详解(附应用举例实现)
文章目录 1 桥接模式介绍 2 桥接模式详解 2.1 桥接模式结构 2.2 桥接模式实现 2.3 桥接模式应用实例 1 桥接模式介绍 毛笔和蜡笔是两种很常见的文具,它们都归属于画笔.假设我们需要大.中 ...
- 设计模式之原型模式详解(附应用举例实现)
文章目录 1 原型模式介绍 2 原型模式详解 2.1 原型模式结构 2.2 深克隆与浅克隆 2.2.1 浅克隆 2.2.2 深克隆 2.3 原型模式实现 2.3.1 通用实现方法 2.3.2 Java ...
- 设计模式之命令模式详解(附应用举例实现)
文章目录 1 命令模式介绍 2 命令模式详解 2.1 命令模式结构 2.2 命令模式实现 2.3 命令模式应用举例 3 实现命令队列 1 命令模式介绍 在现实生活中人们通过使用开关来控制一些电器的打开 ...
最新文章
- python的setup.py文件及其常用命令
- java并发编程之美-阅读记录10
- Windows Phone 7 MVVM模式数据绑定和传递参数
- 开发函数计算的正确姿势——tensorflow serving
- java单引号转义_Java基础入门——Java语言基础(上)
- c语言单链表功能,[数据结构]单链表(C语言)的各种功能
- java线程池示例_Java线程连接示例
- SSM面试题及相关答案
- python 热度图_python可视化(七)绘制詹姆斯、杜兰特、伦纳德生涯数据热度图...
- 电源保护——TVS管
- python 穷举密码
- 天线越大越好吗_路由器的天线是不是越多越好?告知你真实答案,很多人都买错了...
- python栈是什么意思_Python实现的栈(Stack)
- 【转】固态硬盘恢复之30分钟大法操作技巧
- 我们是如何走到今天的?
- 浅析搭建高速公路视频监控平台的建设方案及必要性
- 【单片机毕业设计】【mcuclub-jj-051】基于单片机的书桌的设计
- ERP源码 制造业通用ERP源码 生产ERP源码
- 电信物联卡用户看过来:关于电信物联卡销户的八大问题汇总
- GET和POST请求的区别
热门文章
- 在 Linux 或者 Windows 服务器上安装部署 MATLAB
- 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java智慧民政服务平台xl2r9
- 计算机平面设计专业素描教案,透视在中职计算机平面设计专业素描教学中的运用策略...
- 关于adrduino HX711库的解析
- 如何理解FFT中时间窗与RBW的关系
- 如何使用条件格式在 Excel 中隔行加底纹
- 瞎说八道之更换手机的成本
- 超全!Linux 误删文件恢复命令及方法
- 二分入门——poj 2456 aggressive cows
- Intellij IDEA 简介