博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之--模板模式(Templete)
阅读量:5037 次
发布时间:2019-06-12

本文共 4214 字,大约阅读时间需要 14 分钟。

定义:

  Define the skeleton of algorithm in an operation , deferring some steps to subclass.
  Template method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
  在操作中定义一个算法的骨架,骨架将一些实现步骤延迟到子类中。
  模板方法让子类定义一些骨架的步骤,却不会改变骨架定义的步骤结构
其他:子类继承了父类的方法,通过从父类继承过来的方法,反过来调用子类的自身实现方法(曲线理解为父类调用子类的方法)。在很多框架中,提示你继承一个抽象类,然后执行一个类似 execute() 的方法,就完成了功能扩展,就是应用了模板模式

关键:定义模板方法的类是一个抽象类,该类定义了一系列的step抽象方法,并定义了一个调用这些step 的实现方法。

   行为由父类控制,子类实现自身的一些业务实现

类图:

      

一 定义模板

package dmode.templete;/** * 类描述:中国式教育模板类  * 在抽象类中指定模板,让子类实现抽象类中的其他方法,这是抽象类的一个好处  * @version 1.0  CreateDate: 2015-2-12 * * @updateDate             * @updatePerson         * @declare */public abstract class EducationTemp {        /**     * 方法描述:小学教育     */    public abstract void primaryEdu();        /**     * 方法描述:初中教育     */    public abstract void middleEdu();        /**     * 方法描述:高中教育     */    public abstract void seniorEdu();        /**     * 方法描述:大学教育     */    public abstract void universityEdu();        /**     * 方法描述:是否接受大学教育     * 此方法为钩子方法,定义一个抽象方法,让子类实现;根据子类的返回值,来决定模板方法中的操作逻辑     * @return     */    public abstract boolean ifAcceptUnivEdu();        /**     * 方法描述:教育模板     */    public void edu(){        this.primaryEdu();        this.middleEdu();        this.seniorEdu();        if(this.ifAcceptUnivEdu()){            this.universityEdu();        }    }    }

 

二:定义 实现模板的子类

package dmode.templete;/**  * 类描述: 学生A  * @version 1.0  CreateDate: 2015-2-12 * * @updateDate             * @updatePerson         * @declare  */public class StudentA extends EducationTemp{        /**     * 默认A 接受大学教育     */    private boolean acceptUnivEdu = true;    /**    *@see dmode.templete.EducationTemp#primaryEdu()    */    @Override    public void primaryEdu() {        System.out.println("A 进行小学教育");    }    /**    *@see dmode.templete.EducationTemp#middleEdu()    */    @Override    public void middleEdu() {        System.out.println("A 进行中学教育");    }    /**    *@see dmode.templete.EducationTemp#seniorEdu()    */    @Override    public void seniorEdu() {        System.out.println("A 进行高中教育");    }    /**    *@see dmode.templete.EducationTemp#universityEdu()    */    @Override    public void universityEdu() {        System.out.println("A 进行大学教育");    }    /**    *@see dmode.templete.EducationTemp#ifAcceptUnivEdu()    *学生A 接不接受大学教育由他自己决定    */    @Override    public boolean ifAcceptUnivEdu() {        return this.acceptUnivEdu;    }        /**     * 方法描述:具体上不上大学,A在实际情况中自己决定     * @param acceptUnivEduFlag     */    public void setAcceptUnivEdu(boolean acceptUnivEduFlag){        this.acceptUnivEdu = acceptUnivEduFlag;    }}

 

package dmode.templete;/**  * 类描述:学生B   * @version 1.0  CreateDate: 2015-2-12 * * @updateDate             * @updatePerson         * @declare  */public class StudentB extends EducationTemp{    /**    *@see dmode.templete.EducationTemp#primaryEdu()    */    @Override    public void primaryEdu() {        System.out.println("B 进行小学教育");    }    /**    *@see dmode.templete.EducationTemp#middleEdu()    */    @Override    public void middleEdu() {        System.out.println("B 进行中学教育");    }    /**    *@see dmode.templete.EducationTemp#seniorEdu()    */    @Override    public void seniorEdu() {        System.out.println("B 进行高中教育");    }    /**    *@see dmode.templete.EducationTemp#universityEdu()    */    @Override    public void universityEdu() {        System.out.println("B 进行大学教育");    }    /**    *@see dmode.templete.EducationTemp#ifAcceptUnivEdu()    *学生B 接受大学教育    */    @Override    public boolean ifAcceptUnivEdu() {        return true;    }}

 

三 调用场景

package dmode.templete;/**  * 类描述:  入口 * @version 1.0  CreateDate: 2015-2-12 * * @updateDate             * @updatePerson         * @declare  */public class Acce {        public static void main(String[] args) {                //对于有自身特定行为的类,用子类自身来接收        StudentA a = new StudentA();        a.setAcceptUnivEdu(false);                //大众的学生由抽象类来接收就可以        EducationTemp b = new StudentB();        a.edu();        System.out.println("==================");        b.edu();    }}

 

 

 

 输出:

  

A 进行小学教育

A 进行中学教育
A 进行高中教育
==================
B 进行小学教育
B 进行中学教育
B 进行高中教育
B 进行大学教育

 

  

转载于:https://www.cnblogs.com/leonkobe/p/4288501.html

你可能感兴趣的文章
Android为TV端助力 自定义动画
查看>>
火狐鼠标手势
查看>>
@ModelAttribute使用详解
查看>>
一些常见的系统标准表
查看>>
analyse web.xml of hello1
查看>>
网页基础知识
查看>>
评审人意见汇总
查看>>
程序员最该看的30本书---------------------------国外编辑推荐
查看>>
ibatis.net 多线程的调试
查看>>
活动目录的信任关系
查看>>
window.name实现跨区操作
查看>>
编写可维护的JavaScript-第11章-不是你的对象不要动
查看>>
二维树状数组模板(区间修改+区间查询)
查看>>
iOS 语音识别使用讯飞报错
查看>>
whistle 前端工具之抓包利器
查看>>
LeetCode-347 Top K Frequent Elements
查看>>
struts2 委托spring代理action .
查看>>
java持久层框架mybatis如何防止sql注入
查看>>
Python入门 (二)
查看>>
git出错
查看>>