设计模式(22)-行为型-模板方法模式(Template Method)

概述

    定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
    
    TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤

适用性

    1.一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。

    2.各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
      首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。
      最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。

    3.控制子类扩展。
			

参与者

    1.AbstractClass
      定义抽象的原语操作(primitiveoperation),具体的子类将重定义它们以实现一个算法的各步骤。
      实现一个模板方法,定义一个算法的骨架。
      该模板方法不仅调用原语操作,也调用定义在AbstractClass或其他对象中的操作。

    2.ConcreteClass
      实现原语操作以完成算法中与特定子类相关的步骤。


类图


示例

package com.sql9.actioned;

/**
 * 模板方法模式 示例
 * @author iihero
 */

abstract class Template {
    protected abstract void laterWork();
    
    protected void step1() {
        System.out.println("执行明确的步骤1: step");
    }
    
    protected void lastStep() {
        System.out.println("执行明确的步骤: lastStep");
    }
    
    public void execute() {
        step1();
        laterWork();
        lastStep();
    }
}

class CustomizedTemplate extends Template {

    @Override
    protected void laterWork() {
        System.out.println("CustomizedTemplate: 在子类中执行后期任务");
    }
}

public class TemplateMethodTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Template template = new CustomizedTemplate();
        template.execute();
    }

}


结果

执行明确的步骤1: step
CustomizedTemplate: 在子类中执行后期任务
执行明确的步骤: lastStep


<script type="text/javascript"><!-- google_ad_client = "ca-pub-7104628658411459"; /* wide1 */ google_ad_slot = "8564482570"; google_ad_width = 728; google_ad_height = 90; //--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

你可能感兴趣的:(template)