设计模式-模板模式
时间:2022-07-25
本文章向大家介绍设计模式-模板模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
背景
当房子建好后,相同的房间规格,但是可以根据不同的需求进行不同的装修,有把天花板刷黄,有些刷绿,有些乱刷...这个很类似于设计模式中的模板模式,根据相同的模板生成出来后内部装修可以自定义。
模板模式是什么?
模板模式(Template Pattern),定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这种模式属于行为模式。
角色:
抽象的模板(Abstract Template):主要用于定义骨架和方法操作,提供给具体模板继承的一个顶级模板。
具体模板(Concrete Template):具体实现抽象模板的一些方法及实现自己的逻辑和步骤。
模板模式可以干嘛?
模板模式解决的一个问题就是相同的东西,将其抽象出公共的父类,供子类继承并且实现,这个也很好的体现了java的继承特性,并且通过继续后子类可以根据自己的需求进行内部逻辑的实现。
优点:
代码复用率高:通过继承父类,子类可以实现自己的算法而不会影响到整体结构;
缺点:
每个实现都会增加一个子类,会导致系统庞大;
个人理解:
就是类似于盖好房子,相同的房间大小,可以根据不同的风格来做装修,有些装修欧式,有些装修简约。
模板模式类图
源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
实现代码
/**
* @ClassName Houser (模板)
* @Author csh
* @Description
* @Date 2020/6/21
**/
public abstract class Houser {
abstract void initialize();
abstract void wall();
abstract void floor();
//模板
public final void decor(){
//初始化房子
initialize();
//刷墙
wall();
//贴地板
floor();
}
}
/**
* @ClassName EuropeanStyle
* @Author csh
* @Description 实现(Concrete Template)
* @Date 2020/6/21
**/
public class EuropeanStyle extends Houser {
@Override
void initialize() {
System.out.println("准备欧式风格材料完毕!");
}
@Override
void wall() {
System.out.println("大理石墙面!");
}
@Override
void floor() {
System.out.println("大理石地板!");
}
}
/**
* @ClassName Sinicism
* @Author csh
* @Description 实现(Concrete Template)
* @Date 2020/6/21
**/
public class Sinicism extends Houser {
@Override
void initialize() {
System.out.println("中国风格基础材料准备完毕!");
}
@Override
void wall() {
System.out.println("皇宫墙");
}
@Override
void floor() {
System.out.println("木板房子");
}
}
/**
* @ClassName Client
* @Author csh
* @Description 模板模式,通过抽象父类子类进行继承然后进行实现。
* @Date 2020/6/21
**/
public class Client {
public static void main(String[] args) {
Houser chineseStyle = new Sinicism();
chineseStyle.decor();
EuropeanStyle europeanStyle = new EuropeanStyle();
europeanStyle.decor();
}
}
结果
中国风格基础材料准备完毕!
皇宫墙
木板房子
准备欧式风格材料完毕!
大理石墙面!
大理石地板!
源码下载:https://gitee.com/hong99/design-model/issues/I1IMES
最后
模板模式非常简单,并且经常大家都在用,只是不知道而且,像各位老兄看过spring或者其他开源框架用的地方随处都是,主要的思想就是java的继承的实现,通过一个抽象的模板子类来继承并且实现里面的具体算法,通过父类定好的方法,通过子类实现,通过父类定好的方法执行。
常用框架用到:
HttpServlet继承GenericServlet
- LinkedIn 即时通信系统的优化
- javascript console输出图片?
- 快速搭建Storm集群环境
- OpenCV中BLOB特征提取与几何形状分类
- OpenCV实现照片自动红眼去除
- OpenCV3.1.0级联分类器训练与使用
- 图像处理之理解Homography matrix(单应性矩阵)
- OpenCV中图像直方图与应用
- OpenCV中图像修复技术介绍与演示
- 44个Java代码性能优化总结
- LDA(Linear Discriminant Analysis)算法介绍
- Express.js 4,Node.js,MongoDB REST API 简易教程
- 基于梯度下降算法求解线性回归
- 彩色图像高斯反向投影
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 详解Android 语音播报实现方案(无SDK)
- Android实现中轴旋转特效 Android制作别样的图片浏览器
- Android使用DrawerLayout实现双向侧滑菜单
- Android实现3D推拉门式滑动菜单源码解析
- Android编程处理窗口控件大小,形状,像素等UI元素工具类
- Android开发实现的Log统一管理类
- Android中可以作为Log开关的一些操作及安全性详解
- 实例详解Android Webview拦截ajax请求
- Android给布局、控件加阴影效果的示例代码
- XListView实现下拉刷新和上拉加载原理解析
- Android实现QQ侧滑(删除、置顶等)功能
- Android通过XListView实现上拉加载下拉刷新功能
- Android自定义View实现圆形切图效果
- Android仿iOS侧滑退出当前界面功能
- android仿支付宝密码输入框效果