模板方法模式,flutter 刷新机制
模板的含义就是一个方法, 这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现。这可以确保算法的结构保持不变,由子类提供部分实现。
设计类图:
示例代码:
public abstract class AbstractTemplate {
/**
模板方法, 定义一个算法骨架,包含一系列算法步骤
*/
public void templateMethod(){
//算法步骤由一些基本方法组成, 其中某些方法可以在子类中实现
primitiveOperation1()
;
primitiveOperation2();
concreteOperation();
}
protected abstract void primitiveOperation1();
protected abstract void primitiveOperation2();
private void concreteOperation() {
//这里是公共不变的部分
}
}
public class ConcreteTemplate extends AbstractTemplate {
@Override
protected void primitiveOperation1() {
//子类实现算法中的具体步骤
}
@Override
protected void primitiveOperation2() {
//子类实现算法中的具体步骤
}
}
public class Client {
public static void main(String[] args) {
AbstractTemplate template = new ConcreteTemplate();
template.templateMethod();
}
}
模板方法的实现非常简单,看上去就是简单的继承。但是模板方法必须是由父类定义一系列步骤,由子类去实现特定步骤。一系列步骤的方法被称为基本方法或者原语操作,需要由子类实现的方法都是 protected 的,这符合迪米特法则,外部知道的越少越好。模板方法可以说在实际当中是经常被用到的,不过多数情况下我们并没有感觉到。
模板方法中的钩子方法
模板方法的一个重要应用就是钩子方法(Hook Method)的应用,钩子方法给你提供了更加灵活的方式,使得你可以选择需要或者不需要执行算法步骤当中的某些步骤。
示例代码:
public abstract class AbstractTemplate {
/**
模板方法, 定义一个算法骨架,包含一系列算法步骤
*/
public void templateMethod(){
//算法步骤由一些基本方法组成, 某些方法可以在子类中实现
primitiveOperation1();
primitiveOperation2();
//根据钩子方法的返回结果决定是否执行下面的步骤
if (hookMethod()) {
concreteOperation();
}
}
protected abstract void primitiveOperation1();
protected abstract void primitiveOperation2();
private void concreteOperation() {
//这里是公共不变的部分
}
/**
钩子方法, 这里提供默认实现
*/
protected boolean hookMethod() {
return true;
}
}
评论