首页 > 其他分享 >Template Pattern —— Behavioral Class

Template Pattern —— Behavioral Class

时间:2023-09-05 17:44:28浏览次数:42  
标签:咖啡 Pattern void Class 算法 Template 子类 抽象类 public

Hook Method

钩子方法(Hook Method)之所以被称为“钩子”,是因为它在算法或流程中提供了一个“钩子”,允许子类在特定的点上“钩入”自己的实现逻辑,从而影响算法的行为或流程的执行。

它类似于一个挂钩、锚点,所以叫Hook method, 它允许子类插入自定义的代码来改变或扩展算法的功能。

Template pattern 的实现就必须用到Hook method。
Hook Method一般在抽象类中被定义,但默认情况下没有实现或者提供一个空实现。
钩子方法的作用是允许具体子类有选择地覆盖或扩展算法的某些步骤。

What is Template

模板模式(Template Pattern)是一种行为设计模式,它定义了一个操作中的算法骨架,将一些步骤推迟到子类中实现。模板模式使得子类可以在不改变算法结构的情况下,重新定义算法中的特定步骤。

它提供了一种灵活的方式,允许子类定制算法的特定部分,同时保持整体的一致性。

Compare between Template and Builder

模板模式适用于具有相似算法结构但具体步骤有所不同的场景。它提供了一种灵活的方式,允许子类定制算法的特定部分,同时保持整体的一致性。

建造者模式适用于创建对象的构建过程比较复杂,需要一步一步地进行,并且需要创建不同表示的情况。

Key Elements

  • 抽象类(Abstract Class)
    抽象类定义了算法的骨架,包含了一个或多个抽象方法或钩子(hook)方法,这些方法将在具体子类中实现。抽象类还可以包含具体方法来定义算法的通用步骤,这些步骤可以被子类直接使用或覆盖。
  • 具体类(Concrete Class)
    具体类是抽象类的子类,它实现了由抽象类定义的抽象方法或钩子方法,并为算法中的特定步骤提供了具体的实现。

Simple Example

当你使用咖啡机制作咖啡时,可以使用模板模式来定义制作咖啡的算法骨架,同时允许子类来定制特定步骤的实现。

// 模板类 - 制作咖啡的算法骨架
public abstract class CoffeeMaker {
    public void makeCoffee() {
        boilWater();
        brewCoffee();
        pourInCup();
        addMilkAndSugar();
    }
    
    public void boilWater() {
        System.out.println("Boiling water");
    }
    
    // 抽象方法,由子类实现
    public abstract void brewCoffee();
    
    public void pourInCup() {
        System.out.println("Pouring coffee into cup");
    }
    
    // 钩子方法,子类可以选择性实现
    public void addMilkAndSugar() {
        // 默认不加牛奶和糖
    }
}

// 具体类 - 制作黑咖啡
public class BlackCoffeeMaker extends CoffeeMaker {
    @Override
    public void brewCoffee() {
        System.out.println("Brewing black coffee");
    }
}

// 具体类 - 制作拿铁咖啡
public class LatteCoffeeMaker extends CoffeeMaker {
    @Override
    public void brewCoffee() {
        System.out.println("Brewing espresso");
    }
    
    @Override
    public void addMilkAndSugar() {
        System.out.println("Adding milk and sugar");
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        CoffeeMaker blackCoffeeMaker = new BlackCoffeeMaker();
        blackCoffeeMaker.makeCoffee();
        
        System.out.println("--------------------");
        
        CoffeeMaker latteCoffeeMaker = new LatteCoffeeMaker();
        latteCoffeeMaker.makeCoffee();
    }
}

在上述示例中,CoffeeMaker 是一个抽象类,定义了制作咖啡的算法骨架。它包含了一系列的步骤:

  1. 烧水
  2. 冲泡咖啡
  3. 倒入杯子中
  4. 加牛奶和糖(可选)。

其中:

  • brewCoffee() 是一个抽象方法,由具体子类实现。
  • addMilkAndSugar() 是一个钩子方法,具体子类可以选择性地覆盖该方法。
  • BlackCoffeeMaker 是一个具体子类,实现了 brewCoffee() 方法,制作黑咖啡时只冲泡咖啡,不加牛奶和糖。
  • LatteCoffeeMaker 是另一个具体子类,实现了 brewCoffee() 方法和 addMilkAndSugar() 方法,制作拿铁咖啡时先冲泡浓缩咖啡,然后加入牛奶和糖。
  • Client 在客户端代码中,我们创建了一个黑咖啡机和一个拿铁咖啡机,并调用它们的 makeCoffee() 方法来制作咖啡。由于模板模式的存在,制作咖啡的算法骨架是固定的,但具体的咖啡种类和加料可以由子类来定制。

