模版方法模式/Template Method

来源:互联网 发布:c语言基础知识视频教程 编辑:程序博客网 时间:2024/04/29 07:13

模版方法模式/TemplateMethod

意图/适用场景:

模版方法模式其实是一种应用很广泛的模式,特别是在使用抽象类的时候。

模版方法模式中必然有一个核心的抽象类,不能是接口。声明一些抽象方法,这些方法由子类来做各不相同的实现;也可以是一些非抽象的方法,这些方法只是做为默认的实现,子类应该覆盖它们。

此外,还要定义一个或多少具体的方法,它们实现一些逻辑,调用前面提到的抽象或非抽象方法。这种方法就本模式中最重要的部分,这样的方法一般规定了调用其它抽象方法的逻辑,所以它是一个模版,这个方法就称为模版方法。

模版方法一般不被子类覆盖,否则就失去了“模版”的作用。

UML:

模版方法模式/Template <wbr>Method

参与者:

  1. 抽象模版(Abstract Template):
    • 定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作。
    • 定义并实现一个模版方法,这是一个具体的方法,给出了一个逻辑骨架,以固定的顺序和条件来调用其它的抽象方法。它定义了调用逻辑,是一个模版。
  2. 具体模版(Concrete Template):
    • 以自己的方式实现父类所定义的抽象方法。

要点:

模版方法模式中的方法:

  1. 模版方法:
    • 一个模版方法是定义在抽象类中的,把基本操作方法组合在一起形成一个总算法或一个总行为的方法。这个方法在抽象类中定义,并由子类不加修改地完全继承。
  2. 基本方法:

主要由子类来实现或重写,体现继承关系的方法称为基本方法。基本方法又可以分为三种:

  • 抽象方法:必须由子类来实现的方法。
  • 具体方法:具体方法仍然由抽象类实现,而子类并不实现或重写。有些具体方法可以起来工厂方法的作用。
  • 钩子方法:钩子方法也由抽象类来实现,但这只是作为一种默认的实现,一般是空的。子类应该重新实现,如果没有的话,只是说明不需要。

示例代码:

[java]
// Source code from file:  AbstractTemplate.java

package designPatterns.TemplateMethod;

public abstract class AbstractTemplate {
// abstract method
protected abstract void abstractMethod();

// hook method, provide default implementation
protected void hookMethod() {
System.out.println("AbstractTemplate.hookMethod()");
}

// template method
public void templateMethod() {
abstractMethod();
hookMethod();
}
}

// Source code from file:  ConcreteClassA.java

package designPatterns.TemplateMethod;

public class ConcreteClassA extends AbstractTemplate {

protected void abstractMethod() {
System.out.println("ConcreteClassA.abstractMethod()");
}

protected void hookMethod() {
System.out.println("ConcreteClassA.hookMethod()");
}

}

// Source code from file:  ConcreteClassB.java

package designPatterns.TemplateMethod;

public class ConcreteClassB extends AbstractTemplate {

protected void abstractMethod() {
System.out.println("ConcreteClassB.abstractMethod()");
}

}

// Source code from file:  User.java

package designPatterns.TemplateMethod;

public class User {
public static void main(String[] args) {
AbstractTemplate a = new ConcreteClassA();
AbstractTemplate b = new ConcreteClassB();
a.templateMethod();
b.templateMethod();
}
}
[/java]
原创粉丝点击