模版方法模式(Template method pattern)

    实例

    事实上,模版方法是编程中一个经常用到的模式。先来看一个例子,某日,程序员A拿到一个任务:给定一个整数数组,把数组中的数由小到大排序,然后把排序之后的结果打印出来。经过分析之后,这个任务大体上可分为两部分,排序和打印,打印功能好实现,排序就有点麻烦了。但是A有办法,先把打印功能完成,排序功能另找人做。

    写完后,A找到刚毕业入职不久的同事B说:有个任务,主要逻辑我已经写好了,你把剩下的逻辑实现一下吧。于是把AbstractSort类给B,让B写实现。B拿过来一看,太简单了,10分钟搞定,代码如下:

    1. @Override
    2. protected void sort(int[] array){
    3. for(int i=0; i<array.length-1; i++){
    4. selectSort(array, i);
    5. }
    6. }
    7. private void selectSort(int[] array, int index) {
    8. int MinValue = 32767; // 最小值变量
    9. int indexMin = 0; // 最小值索引变量
    10. int Temp; // 暂存变量
    11. if (array[i] < MinValue){ // 找到最小值
    12. MinValue = array[i]; // 储存最小值
    13. indexMin = i;
    14. }
    15. Temp = array[index]; // 交换两数值
    16. array[index] = array[indexMin];
    17. array[indexMin] = Temp;
    18. }
    19. }

    排序结果: 0 1 3 4 5 7 9 10 12 32

    运行正常。行了,任务完成。没错,这就是模版方法模式。大部分刚步入职场的毕业生应该都有类似B的经历。一个复杂的任务,由公司中的牛人们将主要的逻辑写好,然后把那些看上去比较简单的方法写成抽象的,交给其他的同事去开发。这种分工方式在编程人员水平层次比较明显的公司中经常用到。比如一个项目组,有架构师,高级工程师,初级工程师,则一般由架构师使用大量的接口、抽象类将整个系统的逻辑串起来,实现的编码则根据难度的不同分别交给高级工程师和初级工程师来完成。怎么样,是不是用到过模版方法模式?

    1. abstract class AbstractClass
    2. {
    3. public abstract void PrimitiveOperation1();
    4. public abstract void PrimitiveOperation2();
    5. public void TemplateMethod()
    6. PrimitiveOperation1();
    7. PrimitiveOperation2();
    8. }
    9. }

    ConcreteClass实现夫类所定义的一个或者多个抽象方法。每一个AbstractClass都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。

    客户端调用

    1. static void Main(string[] args)
    2. {
    3. AbstractClass c;
    4. c = new ConcreteClassA();
    5. c.TemplateMethod();
    6. c = new ConcreteClassB();
    7. c.TemplateMethod();
    8. Console.Read();