今天下午主要研究了设计模式中的Template Method(模版方法设计模式)。

在Spring中,对各种O/RM进行了封装,比如对Hibernate有HibernateTemplate封装;对JDBC有jdbcTemplate封装。这些封装均实践了Template Method设计模式。

拿HibernateTemplate来说,Spring通过该类对Hibernate的事务管理进行了封装。

/* 本帖准备模拟HibernateTemplate的实现,该类是Spring对Hibernate操作事务的封装,采用了Template Method设计模式*/
/* 当很多方法的执行体有大量重复代码时(比如对事务的处理), 可以考虑将不动的部分抽取出来而不同的部分做成接口的形式,共同形成一个方法 */
/* 通过实现接口的形式,将不同的业务逻辑加到方法中 */

直接上代码:

1. 接口:

public interface MyHibernateCallBack {
public void doInHibernate(Session session);
}

2. MyHibernateTemplate

public class MyHibernateTemplate {

    @Autowired
private SessionFactory sessionFactory; /* 模拟HibernateTemplate的实现,该类是Spring对Hibernate操作事务的封装,采用了Template Method设计模式*/
/* 当很多方法的执行体有大量重复代码时(比如对事务的处理), 可以考虑将不动的部分抽取出来而不同的部分做成接口的形式,共同形成一个方法 */
/* 通过实现接口的形式,将不同的业务逻辑加到方法中 */ /* 共同代码体 */
private void executeWithSession(MyHibernateCallBack callback){
Session session = null;
try {
session = sessionFactory.openSession();
session.beginTransaction(); /* 不同之处,则根据上下文抽取出接口 */
callback.doInHibernate(session); session.getTransaction().commit();
} catch (RuntimeException e){
e.printStackTrace();
if (session != null){
session.getTransaction().rollback();
}
} finally {
if (session != null){
session.close();
}
}
} public void save(final User user) {
/* 通过内部类实现接口 */
MyHibernateCallBack callBack = new MyHibernateCallBack() {
@Override
public void doInHibernate(Session session) {
session.save(user);
}
};
executeWithSession(callBack);
}
}

3. 调用:

public class UserDAOImpl implements UserDAO {
@Resource
private MyHibernateTemplate myHibernateTemplate; @Override
public void save(User user) {
myHibernateTemplate.save(user); //一句搞定!
}
}

说实在的,重要的是思想!

设计模式 - Template Method的更多相关文章

  1. 设计模式 Template Method模式 显示程序猿的一天

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/26276093 不断设计模式~ Template Method模式 老套路,看高清 ...

  2. C++设计模式:Template Method

    我使用过一个简单的后台服务框架.这个框架上手很容易,我只需要继承一个基类,同时实现,或重写(override)基类声明的几个接口(这些接口声明为虚函数,或者纯虚函数),然后调用基类定义好的run()函 ...

  3. 设计模式Template Method模式(Template Method)摘录

    23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例.怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还 ...

  4. 设计模式-模板方法设计模式--Template Method design pattern

    /** * Abstract implementation of the {@link org.springframework.context.ApplicationContext} * interf ...

  5. Android 设计模式Template Method模式

    自定义模板方法模式:定义的算法的骨架中的方法,虽然某些步骤推迟到子类中,下模板方法允许子类不能改变在的情况下,该算法的结构.算法重新定义某些步骤. 设计原则:不要给我们打电话.我会打电话给你.(像猎头 ...

  6. 设计模式-Template Method Pattern

    将generic部份放在abstract base class中的实现的方法中,而将和具体context相关的部份作为abstract base class的虚方法,由derivatives去实现. ...

  7. Caffe源码理解3:Layer基类与template method设计模式

    目录 写在前面 template method设计模式 Layer 基类 Layer成员变量 构造与析构 SetUp成员函数 前向传播与反向传播 其他成员函数 参考 博客:blog.shinelee. ...

  8. 设计模式(九): 从醋溜土豆丝和清炒苦瓜中来学习"模板方法模式"(Template Method Pattern)

    今天是五.四青年节,祝大家节日快乐.看着今天这标题就有食欲,夏天到了,醋溜土豆丝和清炒苦瓜适合夏天吃,好吃不上火.这两道菜大部分人都应该吃过,特别是醋溜土豆丝,作为“鲁菜”的代表作之一更是为大众所熟知 ...

  9. C#设计模式系列:模板方法模式(Template Method)

    你去银行取款的时候,银行会给你一张取款单,这张取款单就是一个模板,它把公共的内容提取到模板中,只留下部分让用户来填写.在软件系统中,将多个类的共有内容提取到一个模板中的思想便是模板方法模式的思想. 模 ...

随机推荐

  1. 关于MongoDb Replica Set的故障转移集群——实战篇

    如果你还不了解Replica Set的相关理论,请猛戳传送门阅读笔者的上一篇博文. 因为Replica Set已经属于MongoDb的进阶应用,下文中关于MongoDb的基础知识笔者就不再赘述了,请参 ...

  2. BT9034: 仅 IE 和 Opera 支持 HTMLFrameElement 和 HTMLIFrameElement 的 document 属性

    标准参考 根据 DOM-2 中的描述,HTMLFrameElement 和 HTMLIFrameElement 都没有 'document' 属性. 关于 HTMLFrameElement 对象的详细 ...

  3. 主键、外键、超键、候选键的区别【Written By KillerLegend】

    先说一下属性的定义: 表的每一行对应一个元组,表的每一列对应一个域.由于域可以相同,为了加以区分,必须对每列起一个唯一的名字,称为属性(Attribute). 再来看看几个键的定义: 超键:在关系模式 ...

  4. 自定义DatePicker,年月日,不显示其中某几项

    经过源码研究:该结构主要包含三个NumberPicker: private final NumberPicker mDayPicker; private final NumberPicker mMon ...

  5. Oracle 分区表的统计信息实例

    ORACLE的统计信息在执行SQL的过程中扮演着非常重要的作用,而且ORACLE在表的各个层次都会有不同的统计信息,通过这些统计信息来描述表的,列的各种各样的统计信息.下面通过一个复合分区表来说明一些 ...

  6. ok6410串口裸机总结

    1.串口角色:(1)数据传输通道(2)控制台 2.通讯参数(1)波特率:衡量传输速率的快慢,每秒钟传输数据的位数(bit)(2)数据位:有效数据(3)起始位:线路空闲的时候是高电平,当检测到低电平认为 ...

  7. Jquery制作可以绑定的表格

    //总页数 当前页 可见页 参数 翻页执行后处理的函数 function PageTable(totalPages, currentPage, tableobj, url, where, column ...

  8. python学习第二天第一部分

    备注:写程序不能写重复性的代码 学习内容:数据类型.for循环.while循环.字符编码.文件处理 一.for循环 1.简单的for循环 for i in range(10): # 此处意思为:循环r ...

  9. 如何检测某IP端口是否打开

    1.如果你直接到控制面板的管理工具里的服务项里去找telnet的话,那是徒劳无功 的,因为默认根本就没有这一服务.当然,你可以通过如下方式搞定.“控制面 板” 一〉“程序” 一〉“打开或关闭windo ...

  10. Karaf 基于 osgi

    Karaf是Apache旗下的一个开源项目.Karaf同时也是一个基于OSGi的运行环境,Karaf提供了一个轻量级的OSGi容器,可以用于部署各种组件,应用程序.Karaf提供了很多特性用于帮助开发 ...