(Template Method)模板方法模式的Java实现

简介:
模板方法模式( Template Method ): 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 该模式 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
使用场景:
1、 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2、 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。 重分解以一般化 首先识别现有代码中的 不同之处 ,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
3、 控制子类扩展。模板方法只在特定点调用 Hook Method(钩子方法) 操作,这样就只允许在这些点进行扩展。
通用类图如下:

我们这里的类图会详细一点,如下:

具体代码实现如下:

abstract  class AbstractMethod { 
    
   protected  abstract  void method1(); 
   protected  abstract  void method2(); 

   // 模板方法,统一调用上面两个在子类中会被实现的方法,即不同的实现 
   public  final  void templateMethod() { 
     /* 
     * 此方法体内也可以通过“钩子方法”来实现根据一定情况调用 不同的方法组合 
     */
 
     if (hookMethod()) { 
      method1(); 
    } else { 
      method1(); 
      method2(); 
    }     
  } 

   // 钩子方法,protected权限可被子类覆盖,默认为返回true 
   protected  boolean hookMethod() { 
     return  true
  } 


class ConcreteMethodA  extends AbstractMethod{ 
   protected  void method1() { 
    System.out.println( "子类 A :method1() ..."); 
  } 
   protected  void method2() { 
    System.out.println( "子类 A :method2() ..."); 
  } 


class ConcreteMethodB  extends AbstractMethod{ 
   protected  void method1() { 
    System.out.println( "子类 B :method1() ..."); 
  } 
   protected  void method2() { 
    System.out.println( "子类 B :method2() ..."); 
  } 
   //覆盖钩子方法 
   protected  boolean hookMethod() { 
     return  false
  } 


public  class Client { 
   public  static  void main(String[] args) { 
    AbstractMethod methodA =  new ConcreteMethodA(); 
    methodA.templateMethod(); 
     
    AbstractMethod methodB=  new ConcreteMethodB(); 
    methodB.templateMethod(); 
  } 
}

测试结果:
子类 A :method1() ...
子类 B :method1() ...
子类 B :method2() ...
至此,模板方法模式就简单地实现了,我们明白到抽象类AbstactMethod中的模板方法实际上是提供了一个外部可访问的接口,外部环境由该接口进入获得服务,而AbstractMethod类在此将子类可能提供不同服务给封装隐藏起来,即延迟了某些具体服务的细节,由其子类来负责实现。
另外,钩子方法的合理使用也可以使得模板方法模式更加灵活,不至于被templateMethod()简单地限制着,请参看上面例子的代码实现和测试结果。


本文转自 xxxx66yyyy 51CTO博客,原文链接:http://blog.51cto.com/haolloyin/333063,如需转载请自行联系原作者
相关文章
|
3月前
|
设计模式 算法 Java
Java设计模式-模板方法模式(14)
Java设计模式-模板方法模式(14)
|
7月前
|
设计模式 Java 容器
【设计模式】JAVA Design Patterns——Async Method Invocation(异步方法调用模式)
【设计模式】JAVA Design Patterns——Async Method Invocation(异步方法调用模式)
|
4月前
|
设计模式 算法 Java
【揭秘】如何巧妙运用Java模板方法模式,让你的代码优雅升级?
【8月更文挑战第30天】模板方法模式是一种行为型设计模式,它定义了算法的骨架并将某些步骤延迟到子类中,使子类能在不改变算法结构的情况下重定义特定步骤。此模式适用于具有共同结构但细节不同的场景,如角色升级系统。通过定义一个抽象类 `Character` 包含模板方法 `levelUp` 和抽象步骤方法,子类如 `Warrior` 和 `Mage` 可以实现具体逻辑。这种方式提供了良好的扩展性,确保算法结构不变,同时保持系统的稳定性和一致性,在数据处理和业务流程管理中广泛应用。
66 2
|
4月前
java.lang.IllegalStateException: Could not find method onClickcrea(View) in a parent or ancestor Con
java.lang.IllegalStateException: Could not find method onClickcrea(View) in a parent or ancestor Con
63 1
|
5月前
|
存储 Java 编译器
Java面试题:描述方法区(Method Area)的作用以及它在JVM中的演变(从永久代到元空间)
Java面试题:描述方法区(Method Area)的作用以及它在JVM中的演变(从永久代到元空间)
68 3
|
6月前
|
Java 测试技术
Java反射之Method的invoke方法详解
Java反射之Method的invoke方法详解
|
5月前
|
设计模式 算法 Java
Java面试题:描述Java中的模板方法模式及其作用?如何在Java中实现模板方法模式?
Java面试题:描述Java中的模板方法模式及其作用?如何在Java中实现模板方法模式?
48 0
|
7月前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
|
7月前
|
设计模式 算法 Java
Java 设计模式:深入模板方法模式的原理与应用
【4月更文挑战第27天】模板方法模式是一种行为设计模式,主要用于定义一个操作中的算法的框架,允许子类在不改变算法结构的情况下重定义算法的某些特定步骤。
70 1
|
7月前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式