Java模式之模板方法模式
当我们遇到的业务逻辑具有大致相同的方式的时候,我们也许就该将这个业务逻辑抽象出来,采用模板方法,来进行封装我们的代码,提高代码的重用性,以及可维护性。下面是我的一个复习用的案例:
第一步:我们需要一个抽象出来的父类,其要实现的就是我们这个业务逻辑的大致的雏形,需要注意的是里面有一个”钩子“方法,用于定制子类的特有的活动方式:
package Template;
/**
* 抽象基类,为其所有的子类提供以一个算法框架
*
* @author Tiger
*
*/
public abstract class AbstractSubClass {
/*
* 模板方法,封装了所有子类索要共同进行遵循的算法框架
*/
public final void prepareTemplateMethod() {// final修饰,避免子类对其重写
// 步骤1
Step1();
// 步骤2
Step2();
// 步骤3
Step3();
if(isCustom()){//钩子概念,当为真的时候就会调用步骤四方法
// 步骤4
Step4();
}
}
/**
* 包访问权限,只有在同一个包内的类才能够被访问
* @return
*/
protected boolean isCustom() {
// TODO Auto-generated method stub
return false;
}
// 由于接下来的子类中对该方法的操作不一样,所以声明为抽象的方法,以便于“多态”的实现
protected abstract void Step4();
/**
* 基本方法,步骤3
*/
private void Step3() {
System.out.println("步骤3");
}
// 由于接下来的子类中对该方法的操作不一样,所以声明为抽象的方法,以便于“多态”的实现
protected abstract void Step2();
/**
* 基本方法,步骤一
*/
private void Step1() {
System.out.println("步骤一");
}
}
然后我们可以创建第一个子类:
package Template;
/**
* 这是第一个抽象类的子类,里面有只适合这一个类的方法的实现
* @author Administrator
*
*/
public class SubClassOne extends AbstractSubClass {
@Override
protected void Step4() {
// TODO Auto-generated method stub
System.out.println("第一个子类的专属的步骤4");
}
@Override
protected void Step2() {
// TODO Auto-generated method stub
System.out.println("第一个子类的专属的步骤2");
}
@Override
protected boolean isCustom() {
// TODO Auto-generated method stub
return true;//此处是在子类中,"钩住"了父类的方法,实现了自定义的方式
}
}
然后是第二个子类,其实和第一个类大致相同,仅仅是某些方法内的逻辑代码不一致而已。
package Template;
/**
* 这是第一个抽象类的子类,里面有只适合这一个类的方法的实现
* @author Administrator
*
*/
public class SubClassTwo extends AbstractSubClass {
@Override
protected void Step4() {
// TODO Auto-generated method stub
System.out.println("第二个子类的专属的步骤4");
}
@Override
protected void Step2() {
// TODO Auto-generated method stub
System.out.println("第二个子类的专属的步骤2");
}
@Override
protected boolean isCustom() {
// TODO Auto-generated method stub
return false;//此处是在子类中,"钩住"了父类的方法,实现了自定义的方式
}
}
好了,接下来就是测试要用的类了:
package Template;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("第一个子类开始了");
AbstractSubClass sub1=new SubClassOne();//其实这就是多态的实现
sub1.prepareTemplateMethod();
System.out.println("第一个子类的实现过程结束了");
System.out.println("-------------------------------------");
System.out.println("第二个子类开始了");
AbstractSubClass sub2=new SubClassTwo();//同样的,其实这就是多态的实现
sub2.prepareTemplateMethod();
System.out.println("第二个子类的实现过程结束了");
System.out.println("-------------------------------------");
}
}
下面就是我们的程序的运行结果:
第一个子类开始了
步骤一
第一个子类的专属的步骤2
步骤3
第一个子类的专属的步骤4
第一个子类的实现过程结束了
-------------------------------------
第二个子类开始了
步骤一
第二个子类的专属的步骤2
步骤3
第二个子类的实现过程结束了
-------------------------------------
我们可以看出,使用了钩子方法的类就会调用相关的方法,结果我们就得到了不一样的运行结果。其实这就是多态的另一种展现形式。
总结:模板方法优点很多,但是也由于是继承的关系,所以会导致子类继承的时候有些问题。大致的实现步骤是,先抽象出来一个大致实现了所有方法的父类,然后对相关的方法进行抽象处理,让子类对其进行逻辑代码的实现,这样大大的增加了程序的灵活性。然而最经典上的事我们的钩子方法,其使得用户可以自定义的真正实现,使得我们的代码更加精致。
好了,java模式中的模板模式,大致就是这样了。
Java模式之模板方法模式的更多相关文章
- 折腾Java设计模式之模板方法模式
博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...
- Java设计模式之模板方法模式(Template)
前言: 我们在开发中有很多固定的流程,这些流程有很多步凑是固定的,比如JDBC中获取连接,关闭连接这些流程是固定不变的,变动的只有设置参数,解析结果集这些是根据不同的实体对象“来做调整”,针对这种拥有 ...
- Android设计模式之命令模式、策略模式、模板方法模式
命令模式是其它很多行为型模式的基础模式.策略模式是命令模式的一个特例,而策略模式又和模板方法模式都是算法替换的实现,只不过替换的方式不同.下面来谈谈这三个模式. 命令模式 将一个请求封装为一个对象,从 ...
- 简介Python设计模式中的代理模式与模板方法模式编程
简介Python设计模式中的代理模式与模板方法模式编程 这篇文章主要介绍了Python设计模式中的代理模式与模板方法模式编程,文中举了两个简单的代码片段来说明,需要的朋友可以参考下 代理模式 Prox ...
- java模式之-模板方法模式
模板方法模式是java设计模式常见的模式之一. <JAVA与模式>中写道: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法 ...
- Java进阶篇设计模式之十一 ---- 策略模式和模板方法模式
前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...
- Java设计模式之十一 ---- 策略模式和模板方法模式
前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...
- Java抽象类应用—模板方法模式
模板方法模式(Templete method) 定义一个操作中的算法的骨架,而将一些可变部分的实现延迟到子类中,模板方法模式使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定的步骤. 例: ...
- Java设计模式应用——模板方法模式
所谓模板方法模式,就是在一组方法结构一致,只有部分逻辑不一样时,使用抽象类制作一个逻辑模板,具体是实现类仅仅实现特殊逻辑就行了.类似科举制度八股文,文章结构相同,仅仅具体语句有差异,我们只需要按照八股 ...
- Java设计模式之模板方法模式(Template Method)
一.含义 定义一个算法中的操作框架,而将一些步骤延迟到子类中.使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤,不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现. 二 ...
随机推荐
- 彻底理解Oracle中的集合操作与复合查询
--Oracle中的复合查询 复合查询:包含集合运算(操作)的查询 常见的集合操作有: union: 两个查询的并集(无重复行.按第一个查询的第一列升序排序) union all:两个查询的并集(有重 ...
- python脚本文件传参并通过token登录后爬取数据实例
from bs4 import BeautifulSoup import requests import sys class Zabbix(object): def __init__(self, he ...
- PHP 5 Directory 函数
PHP Directory 简介 Directory 函数允许您获得关于目录及其内容的信息. 安装 PHP Directory 函数是 PHP 核心的组成部分.无需安装即可使用这些函数. PHP 5 ...
- PHP 5 Date/Time 函数
PHP Date/Time 简介 Date/Time 函数允许您从 PHP 脚本运行的服务器上获取日期和时间.您可以使用 Date/Time 函数通过不同的方式来格式化日期和时间. 注释:这些函数依赖 ...
- python OptParse模块的用法详解
OptParse模块的简单介绍 Python 有两个内建的模块用于处理命令行参数: 一个是 getopt只能简单处理 命令行参数: 另一个是 optparse,它功能强大,而且易于使用,可以方便地生成 ...
- Cassandra Secondary Index 介绍
摘要 本文主要介绍cassandra中的索引,物化视图,有些知识点需要对cassandra有基本的认识才能理解.比如数据在cassandra节点中如何分布.如果有不明白的地方可以看本专栏之前文章.或者 ...
- 有无序的实数列V[N],要求求里面大小相邻的实数的差的最大值,关键是要求线性空间和线性时间。
int findMaxDifBt2Nums(int* arr, int len) { int maxItem = arr[0], minItem = arr[0]; for (int i = 1; i ...
- activiti 配置节点 连线信息获取
1.1.1. 前言 当使用eclipse插件进行流程设计的时候,部署流程之后,我们如何获取我们定义的所有的节点.连线.关口等配置信息呢?有的人看到这个需求,不免窃喜,这不很简单嘛,重新打来bmpn中定 ...
- Android Multimedia框架总结(十四)Camera框架初识及自定义相机案例
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52738492 前言:国庆节告一段 ...
- EJB_开发消息驱动bean
开发消息驱动bean Java消息服务(Java MessageService) Java 消息服务(Java Message Service,简称 JMS)是用于访问企业消息系统的开发商中立的API ...