重分解以一般化” , 首先识别现有代码中的 不同之处 ,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。



“ Hook Method(钩子方法) ”操作,这样就只允许在这些点进行扩展。



通用类图如下:



java MethodHandles 转化为 Function java method方法_java



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



java MethodHandles 转化为 Function java method方法_子类_02



具体代码实现如下:





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();
  }
}

















AbstactMethod中的模板方法实际上是提供了一个外部可访问的接口,外部环境由该接口进入获得服务,而AbstractMethod类在此将子类可能提供不同服务给封装隐藏起来,即延迟了某些具体服务的细节,由其子类来负责实现。




templateMethod()简单地限制着,请参看上面例子的代码实现和测试结果。


转载于:https://blog.51cto.com/haolloyin/333063