设计模式4之模板方法模式
背景
在开发中,你一定遇到过这样的情况:你知道一个方法的关键步骤和执行顺序,但是里面有具体的步骤,并不清楚。你会怎么做?
例如,如果你早上起床去公司,我们会分解步骤:
起床、洗漱、吃早餐、乘车去公司
我们已经确定了这一步,但细节可能因人而异。比如小明早餐吃的面包,小张吃的面条。小梅坐地铁,小花做公交车。
再举个例子方法,我们在写简历的时候通常会使用简历模板。不同的人写不同的内容,模板是一样的。
模板方法模式定义如下:
“在一个操作中定义一个算法的骨架,同时将算法的一些步骤推迟到子类中方法,这样子类就可以在不改变算法结构的情况下重新定义算法的一些具体步骤。它是一个类的行为模式。 "
这个定义一头雾水,我们直接用代码演示一下吧。
在编写代码之前,我们需要了解实现模板方法模式的几个要素:
那么什么是模板方法呢?模板方法定义了算法的骨架,并包含了算法的执行顺序。
基本方法是算法中需要实现或重写的一个步骤。用于扩展。结构如下:
模板方法的代码实现
首先创建一个抽象类:
public abstract class AbstractClass {
//模板方法
public void templateMethod() {
specificMethod();
abstractMethod1();
abstractMethod2();
}
//具体方法
public void specificMethod() {
System.out.println("抽象类中的具体方法被调用...");
}
public abstract void abstractMethod1(); //抽象方法1
public abstract void abstractMethod2(); //抽象方法2
}
复制
这定义了模板方法、具体方法和抽象方法。模板方法包括具体方法和抽象方法。
具体子类:
public class ConcreteClass extends AbstractClass {
@Override
public void abstractMethod1() {
System.out.println("抽象方法1的实现被调用...");
}
@Override
public void abstractMethod2() {
System.out.println("抽象方法2的实现被调用...");
}
}
复制
这个子类继承了抽象类并实现了抽象方法。
测试代码如下:
public class TemplateMethodPattern {
@Test
public void test() {
AbstractClass tm = new ConcreteClass();
tm.templateMethod();
}
}
复制
我们调用模板方法,得到如下信息:
抽象类中的具体方法被调用...
抽象方法1的实现被调用...
抽象方法2的实现被调用...
复制
关于模板方法模式的思考
从上面的代码中,我们发现模板方法()的整体步骤是固定的,而具体方法和抽象方法的内容发生了变化。我们可以通过继承来修改抽象方法和具体方法的内容。
当多个子类有共同的行为时,可以将它们提取并集中到一个共同的父类中,避免代码重复。首先,识别现有代码中的差异并将它们分离到新的操作中。最后,用调用这些新操作的模板方法替换不同的代码。
我认为模板方法有几个好处:
所以在设计的时候,对于重要复杂的算法,可以把核心算法设计成模板方法,周边的细节由各个子类实现
tags:
算法