模板模式
1. 介绍
模板模式(Template Pattern)
是一种行为型模式。定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定的步骤。
简单理解:完成一件事情需要固定的几个步骤,但每一个步骤根据对象的不同会有不同的细节;就可以在父类中定义一个完成该事情的总方法(模板),按照完成事情的步骤去调用其每个步骤的实现方法,每个步骤的实现方法,由子类去完成。
优点
- 将每个步骤的具体实现延迟到子类中。父类只是定义了一个骨架,具体的实现是靠的子类,但子类不会更改父类的这种骨架。
- 代码复用。将骨架抽取到父类中,具体的细节则靠子类实现。
缺点
- 会增加类的数量。
注意
策略和模板的区别:
策略在于结果一致,路径不同;而模板是在于,步骤一致,结果不一致。
2. 例子
将所有的家务活都分为三步,将这三个步骤执行的顺序在 HouseWork 这个抽象类中定义好。有洗衣服、扫地这两个具体的家务活,它们都继承了 HouseWork 这个父类,对其中的每一个步骤进行实现。
类图:
HouseWork类
是一个抽象类,所有家务活都需要继承这个抽象类。
package templatePattern;
/**
* 做家务活,定义了模板,细节由子类去实现
*
* @author jxd
* @since 2021-06-16
*/
public abstract class HouseWork {
/**
* 做家务的模板
*/
final public void work() {
first();
second();
last();
}
public abstract void first();
public abstract void second();
public abstract void last();
}
SweepFloor类
扫地,继承了HouseWork这个抽象类,将其中的细节实现。
package templatePattern;
/**
* 扫地
* @author jxd
* @since 2021-06-16
*/
public class SweepFloor extends HouseWork {
@Override
public void first() {
System.out.println("找到扫把");
}
@Override
public void second() {
System.out.println("扫地");
}
@Override
public void last() {
System.out.println("将扫把放回原处");
}
}
SweepClothes类
洗衣服,继承了HouseWork这个父类,实现了其中的细节。
package templatePattern;
/**
* 洗衣服
* @author jxd
* @since 2021-06-16
*/
public class SweepClothes extends HouseWork {
@Override
public void first() {
System.out.println("将脏衣服找到");
}
@Override
public void second() {
System.out.println("将脏衣服倒入洗衣机中,加入洗衣粉,启动洗衣机");
}
@Override
public void last() {
System.out.println("将洗好的衣服取出,拿到阳台去晒");
}
}
测试类:
package templatePattern;
import org.junit.Test;
/**
* 模板方法的测试类
*
* @author jxd
* @since 2021-06-16
*/
public class TestJ {
@Test
public void test1() {
HouseWork sweepFloor = new SweepFloor();
sweepFloor.work();
HouseWork sweepClothes = new SweepClothes();
sweepClothes.work();
}
}
运行结果:
找到扫把
扫地
将扫把放回原处
将脏衣服找到
将脏衣服倒入洗衣机中,加入洗衣粉,启动洗衣机
将洗好的衣服取出,拿到阳台去晒
3. 总结
使用一个父类将完成一件事情的步骤的骨架定义好,至于其中的每一个步骤的具体实现过程则就由子类实现。