今天下午主要研究了设计模式中的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. ThinkPHP之中的验证码的小示例

    ThinkPHP之中已经封装好了验证码的调用,但是关于手册,缺失了HTML之中以及.实际操作之中的点击ajax就会刷新验证码ajax代码:现在分享一下:看客老爷们注意啦! 放大招啦!!!三分归元气-- ...

  2. php实现显示网站运行时间-秒转换年月日时分秒

    <?php // 设置时区 date_default_timezone_set('Asia/Shanghai'); /** * 秒转时间,格式 年 月 日 时 分 秒 * * @author w ...

  3. devexpress 数据导入(gridcontrol 导出 csv)

    // 1.gridcontrol 导出 csv: DataTable dtbNew = new DataTable(); dtbNew.Columns.Add().GetType()); dtbNew ...

  4. 比较C++中的4种类型转换方式

    C++的四种cast操作符的区别并非我的原创-------------------------------------------from:http://blog.csdn.net/hrbeuwhw/ ...

  5. [Prism框架实用分享]如何在主程序中合理的弹出子窗体

    大家好 说起子窗体,大家都会想到ChildWindow,多熟悉的一个控件.不错,Sliverlight中已经提供了子窗体的具体实现,而在WPF中却没有这么好的事情(有的第三方控件商已经提供此控件).最 ...

  6. SQLite判断某表是否存在

    SQLite判断表是否存在:其实很简单,只要查看sqlite_master表中是否存在这条数据就可以知道了.SELECT count(*) FROM sqlite_master WHERE type= ...

  7. 九度oj 1541 二叉树

    原题链接:http://ac.jobdu.com/problem.php?pid=1541 简答题如下: #include<algorithm> #include<iostream& ...

  8. [iOS]MVVM-框架介绍

       我于 2011 年在 500px 找到自己的第一份 iOS 开发工作.虽然我已经在大学里做了好几年 iOS 外包开发,但这才是我的一个真正的 iOS 开发工作.我被作为唯一的 iOS 开发者被招 ...

  9. mysql取整,小数点处理函数floor(), round()

    mysql数值处理函数floor与round    在mysql中,当处理数值时,会用到数值处理函数,如有一个float型数值2.13,你想只要整数2,那就需要下面的函数floor与round.   ...

  10. MongoDB学习笔记-游标

    理解MongoDB的游标有两种维度:客户端和服务器端.下面将从这两方面来说明. 客户端 find方法返回值是一个游标.可以通过游标来对最终结果进行控制.比如限制结果数量,略过某一部分,根据任意键按任意 ...