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

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

一般来说,模板方法中有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. Qt容器类——1. QList类、QLinkedList类和QVector类

    在开发一个较高性能需求的应用程序时,程序员会比较关注这些容器类的运行效率,表2.1列出了QList.QLinkedList和QVector容器的时间复杂度比较. 1.QList类 QList<T ...

  2. HP ALM 使用经验

    使用HP ALM(Application Lifecycle Management)软件有一个多月的时间了,我是从安装,部署,建项,配置,使用,再到问题收集,这个过程过来的.发现ALM是一个功能确实强 ...

  3. 通过批处理来运行python程序

    >准备 >>在所用的python源程序最前面指定该源程序要用那种可执行程序去运行它 >>例如: #!/bin/sh shell脚本 #!/usr/bin/perl per ...

  4. Jmeter 简单用法

    学习jmeter的部分用法,整理笔记: 老规矩上图: 一.录制脚本:Badboy或HTTP代理服务器: Badboy第三方软件,录制脚本后,可以直接导出为jmeter格式:再通过加载实现脚本: HTT ...

  5. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版新增查询引擎管理

    欲了解V3.0版本的相关内容可查看下面的链接地址. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版本发布 RDIFramework.NET — 基于.NET的快速信 ...

  6. Leetcode: Valid Word Abbreviation

    Given a non-empty string s and an abbreviation abbr, return whether the string matches with the give ...

  7. linux-------------linux的scp

    scp是有Security的文件copy,基于ssh登录. 命令基本格式: scp [OPTIONS] file_source file_target OPTIONS: -v 和大多数 linux 命 ...

  8. ANE 从入门到精通 --- 一键打包ANE

    每次都要执行好几步才能编译出ANE很是麻烦,使用如下脚本 一键完成复杂的流程 REM 好压HaoZipC文件所在的位置,7Zip,WinRAR等均可 Set Zip=D:\"Program ...

  9. IOS在线安装App

    在越狱设备上可以安装,如果设备不越狱也想安装,就要企业发布权限了,可惜我没有,所以不能测试了! 1.创建ipa及plist文件: XCode菜单栏->Product->Archive-&g ...

  10. Java里能用session吗?

    1.Session是服务器端存储的,Js里不能使用. 2.一般Session的实现需要依赖客户端的Cookie来储存一个SessionId,客户端每次请求服务器都会带上这个Cookie,这样服务器端就 ...