模板方法模式

定义:定义了一个操作中的算法的骨架,并允许子类为一个或多个步骤提供实现。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

类型:行为型

适用场景:

  1. 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
  2. 各子类中公共的行为被提取出来并集中到一个公共父类中,从而避免代码重复。

优点:

  1. 模板方法模式通过把不变的行为搬移到超类,去除子类中重复的代码,提供了一个很好的代码复用平台
  2. 提高程序扩展性
  3. 符合开闭原则

缺点:

  1. 类数目增加
  2. 增加了系统实现的复杂度
  3. 继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍

Coding:

/**
 * AbstractClass : 抽象模板类
 */
public abstract class AbstractClass {
    /**
     * 声明一些抽象的行为,这些事变化的,交由子类去实现
     */
    public abstract void primitiveOperaton1();
    public abstract void primitiveOperaton2();

    /**
     * 模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,他们都被推迟到子类去实现
     */
    public void templateMethod(){
        primitiveOperaton1();
        primitiveOperaton2();
        System.out.println("......");
    }
}

/**
 * ConcreteClassA :具体实现类 A
 */
public class ConcreteClassA extends AbstractClass {
    @Override
    public void primitiveOperaton1() {
        System.out.println("ConcreteClassA's primitiveOperaton1");
    }

    @Override
    public void primitiveOperaton2() {
        System.out.println("ConcreteClassA's primitiveOperaton2");
    }
}

/**
 * ConcreteClassB : 具体实现类 B
 */
public class ConcreteClassB extends AbstractClass {
    @Override
    public void primitiveOperaton1() {
        System.out.println("ConcreteClassB's primitiveOperaton1");
    }

    @Override
    public void primitiveOperaton2() {
        System.out.println("ConcreteClassB's primitiveOperaton1");
    }
}

/**
 * Java Client
 */
public class Test {
    public static void main(String[] args) {
        AbstractClass abstractClass = new ConcreteClassA();
        abstractClass.templateMethod();
    }
}

模板方法模式_第1张图片

这里可以想下 Spring 对 JDBC 的一些支持,这里就使用了模板方法,还有 Hibernate 的 Template类 方法。我们自己使用 jdbc 连接数据库时,也会将一些重复的代码封装起来,这也是运用了模板方法的思想。

你可能感兴趣的:(模板方法模式)