标签:咖啡,Pattern,void,Class,算法,Template,子类,抽象类,public
From: https://www.cnblogs.com/mysticbinary/p/17680338.html

相关文章

  • Flyweight Pattern —— Creational Class
    享元模式在主流的标准里是放到结构大类下的,但是我感觉这个模式的最终作用也是为了获取一个类,所以我将其划分到创建大类下。WhatisFlyweightPatternFlyweight是指轻量级的。享元模式旨在支持大量细粒度的对象共享,以减少内存消耗。该模式通过共享相似对象的部分状态,来减少对......
  • SpringBoot项目报java.lang.IllegalStateException: Cannot load configuration class
    报错摘要:java.lang.IllegalStateException:Cannotloadconfigurationclass:com.imooc.demo.DemoApplication,Causedby:java.lang.ExceptionInInitializerError:null,Causedby:org.springframework.cglib.core.CodeGenerationException:java.lang.reflect.I......
  • 通过class字节码了解StringBuilder拼接字符串效率高的原因
    挺久没具体去看了,随手记一下吧。Stringstr="";for(inti=0;i<10;i++){str+=i;}这样的拼法,实际上从分析class的字节码来看,是在循环里面newStringBuffer对象,相当的耗。通过这样的分析,给新人解释,是最有效的了。还能提升一些了解java底层知识的兴趣。——《Java编程思......
  • java ClassLoader笔记(一)
    作者:fbysss关键字:ClassLoader一、SunJDKClassloader体系1.层次关系Bootstrap:加载rt.jar<-Extension:加载 jre/ext/*.jar <-System:加载CLASSPATH中的jar<-UserDefined加载用户自定义包类2.特殊点  BootstrapClassLoader为C++所写,ExtensionClassLoader的parent为null,其中......
  • kubernetes存储方案(二):StorageClass的使用
    StorageClass介绍创建StorageClass#catstorageclass-glusterfs.yamlapiVersion:v1kind:Secretmetadata:name:heketi-secretnamespace:defaultdata:key:YWRtaW5rZXk=type:kubernetes.io/glusterfs---apiVersion:storage.k8s.io/v1beta1kind:Storag......
  • 华为云classroom赋能 | Toolkit系列插件DevSecOps助力开发者提速
    一前言DevOps的概念想必大家都不陌生,它是一组过程、方法与系统的统称,通过它可以对交付速率、协作效率、部署频率速率、质量、安全和可靠性等进行提升改善。相比传统的软件开发模式,它是一种工作方式和文化的转变,把开发者和IT运营人员衔接起来,紧紧围绕产品生命周期配合,优化改进交付效......
  • 华为云Classroom赋能 | Devstar使应用开发无需从零开始
    华为云DevStar为开发者提供业界主流框架代码初始化能力,通过GUI、API、CLI等多种方式,将按模板生成框架代码的能力推送至用户桌面。同时基于华为云服务资源、成熟的DevOps开发工具链和面向多场景的众多开发模板,提供一站式创建代码仓、自动生成框架代码、创建编译构建、测试、部署等流......
  • 华为云classroom赋能|tookIT助力开发者上云
    对于资深程序员而言,IDE是必不可少的,它好比是剑客手中的宝剑,IDE帮助程序员更快更丝滑的去编程,同时插件就是这把剑上的各种Buff,为宝剑赋能,提供更好的升级打怪体验。什么是HuaweiCloudToolkitHuaweiCloudToolkit中文名是华为云开发者插件,是基于华为云现有能力的一系列插件集合,简单......
  • javaee spring jdbcTemplate的使用
    依赖<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.......
  • RedisTemplate使用文档
    一.Redis五种基本数据类型1.String字符串String的数据结构是简单的Key-Value模型,Value可以是字符串,也可以是数字。应用场景计数器—点赞,视频播放量,每播放一次就+1统计多单位的数量粉丝数对象缓存存储2.Hash散列表Redis的哈希是键值对的集合。Redis的哈希值是字符串......