设计模式之旅16--模板方法模式

2018-07-27  本文已影响46人  小楠总

1. 定义

模板方法模式:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

模板方法模式

2. 使用场景

3. 实现

抽象模板:

/**
 * 抽象模板
 */
public abstract class AbstractClass {

    /**
     * 基本方法:基本方法也叫做基本操作,是由子类实现的方法,并且在模板方法被调用。
     */
    protected abstract void method1();

    protected abstract void method2();

    /**
     * 钩子函数:子类可以通过钩子函数(Hook Method)约束父类的行为。
     *
     * @return
     */
    protected abstract boolean hookMethod();

    /**
     * 模板方法:可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑。
     * 为了防止恶意的操作,一般模板方法都加上final关键字,不允许被覆写。
     */
    public final void templateMethod() {
        method1();
        if (hookMethod()) {
            method2();
        }
    }
}

具体模板:

/**
 * 具体模板:实现父类所定义的一个或多个抽象方法,也就是父类定义的基本方法在子类中得以实现。
 */
public class ConcreteClass1 extends AbstractClass {
    @Override
    protected void method1() {
        System.out.println("ConcreteClass1 : method1");
    }

    @Override
    protected void method2() {
        System.out.println("ConcreteClass1 : method2");
    }

    @Override
    protected boolean hookMethod() {
        return true;
    }
}

public class ConcreteClass2 extends AbstractClass {
    @Override
    protected void method1() {
        System.out.println("ConcreteClass2 : method1");
    }

    @Override
    protected void method2() {
        System.out.println("ConcreteClass2 : method2");
    }

    @Override
    protected boolean hookMethod() {
        return false;
    }
}

场景类:

public class Client {

    public static void main(String[] args) {
        AbstractClass c1 = new ConcreteClass1();
        AbstractClass c2 = new ConcreteClass2();

        c1.templateMethod();
        c2.templateMethod();
    }

}

运行结果(注意钩子函数对父类行为的约束):

ConcreteClass1 : method1
ConcreteClass1 : method2
ConcreteClass2 : method1

4. 优点

5. 缺点

上一篇下一篇

猜你喜欢

热点阅读