The only thing in the world that doesn`t change is change itself.
为了维护代码方便,在编写代码时,尽量保持代码不重复。
为了实现这一要求,可以使用模板方法模式。
定义:
定义一个操作中的算法的骨架,而将步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。
也就是说模板方法定义了一系列算法步骤,子类可以去实现/覆盖其中某些步骤,但不能改变这些步骤的执行顺序。
其中一个便于理解的就是继承。在父类中定义一个模板方法,该方法中包含父类其他一些方法(可能是抽象方法,相当于算法步骤),这些方法的执行顺序在此模板方法中给定了,我们可以定义子类去实现/覆盖这些方法(算法步骤),但无法改变这些方法的执行顺序。
public class AClass { // 一些抽象行为,放到子类去实现 public abstract void PrimitiveOperation1(); public abstract void PrimitiveOperation2(); /** <summary> * 模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,它们推迟到子类去实现。 **/ </summary> public void TemplateMethod() { PrimitiveOperation1(); PrimitiveOperation2(); System.out.println("Done the method."); } }
模板方法模式应用很广,但是过分模板方法模式会引起子类泛滥。可以结合使用回调(Callback)解决这种问题。
我们以jdbc中的查询为参考。
业务需求:
1、获取connection
2、获取statement
3、获取resultset
4、遍历resultset并封装成集合
5、依次关闭connection,statement,resultset,而且还要考虑各种异常
由于各种查询很多,需要创建许多子类处理结果集,这就会造成子类泛滥。
这里定义了一个ResultSetHandler接口,用于处理结果。在调用此方法时可以使用匿名内部类传入ResultSetHandler的实现类。
这就可以很好的避免了子类泛滥。