zoukankan      html  css  js  c++  java
  • 设计模式(十八)---模板方法模式

    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、总结

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

  • 相关阅读:
    区分jquery中的offset和position
    如何让搜索框的键盘显示搜索按键?
    如何设置table的border-radius?
    如何让输入框自动使用英文输入法?
    如何隐藏数字输入框的上下箭头?
    autocapticalize和autocorrect
    防止注入
    sychronized和lock和区别
    各大公司Java面试题超详细总结
    n的阶乘
  • 原文地址:https://www.cnblogs.com/shun-gege/p/7519998.html
Copyright © 2011-2022 走看看