Design Pattern | Template Method 模板方法
by Botao Xiao
定义一个算法中的操作框架,而将一些步骤延迟到子类中。使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。 我认为模板方法和策略模式有些相似,一些策略的实现步骤是固定的,我们就可以定义操作的框架,并通过实现每一小的操作实现整个策略。
Template Method的实现流程
- 定义一个接口或是抽象类,被称为抽象模板。
- 基本方法:是由子类实现的方法,并且在模板方法被调用。(一般都加上final关键字,防止被覆写)
- 可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调用,完成固定的逻辑。(抽象模板中的基本方法尽量设计为protected类型,符合迪米特法则,不需要暴露的属性或方法尽量不要设置为protected类型。实现类若非必要,尽量不要扩大父类中的访问权限)
public abstract class TemplateClass { public abstract void action1(); //基本方法,由子类实现 public abstract void action2(); public final void templateAction(){ //一个具体方法,对基本方法进行调用 action1(); action2(); } }
- 子类继承抽象模板,实现未实现的方法。
public class ConcreteMethod1 extends TemplateClass { @Override public void action1() { System.out.println("This is action1 from concrete method1..."); } @Override public void action2() { System.out.println("This is action2 from concrete method1..."); } } public class ConcreteMethod2 extends TemplateClass { @Override public void action1() { System.out.println("This is action1 from concrete method2..."); } @Override public void action2() { System.out.println("This is action2 from concrete method2..."); } public static void main(String[] args) { TemplateClass template = new ConcreteMethod1(); template.action1(); template.action2(); template = new ConcreteMethod2(); template.action1(); template.action2(); } } This is action1 from concrete method1... This is action2 from concrete method1... This is action1 from concrete method2... This is action2 from concrete method2...
通过Lambda表达式实现模板模式
- 在Java8中添加了很多的函数式接口,我们可以通过这些函数式接口代替我们自己定义的接口。
- 接口规范了行为,一些函数式接口可以完全减少了接口的重新定义,并且方便我们传递代码块。
总结
- 封装不变部分,扩展可变部分。把认为不变部分的算法封装到父类中实现,而可变部分的则可以通过继承来继续扩展。
- 行为由父类控制,子类实现。
Conclusion
Subscribe via RSS