模板方法模式例子「建议收藏」

模板方法模式例子「建议收藏」原文地址:http://www.cnblogs.com/jenkinschan/p/5768760.html一、概述 模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。二、结构类图三、解决问题模板方法就是提供一个算法框架,框架里面的步骤有些是父类已经定好的,有些需要子类自己实现。相当于要去办一件事情,行动的流

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

原文地址:http://www.cnblogs.com/jenkinschan/p/5768760.html

一、概述

 模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

二、结构类图

这里写图片描述

三、解决问题

模板方法就是提供一个算法框架,框架里面的步骤有些是父类已经定好的,有些需要子类自己实现。相当于要去办一件事情,行动的流程已经定好了,但有些步骤需要自己去做,而有些步骤可能别人帮我们做了。就拿建网站来说,一般的程序是购买域名–>购买空间–>上传网站–>备案–>审核,每个网站的创建必须经过这样的固定程序,但除了审核不用建站者关心,其他的步骤都要建站者自己去完成。

四、应用实例

现在我们很多家庭都有了豆浆机,豆浆的营养价值不用我多说了。制作豆浆的程序简单点来说就是选材—>添加配料—>浸泡—>放到豆浆机打碎,通过添加不同的配料,可以制作出不同口味的豆浆,但是选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的。

1、创建抽象类

package templatemethod.pattern;

//豆浆类,抽象类
public abstract class SoyaMilk {
    //这是模板方法,用final修饰,不允许子类覆盖。模板方法定义了制作豆浆的程序
    final void  prepareRecipe(){
        selectMaterial();
        addCondiments();
        soak();
        beat();
    }

    //选材方法,选择黄豆
    void selectMaterial(){
         System.out.println("第一步、选择好了新鲜黄豆");
    }

    //可以添加不同的配料,在这里设置为抽象方法,子类必须实现
    abstract void addCondiments();

    //浸泡
    void soak(){
        System.out.println("第三步、黄豆和配料开始浸泡,大概需要5个小时");
    }

    //放到豆浆机打碎
    void beat(){
        System.out.println("第四步、黄豆的配料放到豆浆机打碎");
    }

}

Jetbrains全家桶1年46,售后保障稳定

2、创建红枣豆浆

package templatemethod.pattern;

//红枣豆浆
public class ReddatesSoyaMilk extends SoyaMilk{ 
   
    //实现父类的添加配料方法
    @Override
    void addCondiments() {
        System.out.println("第二步、添加红枣配料");

    }

}

3、创建核桃豆浆

package templatemethod.pattern;

//核桃豆浆
public class NutSoyaMilk extends SoyaMilk{ 
   
    //实现父类的添加配料方法
    @Override
    void addCondiments() {
        System.out.println("第二步、添加核桃配料");      
    }

}

4、测试制作豆浆

package templatemethod.pattern;

public class SoyaMilkTest {
    public static void main(String[] args){
        //制作红枣豆浆
        System.out.println();
        System.out.println("-----制作红枣豆浆步骤-------");
        SoyaMilk reddatesSoyaMilk = new ReddatesSoyaMilk();
        reddatesSoyaMilk.prepareRecipe();

        //制作核桃豆浆
        System.out.println();
        System.out.println("-----制作核桃豆浆步骤-------");
        SoyaMilk nutSoyaMilk = new NutSoyaMilk();
        nutSoyaMilk.prepareRecipe();

    }
}

这里写图片描述

五、优缺点

1、优点
  (1)、算法只存在于一个地方,也就是在父类中,容易修改。需要修改算法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改。

  (2)、实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用。

  (3)、既统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不变,同时由子类提供部分步骤的实现。

  (4)、提供了一个基本框架,容易扩展子类。模板方法有框架控制如何做事情,而由使用框架的人指定框架算法中每个步骤的细节。子类只要继承父类,实现抽象方法,就可以使用父类的算法。

2、缺点
  (1)、模板方法使用继承方式复用代码,如果要在基本算法里面增加一个步骤,而该步骤是抽象的话,每个子类都要修改代码,实现这个步骤。

六、模板方法中的钩子方法

在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为“钩子”。我们还是用上面做豆浆的例子来讲解。

1、创建有钩子方法的父类

package templatemethod.pattern;

//豆浆类,抽象类
public abstract class SoyaMilkWithHook {
    //这是模板方法,用final修饰,不允许子类覆盖。模板方法定义了制作豆浆的程序
    final void  prepareRecipe(){
        selectMaterial();
        //判断是否添加配料
        if(customerWantsCondiments()){
            addCondiments();
        }      
        soak();
        beat();
    }

