模板方法的定义:
“Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
它是一种行为型模式。
”
这写的是啥?不急,我们先来假设一个场景,通过代码来看这说的是啥。
假设:
动物Animal
这个抽象类,有新陈代谢metabolism
这个方法,这个方法经过eat()、drink()和sleep()三个动作后执行完成。
小马Pony
、小牛Calf
继承Animal
。
该假设场景的类图:
/**
* 模板方法设计模式
* 范式重写的方法,系统帮我们自动调用的
* 都可以称之为模板方法
*/
public class Main {
public static void main(String[] args) {
Animal pony = new Pony();
pony.metabolism();
}
}
abstract class Animal {
/**
* 新陈代谢
* 假设都需要经过吃、喝、睡
*/
public void metabolism() {
eat();
drink();
sleep();
}
abstract void eat();
abstract void drink();
abstract void sleep();
}
class Pony extends Animal {
@Override
void eat() {
System.out.println("Pony eating");
}
@Override
void drink() {
System.out.println("Pony drinking");
}
@Override
void sleep() {
System.out.println("Pony sleeping");
}
}
如果再来一个小牛Calf
,它也是小动物,自然也可以继承自Animal
,如果main方法里调用小牛的新陈代谢方法呢?直接调用就完了,不需要逐一调用eat、drink和sleep了(自动在metabolism方法里调用)。
class Calf extends Animal {
@Override
void eat() {
System.out.println("Calf eating");
}
@Override
void drink() {
System.out.println("Calf drinking");
}
@Override
void sleep() {
System.out.println("Calf sleeping");
}
}
调用:
public static void main(String[] args) {
Animal pony = new Pony();
pony.metabolism();
System.out.println("------------------------");
Animal calf = new Calf();
calf.metabolism();
}
运行结果:
Pony eating
Pony drinking
Pony sleeping
------------------------
Calf eating
Calf drinking
Calf sleeping
Process finished with exit code 0
OK,程序写完了,而且我用到了模板方法设计模式!
现在回过头来看一下,模板方法的定义:
“定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
”
小动物类Animal
的新陈代谢方法metabolism
就相当于一个算法骨架,我们的子类并没有改变算法(没有重写),只是对算法内部调用的方法继承下来,每个子类对这些特定步骤有自己的实现而已。
客户端调用的时候只需要调用骨架即可,具体的内部方法(eat、drink、sleep),系统会帮我们自动调用。
这种模式就是模板方法设计模式。
是的,我们一直在用它!
这个时候,我们应该已经很熟悉模板方法了,类图很简单:
通过上面的例子,我们可以看到,这种模式的优点:
当然我们也能看到,对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。
“看完点赞,养成习惯。举手之劳,赞有余香。
”