设计模式之美(11)-行为型-模版模式

模版模式的原理与实现

模版模式,全称是模版方法设计模式,模版方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现。模版方法模式可以让子类在不改变算法整体结构的情况下,重新定义算法中的某些步骤。这里的“算法”,可以理解为业务逻辑。


public abstract class AbstractClass { 
  public final void templateMethod() { 
    //...
    method1();
    //...
    method2();
    //...
  }
  protected abstract void method1();
  protected abstract void method2();
}
public class ConcreteClass1 extends AbstractClass { 
  @Override
  protected void method1() { 
    //...
  }
  @Override
  protected void method2() { 
    //...
  }
}
public class ConcreteClass2 extends AbstractClass { 
  @Override
  protected void method1() { 
    //...
  } 
  @Override
  protected void method2() { 
    //...
  }
}
AbstractClass demo = ConcreteClass1();
demo.templateMethod();

模版模式作用一:复用

模版模式把一个算法中不变的流程抽象到父类的模版方法中,将可变的部分留给子类来实现。所有的子类都可以复用父类中模版方法定义的流程代码。

  1. Java InputStream
    Java IO类库中,有很多类的设计用到了模版模式,InputStream就是其中之一。

public abstract class InputStream implements Closeable { 
  //...省略其他代码...

  public int read(byte b[], int off, int len) throws IOException { 
    if (b == null) { 
      throw new NullPointerException();
    } else if (off < 0 || len < 0 || len > b.length - off) { 
      throw new IndexOutOfBoundsException();
    } else if (len == 0) { 
      return 0;
    }

    int c = read();
    if (c == -1) { 
      return -1;
    }
    b[off] = (byte)c;

    int i = 1;
    try { 
      for (; i < len ; i++) { 
        c = read();
        if (c == -1) { 
          break;
        }
        b[off + i] = (byte)c;
      }
    } catch (IOException ee) { 
    }
    return i;
  }

  public abstract int read() throws IOException;
}

public class ByteArrayInputStream extends InputStream { 
  //...省略其他代码...

  @Override
  public synchronized int read() { 
    return (pos < count) ? (buf[pos++] & 0xff) : -1;
  }
}

read()函数是一个模版方法,定义了读取数据的整个流程,并且暴露了一个可以由子类来定制的抽象方法。不过这个模版方法也被命名为read()。
2. Java AbstractList
在Java AbstractList类中,addAll()函数可以看作模版方法,add()是子类需要重写的方法,尽管没有声明为abstract的,但是函数直接抛出了异常,


public boolean addAll(int index, Collection<? extends E> c) { 
    rangeCheckForAdd(index);
    boolean modified = false;
    for (E e : c) { 
        add(index++, e);
        modified = true;
    }
    return modified;
}

public void add(int index, E element) { 
    throw new UnsupportedOperationException();
}

模版模式作用二:扩展

模版模式的第二大作用是扩展,这里的扩展,并不是指代码的扩展性,而是指框架的扩展性,有点类似控制反转,基于这个作用,模版模式常用在框架的开发中,让框架用户可以在不修改框架源码的情况下,定制化框架的功能,典型的例子就是 Java servlet 与 junit TestCase。

    原文作者:就是不掉头发
    原文地址: https://blog.csdn.net/sunqiang4/article/details/119878494
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