行为型:Template(模板模式)

  作为一个曾经爱好写文章,但是不太懂得写文章的人,我必须承认,开头是个比较难的起步。

  模板模式常规定义:模板模式定义了一个算法步骤,把实现延迟到子类。

  事实上模板模式跟策略模式会有些相像,然而策略模式是对算法的封装,而模板模式是定义好了算法的执行流程,将子流程抽象化。而之前接触过的工厂模式正是模板模式的一种特殊实现。

  最开始接触java的时候每个人都会从JDBC写起,如果把设置配置参数到获取数据库连接,取得数据等等的过程不断重复地编写,确实是一个让人无法忍受的事情。我们可以通过一段代码来体验一下:

     // 这是JDBC版本
Class.forName("com.mysql.jdbc.Driver");
String DB_URL = "jdbc:mysql://localhost:3306/shop";
String USER = "root";
String PASS = "";
Connection connection = DriverManager.getConnection(DB_URL, USER, PASS);
Statement statement = connection.createStatement();
statement.executeUpdate("");
statement.close();
connection.close(); // 这是Spring JDBC模板的版本
jdbcTemplate.update("");
jdbcTemplate.execute("");

从上面可以很明显的看出,如果是原生JDBC的话,我们将需要从注册驱动-配置参数-创建连接-执行脚本-关闭连接,几乎都是千篇一律的代码。而模板代码我们只需要调用统一的方法,其前后将会帮我们处理开启和关闭的动作。至于内部的细节,我也并不是很清楚。后面还是以一个比较简单的例子来说明。

 

package top.gabin.design.template;

/**
* 家政人员
* @author linjiabin on 16/5/9
*/
public abstract class HouseWorker {
// 家政服务
protected final void housekeeping() {
cleanRoom();
cooking();
if (needFeedDog()) {
feedDog();
}
}
// 清理房间
public abstract void cleanRoom();
// 煮饭
public abstract void cooking();
// 喂狗
public abstract void feedDog();
// hook,钩子
public boolean needFeedDog() {
return true;
}
}
package top.gabin.design.template;

/**
* 钟点工
* @author linjiabin on 16/5/9
*/
public class HourlyHouseWorker extends HouseWorker {
private Integer salary;
public void cleanRoom() {
System.out.println("我只能打扫半小时");
} public void cooking() {
System.out.println("一个小时内必须把饭菜做好");
} @Override
public boolean needFeedDog() {
// 钱给的够多的话,我愿意帮您喂狗
return salary > 1000;
} public void feedDog() {
System.out.println("虽然我不愿意喂狗,但是如果多给钱的话,我也是可以的.");
}
}

hook,钩子。通常在父类是一个默认的空实现,需要的话,子类将去实现它,或者也可以跟上面一样,只是一个返回true的方法。表示这件事并非所有的子类都必须去做。

再次重新表述一次,家政人员需要做的事情几乎都是一样的,而我们将会对家政人员有等级的划分。不同等级的可以达到的效果不一样,但是我们又不希望家政人员额外地做别的事,因为这将是他们(家政)自己的外快(家政公司将无法收取额外服务的抽成)

模板模式(Template)的更多相关文章

  1. 《JAVA设计模式》之模板模式(Template)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...

  2. 学习笔记——模板模式Template

    模板模式,主要是利用多态来实现具体算法和父类逻辑的松耦合.父类中TemplateMethod内部定义了相应的算法操作顺序,子类负责实现相应的具体实现. 举例: 项目中曾遇到过一个需求,叫做高级价格体系 ...

  3. 设计模式之模板模式 template

    设计模式 模板模式如果有一个流程如下step1();step2();step3();step4();step5();其中step3() step5()是需要用户自己编写使用其他步骤是固定的那么可以写成 ...

  4. php模板模式(template design)

    没有写停止条件,所以会一直运行哟. <?php /* The template design pattern defines the program skeleton of an algorit ...

  5. 【编程思想】【设计模式】【行为模式Behavioral】模板模式Template

    Python转载版 https://github.com/faif/python-patterns/blob/master/behavioral/template.py #!/usr/bin/env ...

  6. 设计模式之GOF23模板模式

    模板模式template method 场景:具有具体流程,但具体某一步的业务不同 到银行办理业务:排队取号,办理业务,给员工打分 请客吃饭:等待,点单,吃饭,结账 模板方法模式介绍:模板方法是编程常 ...

  7. 13.java设计模式之模板模式

    基本需求: 制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎 通过添加不同的配料,可以制作出不同口味的豆浆 选材.浸泡和放到豆浆机打碎这几个步骤对于制作每种口味 ...

  8. 设计模式(十四)——模板模式(SpringIOC源码分析)

    1 豆浆制作问题 编写制作豆浆的程序,说明如下: 1) 制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎 2) 通过添加不同的配料,可以制作出不同口味的豆浆 3 ...

  9. Java设计模式之模板模式(Template )

    前言: 最近学习了Glide开源图片缓存框架,在学习到通过使用ModelLoader自定义数据源的时候,Glide巧妙的使用了Java的模板模式来对外暴露处理不同的Url数据源,今天来学习总结一下模板 ...

随机推荐

  1. 使用C#版本GDAL读取复数图像

    GDAL的C#版本虽然在很多算法接口没有导出,但是在读写数据中的接口基本上都是完全导出了.使用ReadRaster和WriteRaster方法来进行读写,同时对这两个方法进行了重载,对于常用的数据类型 ...

  2. day03

    1.set集合--无序的,不重复的序列,类似dict,但是只有key,没有value 创建一个集合: s1 = {11,22,33} s2 = set((22,33,44))必须传入一个可迭代对象(t ...

  3. 《python基础教程》笔记之 抽象

    创建函数 记录函数,在函数的开头写下字符串,它就会作为函数的一部分进行存储,这称为文档字符串,如 def square(x): 'Caculates the square of the number ...

  4. 视图必须派生自 WebViewPage 或 WebViewPage错误解决方法

    1,在每个视图上面添加 @inherits System.Web.Mvc.WebViewPage 2,将views中的web.config COPY到新的视图模版文件夹下,就可以了

  5. 第几天 AC 杭电

    第几天? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  6. Xcode-Xcode 7.3 解决不能自动联想问题-备

    一.问题: 升级Xcode 7.3 之后发现导入头文件之后,没法自动联想. 二. 解决办法: 打开Xcode --> Target --> BuildSettings --> App ...

  7. chrome 打不开网页

    右键单击Chrome在桌面的快捷方式,在在但中选择“属性”,在对话框的“目标”项目中追加:-no-sandbox     大家比较熟悉的解决方法有配置 Hosts 文件和使用FQ软件两种,配置 Hos ...

  8. expect: spawn id exp4 not open

    spawn rsync -avH --delete /home/dwetl/bin dwetl@10.128.8.151:/home/dwetl/bin sending incremental fil ...

  9. js跨越小结

    javascript跨域有几种情况: 1.基于同一父域的子域之间,如:a.c.com和b.c.com 2.基于不同的父域之间,如:www.a.com和www.b.com 3.端口的不同,如:www.a ...

  10. ActionResult 的返回类型

    大多数操作方法会返回从 ActionResult 中派生的类的实例. ActionResult 类是所有操作结果的基础. 不过,也存在不同的操作结果类型,具体取决于操作方法执行的任务. 例如,最常见的 ...