Template Method
模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。
模式中的角色
抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。
代码
抽象类
public abstract class AbstractPerson{
//抽象类定义整个流程骨架
public void prepareGotoSchool(){
dressUp();
eatBreakfast();
takeThings();
}
//以下是不同子类根据自身特性完成的具体步骤
protected abstract void dressUp();
protected abstract void eatBreakfast();
protected abstract void takeThings();
}
具体类
public class Student extends AbstractPerson{
@Override
protected void dressUp() {
System.out.println(“穿校服");
}
@Override
protected void eatBreakfast() {
System.out.println(“吃妈妈做好的早饭");
}
@Override
protected void takeThings() {
System.out.println(“背书包,带上家庭作业和红领巾");
}
输出
public class Client {
public static void main(String[] args) {
Student student = new Student()
student.prepareGotoSchool();
}
}
优点
模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。
子类实现算法的某些细节,有助于算法的扩展。
通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。
缺点
每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。
代码
package exception.eee;
public abstract class Temp {
public abstract void code();
public final void getTime(){
long statc = System.currentTimeMillis();//取当前的时间
code();//执行这个方法
long end = System.currentTimeMillis();//结束的时间
System.out.println(end-statc);
}
}
class Test5 extends Temp{
@Override
public void code() {
int k = 0;
for (int i = 0; i < 900000; i++) {
k+=i;
}
System.out.println(k);
}
}
class Ab{
public static void main(String[] args) {
Test5 test5 = new Test5();
test5.getTime();
}
}