Java描述设计模式(19):模板方法模式
本文源码:GitHub·点这里 || GitEE·点这里
一、生活场景
通常一款互联网应用的开发流程如下:业务需求,规划产品,程序开发,测试交付。现在基于模板方法模式进行该过程描述。
public class C01_InScene {
public static void main(String[] args) {
DevelopApp developApp = new DevelopApp() ;
developApp.templateMethod() ;
}
}
/**
* 软件开发抽象类
*/
abstract class SoftDevelop {
public void templateMethod(){
//调用基本方法
doBiz ();
doProduct();
doDevelop();
doTest();
}
public abstract void doBiz () ;
public abstract void doProduct () ;
public abstract void doDevelop () ;
public abstract void doTest () ;
}
/**
* APP开发具体类
*/
class DevelopApp extends SoftDevelop {
@Override
public void doBiz() {
System.out.println("整理App业务");
}
@Override
public void doProduct() {
System.out.println("输出App产品");
}
@Override
public void doDevelop() {
System.out.println("进行App开发");
}
@Override
public void doTest() {
System.out.println("进行App测试");
}
}
二、模板方法模式
1、基础概念
模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以用不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。简单说,模板方法模式定义流程中的核心的框架,而将实际的业务操作延迟到子类中,使得子类可以不改变流程的结构,但可以重定义业务程序。
2、模式图解
3、核心角色
- 抽象模板角色
类中实现了模板方法(template),定义流程结构,具体业务需求子类需要去实现。
- 具体模板角色
实现父类所定义的一个或多个抽象方法,是整个流程的组成方法。抽象模板角色都可以有任意多个具体模板角色与之对应,具体模板角色都可以给出这些抽象方法的不同实现。
4、源码实现
/**
* 抽象模板角色
*/
abstract class AbstractTemplate {
/**
* 模板方法
*/
public void templateMethod(){
//调用基本方法
abstractMethod();
hookMethod();
concreteMethod();
}
/**
* 相关基本方法
*/
protected abstract void abstractMethod();
protected void hookMethod(){}
private final void concreteMethod(){}
}
/**
* 具体模板角色
*/
class ConcreteTemplate extends AbstractTemplate{
/**
* 基本方法的实现
*/
@Override
public void abstractMethod() {
}
/**
* 重写父类的方法
*/
@Override
public void hookMethod(){
}
}
5、不同方法描述
- 模板方法
定义在抽象类中的,把基本操作方法组合在一起形成一个总流程的方法,可以有任意多个模板方法。
- 基本方法
- 抽象方法:抽象方法由抽象类声明,由具体子类实现。
- 具体方法:具体方法由抽象类声明并实现,而子类并不实现。
- 钩子方法:钩子方法由抽象类声明并实现,而子类可以加以扩展。
三、JavaEE应用
HttpServlet担任抽象模板角色,模板方法:由service()方法担任。基本方法:由doPost()、doGet()等方法担任。service()方法流程,省略了部分判断逻辑。该方法调用七个do方法中的一个或几个,完成对客户端请求的响应。这些do方法需要由HttpServlet的具体子类提供,在JavaEE中使用时,通常会自己实现相关方法。在API的封装是典型的模板方法模式。
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
if (method.equals("GET")) {
this.doGet(req, resp);
} else if (method.equals("HEAD")) {
this.doHead(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
} else if (method.equals("PUT")) {
this.doPut(req, resp);
} else if (method.equals("DELETE")) {
this.doDelete(req, resp);
} else if (method.equals("OPTIONS")) {
this.doOptions(req, resp);
} else if (method.equals("TRACE")) {
this.doTrace(req, resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[]{method};
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(501, errMsg);
}
}
四、源代码地址
GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
WebRTC:一个视频聊天的简单例子
相关API简介 在前面的章节中,已经对WebRTC相关的重要知识点进行了介绍,包括涉及的网络协议、会话描述协议、如何进行网络穿透等,剩下的就是WebRTC的API了。 WebRTC通信相关的API非常多,主要完成了如下功能: 信令交换 通信候选地址交换 音视频采集 音视频发送、接收 相关API太多,为避免篇幅过长,文中部分采用了伪代码进行讲解。详细代码参考文章末尾,也可以在笔者的Github上找到,有问题欢迎留言交流。 信令交换 信令交换是WebRTC通信中的关键环节,交换的信息包括编解码器、网络协议、候选地址等。对于如何进行信令交换,WebRTC并没有明确说明,而是交给应用自己来决定,比如可以采用WebSocket。 发送方伪代码如下: const pc = new RTCPeerConnection(iceConfig); const offer = await pc.createOffer(); await pc.setLocalDescription(offer); sendToPeerViaSignalingServer(SIGNALING_OFFER, offer); //...
-
下一篇
8种经常被忽视的SQL错误用法,你有没有踩过坑?
1、LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般 DBA 想到的办法是在 type, name, create_time 字段上加组合索引。这样条件排序都能有效的利用到索引,性能迅速提升。 SELECT * FROM operation WHERE type = 'SQLStats' AND name = 'SlowLog' ORDER BY create_time LIMIT 1000, 10; 好吧,可能90%以上的 DBA 解决该问题就到此为止。但当 LIMIT 子句变成 “LIMIT 1000000,10” 时,程序员仍然会抱怨:我只取10条记录为什么还是慢?要知道数据库也并不知道第1000000条记录从什么地方开始,即使有索引也需要从头计算一次。出现这种性能问题,多数情形下是程序员偷懒了。在前端数据浏览翻页,或者大数据分批导出等场景下,是可以将上一页的最大值当成参数作为查询条件的。SQL 重新设计如下: SELECT * FROM operation WHERE type = 'SQLStats' AND name...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker容器配置,解决镜像无法拉取问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- 2048小游戏-低调大师作品
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- MySQL数据库在高并发下的优化方案
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题