模板方法模式
1、描述
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使子类可以不改变一个算的结构即可重定义该算法的某些特定步骤。
2、使用场景
算法的操作过程是固定的,但是其中的某个操作是可以不同实现的。这种情况下,将可以有不同实现的操作抽象出来即可。比如我们进行数据库操作的时候,都是先打开数据库,然后进行CRUD操作,最后是关闭数据库。这个就是一个典型的使用情景。所以数据库操作的设计者将数据库的打开和关闭操作实现,将CRUD操作抽象,用户进行操作的时候,只要去实现CRUD方法即可。
3、模式中的角色
抽象模板:抽象模板是一个抽象类。抽象模板定义了若干个方法以表示一个算法的各个步骤,这些方法中有抽象方法,也有非抽象方法,其中的抽象方法称作原语操作(Primitive Operation)。重要的一点是,抽象模板中还定义了一个称作模板方法的方法,该方法不仅包含有抽象模板中表示算法步骤的方法调用,而且也可以包含有定义在抽象模板中的其他对象的方法调用,即模板方法定义了算法的骨架。
具体模板:具体模板是抽象模板的子类,实现抽象模板中的原语操作。
4、UML图
5、代码实现
AbstractTemplateDB
package org.sunday.pattern.template; /** * * @author sunday * 2013-12-12 * 邮箱:zhengchao1937@163.com * QQ:804935743 */ public abstract class AbstractTemplateDB { private void openDB() { System.out.println("1,DB open------"); } public abstract void crudDB(); private void closeDB() { System.out.println("2,DB close--------"); } public void doDB() { openDB(); crudDB(); closeDB(); } }
ConcreteTemplateDB
package org.sunday.pattern.template; /** * * @author sunday * 2013-12-12 * 邮箱:zhengchao1937@163.com * QQ:804935743 */ public class ConcreteTemplateDB extends AbstractTemplateDB { @Override public void crudDB() { System.out.println("3,DB crud operate ------------"); } }
Test
package org.sunday.main; /** * * @author sunday * 2013-12-12 * 邮箱:zhengchao1937@163.com * QQ:804935743 */ import org.sunday.pattern.template.ConcreteTemplateDB; public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub new ConcreteTemplateDB().doDB(); } }
运行之后打印信息:
代码:http://download.csdn.net/detail/ff20081528/6703981