今天介绍的是模板方法模式~

模板方法模式,由父类定制总体的框架,具体的细节由子类实现。

一般来说,模板方法中有3类方法:

  • 抽象方法,父类声明方法待子类具体实现。比如例子的validate、save、update方法。
  • 模板方法,编写总体的框架,调用其他方法实现业务,一般无须被子类重写。比如例子的saveOrUpdate方法。
  • 钩子方法,父类本身带有默认实现,子类可按照需要重写。比如例子的log4Operation方法。

父类:

import java.util.Map;

public abstract class AbstractBusinessService {

	/**
* 保存业务(模板方法)
* @param map 数据
* @return 操作记录数
*/
public final int saveOrUpdate(Map<String, Object> map) {
String result = this.validate(map);
if (result != null) {
throw new RuntimeException(result);
} int num;
if (map.get("id") == null) {
num = this.save(map);
} else {
num = this.update(map);
} this.log4Operation(map); return num;
} /**
* 校验(抽象方法)
*/
public abstract String validate(Map<String, Object> map); /**
* 更新(抽象方法)
*/
public abstract int update(Map<String, Object> map); /**
* 保存(抽象方法)
*/
public abstract int save(Map<String, Object> map); /**
* 写操作日志(钩子方法)
*/
public void log4Operation(Map<String, Object> map) {
System.out.println("write business.log : " + map);
} }

A子类:

import java.util.Map;

public class UserService extends AbstractBusinessService {

	@Override
public String validate(Map<String, Object> map) {
System.out.println("User validateion.");
return null;
} @Override
public int update(Map<String, Object> map) {
System.out.println("Update user.");
return 0;
} @Override
public int save(Map<String, Object> map) {
System.out.println("Insert user.");
return 0;
} }

B子类:

import java.util.Map;

public class RoleService extends AbstractBusinessService {

	@Override
public String validate(Map<String, Object> map) {
System.out.println("Role validateion.");
return null;
} @Override
public int update(Map<String, Object> map) {
System.out.println("Update role.");
return 0;
} @Override
public int save(Map<String, Object> map) {
System.out.println("Insert role.");
return 0;
} @Override
public void log4Operation(Map<String, Object> map) {
System.out.println("write t_business_log : " + map);
} }

调用入口:

import java.util.HashMap;
import java.util.Map; public class HowToUse { public static void main(String[] args) {
AbstractBusinessService userServcie = new UserService();
Map<String, Object> userMap = new HashMap<String, Object>();
userMap.put("id", 1);
userMap.put("name", "nick huang");
userServcie.saveOrUpdate(userMap); System.out.println(); AbstractBusinessService roleServcie = new RoleService();
Map<String, Object> roleMap = new HashMap<String, Object>();
roleMap.put("role", "admin");
roleServcie.saveOrUpdate(roleMap);
} }

日志:

User validateion.
Update user.
write business.log : {id=1, name=nick huang} Role validateion.
Insert role.
write t_business_log : {role=admin}

【Java】模板方法模式的更多相关文章

  1. JAVA模板方法模式

    模板方法模式的结构 模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术. 模板方法模式需要开发抽象类和具体子类的设计师之间的协作.一个设计师负责给出一个算法的轮廓和骨架,另 ...

  2. JAVA 设计模式 模板方法模式

    定义 模板方法模式 (Template Method) 定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成. 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模 ...

  3. java模式之-模板方法模式

    模板方法模式是java设计模式常见的模式之一. <JAVA与模式>中写道: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法 ...

  4. (转)《JAVA与模式》之模板方法模式

    该文章转自:http://www.cnblogs.com/java-my-life/archive/2012/05/14/2495235.html 在阎宏博士的<JAVA与模式>一书中开头 ...

  5. Java之模板方法模式(Template Method)

    Java之模板方法模式(Template Method) 1. 概念:定义一个算法的骨架,而将一些实现步骤延迟到子类中. 把不变的行为搬到超类,去除子类中重复的代码来体现他的优势. 2. UML图: ...

  6. Java中类的继承,属性和方法的四种修饰符的作用范围,final关键字,java的三大特点中的2个:封装和多态,以及多态的一个设计模式,模板方法模式(template method)

    (一)Java中的继承: 关于继承,在Java中类的继承只能是单继承,不像C+++那样灵活,可以多继承,多继承的后果就是各种关系乱套,就相当于一个孩子有2个母亲一样,社会关系的复杂,不利于程序后期的开 ...

  7. JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展

    JAVA之旅(七)--final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展 OK,我们继续学习JAVA,美滋滋的 一.final 我们来 ...

  8. 折腾Java设计模式之模板方法模式

    博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...

  9. Java EE设计模式(主要简单介绍工厂模式,适配器模式和模板方法模式)

    Java EE设计模式分为三种类型,共23种: 创建型模式:单例模式.抽象工厂模式.建造者模式.工厂模式.原型模式. 结构型模式:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式 ...

随机推荐

  1. 网络服务器之HTTPS服务

    import ssl, socket, time if __name__ == "__main__": context = ssl.SSLContext(ssl.PROTOCOL_ ...

  2. PMP--综合考试知识点,持续更新中。。。

    1]盈亏平衡点=固定成本/(销售价格-可变成本). 2]项目管理(Project Management): 就是把各种知识.技能.手段和技术应用于项目活动之中,以达到项目的要求. 3]有效的管理要求项 ...

  3. CLion 2016.2.2 注册激活码

    43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...

  4. nvm诡异的报错

    安装:curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash wget -qO- htt ...

  5. My Baits入门(一)mybaits环境搭建

    1)在工程下引入mybatis-3.4.1.jar包,再引入数据库(mysql,mssql..)包. 2)在src下新建一个配置文件conf.xml <?xml version="1. ...

  6. [Android Tips] 19. Android Studio Plugins

    Code Generation GsonFormat json 字符串生成实体类 https://github.com/zzz40500/GsonFormat Android Parcelable C ...

  7. gulp外挂 uglify 的使用

    1.js文件压缩 第一步:安装外挂 :  第二步:gulpfile.js 配置 : (首先看你的package.json 中有没有添加依赖,如果有 这一句,代表添加成功啦.) 输入以下代码 : var ...

  8. unity3D5旧动画系统注意事项

    最近在写人物控制时因为习惯用旧动画系统所以也没想那么多,就直接在新系统下按照老样子写了,突然发现animation.play不能用了,后来重新声明了变量: public Animation anim; ...

  9. Eclipse安装svn插件的几种方式

    Eclipse安装svn插件的几种方式 1.在线安装: (1).点击 Help --> Install New Software... (2).在弹出的窗口中点击add按钮,输入Name(任意) ...

  10. XiangBai——【AAAI2017】TextBoxes_A Fast Text Detector with a Single Deep Neural Network

    XiangBai--[AAAI2017]TextBoxes:A Fast Text Detector with a Single Deep Neural Network 目录 作者和相关链接 方法概括 ...