    //选材方法,选择黄豆
    void selectMaterial(){
         System.out.println("选择好了新鲜黄豆");
    }

    //可以添加不同的配料,在这里设置为抽象方法,子类必须实现
    abstract void addCondiments();

    //浸泡
    void soak(){
        System.out.println("材料开始浸泡,大概需要5个小时");
    }

    //放到豆浆机打碎
    void beat(){
        System.out.println("材料放到豆浆机打碎");
    }

    //钩子方法,是否添加配料
    boolean customerWantsCondiments(){
        return true;
    }
}

2、创建纯豆浆子类

package templatemethod.pattern;

//制作纯豆浆,不添加任何配料
public class PureSoyaMilk extends SoyaMilkWithHook{ 
   

    @Override
    void addCondiments() {

    }

    //覆盖钩子方法,不添加配料
    @Override
    boolean customerWantsCondiments(){
        return false;
    }
}

3、测试制作纯豆浆

package templatemethod.pattern;

public class PureSoyaMilkTest {
    public static void main(String[] args){
        //制作纯豆浆
        System.out.println();
        System.out.println("-----制作纯豆浆步骤-------");
        SoyaMilkWithHook pureSoyaMilk = new PureSoyaMilk();
        pureSoyaMilk.prepareRecipe();
    }
}

钩子方法的作用

  1、让子类实现算法中的可选部分。算法中的某些步骤是可选的,子类可以做出决定是否需要这些步骤。

  2、如果钩子对于子类的实现不重要时,子类可以对钩子置之不理。

  3、钩子可以让子类能够有机会对模板方法中某些即将发生的(或刚刚发生的)步骤作出反应。可以在钩子中实现我们对于某个步骤执行需要作出的动作,模板方法的某个步骤执行时,调用钩子。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/234231.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • BoundsChecker使用说明(代码调试)

    目录….1一、BoundsChecker简介….2二、安装环境….2三、BoundsChecker两种工作模式….3      3.1ActiveCheck..3      3.2FinalCheck..3四、特性和优点….5五、检测示例….65.1内存泄漏检测示例….65.2野指针检测示

  • ArcGIS二次开发知识点总结「建议收藏」

    ArcGIS二次开发知识点总结「建议收藏」空间分析定义:空间分析是指分析具有空间坐标或相对位置的数据和过程的理论和方法,是对地理空间现象的定量研究,其目的在于提取并传输空间数据中隐含的空间信息。叠置分析定义:是指将同一坐标系统下不同信息表达的两组或多组专题要素的图层进行叠加,从而产生一个新图层的过程缓冲区分析定义:是指根据分析对象的点、线、面实体,自动建立其周围一定距离的带状区,用以识别这些实体或者主体对邻近对象的辐射范围或者…

  • JVM调优总结 -Xms -Xmx -Xmn -Xss

    JVM参数在tomcat中如何进行配置在tomcat的bin目录下面有很多可以执行的脚步,执行的脚步分为windows环境和Linux环境! 如果在windows环境配置jvm参数,catalina.bat如下:set JAVA_OPTS="$JAVA_OPTS -server -Xmx3550m -Xms3550m -Xmn2g -XX:PermSize=256m -XX:MaxPer…

  • echarts 旭日图_ECHARTS

    echarts 旭日图_ECHARTS旭日图旭日图(Sunburst)由多层的环形图组成,在数据结构上,内圈是外圈的父节点。因此,它既能像饼图一样表现局部和整体的占比,又能像矩形树图一样表现层级关系。引入相关文件旭日图是ECharts4.0新增的图表类型,需要引入完整版的echarts.min.js最简单的旭日图创建旭日图需要在series配置项中声明类型为‘sunburst’的系列,并且以树形结构声明其d…

  • 求逆矩阵公式推导_逆矩阵公式运算公式

    求逆矩阵公式推导_逆矩阵公式运算公式求逆矩阵公式推导

  • 效率倍增,推荐6个好用到爆的Pycharm插件

    效率倍增,推荐6个好用到爆的Pycharm插件相信对于不少的Python程序员们都是用Pycharm作为开发时候的IDE来使用的。今天我来分享几个好用到爆的Pycharm插件,在安装上之后,你的编程效率、工作效率都能够得到极大地提升。喜欢本文点赞、收藏、关注。部分插件技术群朋友分享,在此表示感谢。【文末】提供技术交流群安装方法插件的安装方法一点都不难打开file—settings—plugins,在右侧的文本框中输入想要查看的插件名称,在下方就会罗列出已经安装的相关的插件找到我们所需要的对应插件之后,点击install即可完成下载,然后重

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号