模板模式
介绍:是编程中经常用到的模式,它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现。这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤。
核心:处理步骤父类中定义好,具体实现延迟到子类中定义
角色:
1)抽象父类(AbstractClass):实现了模板方法,定义了算法的骨架。
2)具体类(ConcreteClass):实现抽象类中的抽象方法,即不同的对象的具体实现细节。
图示:
package com.offcn.designpattern.templateMethodpattern; public class TemplateMethodDemo { public static void main(String[] args) { TemplateMethod t = new DrawMoney(); t.process(); System.out.println("============================="); TemplateMethod t2 = new CunMoney(); t2.process(); } } abstract class TemplateMethod{ public void takeNumber(){ System.out.println("取票排队"); } public abstract void transact(); public void evaluate(){ System.out.println("反馈评分"); } public final void process(){ this.takeNumber(); this.transact(); this.evaluate(); } } class DrawMoney extends TemplateMethod{ @Override public void transact() { System.out.println("我要取款"); } } class CunMoney extends TemplateMethod{ @Override public void transact() { System.out.println("我要存钱"); } }
优点:
1)它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。
2)它在父类中提取了公共的部分代码,便于代码复用。
3)部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。
缺点:
1)对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。
2)父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。
使用场景:
1) 数据库访问的封装
2) Junit单元测试
3) Servlet中关于doGet/doPost方法调用
4) Hibernate中模板程序
5) Spring中JDBCTemplate,HibernateTemplate等。