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

模板方法模式例子「建议收藏」原文地址: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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 电阻色环表色环电阻识别表_电阻的色环识别方法

    电阻色环表色环电阻识别表_电阻的色环识别方法色环电阻色环电阻是电子电路中最常用的电子元件,色环电阻就是在普通的电阻封装上涂上不一样的颜色的色环,用来区分电阻的阻值。保证在安装电阻时不管从什么方向来安装,都可以清楚的读出它的阻值。色环电阻的基本单位有:欧姆(Ω)、千欧(KΩ)、兆欧(MΩ)。1兆欧(MΩ)=1000千欧(KΩ)=1000000欧(Ω)。平常使用的色环电阻可以分为四环和五环,通常用四环。其中四环电阻前二环为数字,第三环表

    2022年11月3日
  • 正则表达式替换自身「建议收藏」

    正则表达式替换自身「建议收藏」一、问题:将文本中所有[XXX]替换成XXX(XXX包含字母数字下划线),就是将中括号去掉了例如:[PK_Roles]   替换成:PK_Roles二、解答:正则式:\[([0-9a-zA-Z_]*)\]加圆括号表示分组并作为“反向索引”,[0-9a-zA-Z_]*表示多个数字字母下划线替换式:\1\1表示引用第1个组,\1在有些环境中是$1三、常用正则表达式空行

    2022年5月16日
  • Android严苛模式StrictMode使用详解「建议收藏」

    Android严苛模式StrictMode使用详解「建议收藏」StrictMode类是Android2.3(API9)引入的一个工具类,可以用来帮助开发者发现代码中的一些不规范的问题,以达到提升应用响应能力的目的。举个例子来说,如果开发者在UI线程中进行了网络操作或者文件系统的操作,而这些缓慢的操作会严重影响应用的响应能力,甚至出现ANR对话框。为了在开发中发现这些容易忽略的问题,我们使用StrictMode,系统检测出主线程违例的情况并做出相应的反应,

    2022年6月3日
  • SQLserver字符串转日期_sqlserver合并字符串

    SQLserver字符串转日期_sqlserver合并字符串框架用的是mybatis。sqlserver:CONVERT(datetime,#{transaction_date_time},20), mysql: DATE_FORMAT(#{transaction_date_time},’%Y-%m-%d%H:%i:%S’)

    2022年10月8日
  • tinyXml生成XML文件

    tinyXml生成XML文件1.tinyXMl生成XML文件#include<stdio.h>#include<string>usingnamespacestd;#include”../tinyxml/tinyxml.h”inttest1(){ TiXmlDocumentxml_doc; //添加XML声明 xml_doc.LinkEndChild(n…

    2022年6月5日
  • SpringBoot2.0集成WebSocket,实现后台向前端推送信息

    SpringBoot2.0集成WebSocket,实现后台向前端推送信息什么是WebSocket?-初次接触WebSocket的人,都会问同样的问题:我们已经有了HTTP协议,为什么还需要另一个协议?它能带来什么好处?-答案很简单,因为HTTP协议有一个缺陷:***通信只能由客户端发起***,HTTP协议做不到服务器主动向客户端推送信息。https://github.com/moshowgame/spring-cloud-study/tree/master/spring-cloud-study-websocket

    2022年5月3日

发表回复

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

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