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

模板方法模式例子「建议收藏」原文地址: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、钩子可以让子类能够有机会对模板方法中某些即将发生的(或刚刚发生的)步骤作出反应。可以在钩子中实现我们对于某个步骤执行需要作出的动作,模板方法的某个步骤执行时,调用钩子。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 多元logistic回归模型——spss步骤

    多元logistic回归模型——spss步骤多元 因变量为多分类变量 结果在三种及三种以上 如 机构养老 社区养老 居家养老 自变量 可以是分类变量或连续变量 建议是分类变量 协变量 必须是分类变量 案例 步骤 1 分析 回归 多项 logistic 打开主面板 因变量 自变量分别按照箭头指示移入对应的变量框内 点击 参考类别 按钮 默认勾选 最后一个类别 指以因变量和自变量的最后一个分类水平为参照 用其他分类依次与之对比 考察不同水平间的倾向 2 主面板中 点击 模型 打开 多项 logistic 回归 模型 对话框 勾

    2025年7月5日
    0
  • 浅析 PHP7 底层运行机制[通俗易懂]

    浅析 PHP7 底层运行机制

    2022年2月11日
    41
  • Matlab绘图方法整理(超完整版)

    Matlab绘图方法整理(超完整版)超详细版Matlab绘图方法整理,1万字文章让你流畅掌握Matlab作图方法,保证你能完全掌握常用作图手段,谁又不想做一幅详细、美丽的图呢?

    2022年6月30日
    23
  • WIN10系统开机一个WIFI都找不到,网络适配器里没有WLAN驱动,连接不了网络问题【耗时3天测试10多种方法】

    WIN10系统开机一个WIFI都找不到,网络适配器里没有WLAN驱动,连接不了网络问题【耗时3天测试10多种方法】目录1.前言2.出现的问题情况2.1找不到WIFI,连不了网。2.2网络适配器里没有WLAN选项3.解决方法(推荐按顺序进行)。1.先检查WLAN是否存在2.修改服务设置3.直接重启4.通过驱动软件修复电脑网络5.通过ccleaner修复注册表6.进入bios系统修改wireless设置7.重装系统(最好不要)8.博主问题的解决1.前言最近每天打开电脑时都会出现这样的情况,每次折腾半天,有时候运气好重启一下就…

    2022年7月11日
    43
  • 国科大英语测试Unit3

    国科大英语测试Unit3TranslationandParaphrasingWithoutthe1968experimentsofKendall,FriedmanandTaylorattheStanfordLinearAcceleratorCenter(SLAC),quarkswouldhaveremainedameretheory,awill-o-wispwhoseexistencewasconfidentlypostulatedbutneverproven

    2022年6月3日
    40
  • spring中@EventListener 的详解和使用

    spring中@EventListener 的详解和使用转载:面了个35的程序员,让我莫名的慌了。。。(欢迎关注原文作者公众号:Java充电社)面了个35的程序员,让我莫名的慌了。。。原创路人甲Java路人甲Java2020-05-10收录于话题#Spring高手系列55个内容月底免费送书活动,这两天是最后的机会,大家尽快参与!面试官:看你是85年的我:嗯,35了面试官:那应该经验很丰富了,那我们来聊聊spring吧我:好,这块我用了10几年了,你随便问吧面试官:Spring中的事件用过么?我:用过…

    2022年10月23日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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