设计模式(十八)---模板方法模式

1、简介

  模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。

  不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。

2、模板方法结构

  模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术。

  代表这些具体逻辑步骤的方法称做基本方法(primitive method);而将这些基本方法汇总起来的方法叫做模板方法(template method),这个设计模式的名字就是从此而来。

  模板方法所代表的行为称为顶级行为,其逻辑称为顶级逻辑。

3、模板方法类图

4、模板方法涉及的角色

  4.1、抽象模板角色:定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤,定义并实现了一个模板方法。

     这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。顶级逻辑也有可能调用一些具体方法。

  4.2、具体模板角色:实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑的组成步骤。每一个抽象模板角色都可以有任意多个具体模板角色与之对应,

     而每一个具体模板角色都可以给出这些抽象方法(也就是顶级逻辑的组成步骤)的不同实现,从而使得顶级逻辑的实现各不相同。

5、源代码

  5.1、抽象模板角色 

package TemplateMethod;
/**
 * ********************************************************  
* @ClassName: AbstractPerson 
* @Description: 抽象模板角色
*  
**********************************************************
 */
public abstract class AbstractPerson {
    //抽象类定义整个流程骨架  
    public void prepareGotoSchool(){  
         dressUp();  
         eatBreakfast();  
         takeThings();  
    }  
    //以下是不同子类根据自身特性完成的具体步骤  
    protected abstract void dressUp();  
    protected abstract void eatBreakfast();  
    protected abstract void takeThings();  
}

  5.2、具体模板角色1

package TemplateMethod;
/**
 * ********************************************************  
* @ClassName: ConcreteClass 
* @Description: 具体模板角色 
*  
**********************************************************
 */
public class Student extends AbstractPerson{
     @Override  
     protected void dressUp() {  
          System.out.println("穿校服");  
     }  
     @Override  
     protected void eatBreakfast() {  
          System.out.println("吃妈妈做好的早饭");  
     }  
  
     @Override  
     protected void takeThings() {  
          System.out.println("背书包,带上家庭作业和红领巾");  
     }  
}

  5.3、具体模板角色2

package TemplateMethod;
/**
 * ********************************************************  
* @ClassName: Teacher 
* @Description: 具体模板类 
*  
**********************************************************
 */
public class Teacher extends AbstractPerson{
    @Override  
    protected void dressUp() {  
         System.out.println("穿工作服");  
    }  
    @Override  
    protected void eatBreakfast() {  
         System.out.println("做早饭,照顾孩子吃早饭");  
    }  
 
    @Override  
    protected void takeThings() {  
         System.out.println("带上昨晚准备的考卷");  
    }  
}

  5.4、测试客户端

package TemplateMethod;
/**
 * ********************************************************  
* @ClassName: Client 
* @Description: 模板方法模式测试客户端
*  
**********************************************************
 */
public class Client {
     public static void main(String[] args) {  
         Student student = new Student();
         student.prepareGotoSchool();  
      
         Teacher teacher  = new Teacher();  
         teacher.prepareGotoSchool();  
         }  
}

6、测试,运行结果如下

7、总结

  子类可以置换掉父类的可变部分,但是子类却不可以改变模板方法所代表的顶级逻辑。

原文地址:https://www.cnblogs.com/shun-gege/p/7519998.html