一、引
我们在日常的代码设计中,会遇到许多固定的逻辑操作,那么这个时候如果不进行一定的设计,就会出现冗余的逻辑重复,导致代码维护性不高,所以一般遇到这种情况,我们应该设法将这些固定的操作与可变的操作进行分离,每次修改只要变动可变操作即可。这就是这次要讲的模板方法模式。
二、问题
既然是模板方法,那我们引出的问题也是模板,如何设计一个问卷的情景操作。
三、理解
我们先来分析一下问题,问卷情景中,我们可以分析出必须有一个问卷和一些填写问卷的人,其中,问卷只有一个,填写问卷的人却很多,而且每个人都有自己的答案。那么我们可以将这个问题浓缩成,在问卷中天答案,即问卷类+答案类。分析到这,我们其实已经可以看出,问卷就是模板方法模式中的模板类,我们只要设计出一个问卷类和一个答案类,每次将一个答案类传给问卷类,就意味着一个人填写了问卷,这样方便简洁。在模板方法设计模式中,我们利用上面填问卷的这种思想,设计出父类,将所有重复的代码提升到父类中,而不是让每个子类都去重复,当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别细节步骤在更详细的层次上的实现可能不同,我们通常考虑用模板方法模式实现。模板方法的结构图如下:
模板方法模式的专业表达是,定义一个操作中的算法骨架,而将一些步骤延迟到子类中,模板方法模式可以是一个子类可以不改变算法结构即可重定义算法中的某些步骤。
四、实现
abstract class AbstractClass {
public abstract void PrimitiveOperation1();//这些再子类中具体实现
public abstract void PrimitiveOperation2();
public void TemplateMethod() {
PrimitiveOperation1();
PrimitiveOperation2();
//其他固定操作
}
}
public class ConcreteClass extends AbstractClass {
@Override
public void PrimitiveOperation1() {
// 子类的具体实现
}
@Override
public void PrimitiveOperation2() {
// 子类的具体实现
}
}
public class ConcreteClassB extends AbstractClass {
@Override
public void PrimitiveOperation1() {
// 子类的具体实现
}
@Override
public void PrimitiveOperation2() {
// 子类的具体实现
}
}
public class Main {
public static void main(String[] args) {
AbstractClass abstractClass;
abstractClass = new ConcreteClass();
abstractClass.TemplateMethod();
abstractClass = new ConcreteClassB();
abstractClass.TemplateMethod();
}
}