Template Pattern —— Behavioral Class

这篇具有很好参考价值的文章主要介绍了Template Pattern —— Behavioral Class。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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. 加牛奶和糖(可选)。

其中:文章来源地址https://www.toymoban.com/news/detail-695027.html

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

到了这里,关于Template Pattern —— Behavioral Class的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 模板方法模式(Template Method)

    模板方法模式是一种行为设计模式,在超类中定义了一个算法的框架,而将一些步骤的实现延迟到子类中,使得子类可重定义该算法的特定步骤。 模板方法模式包含如下角色: Abstract ­Class,抽象类,实现一个模板方法,定义了算法的骨架。需要说明的是,算法中的步骤可以

    2024年02月14日
    浏览(97)
  • Strategy Pattern and Polymorphism —— Behavioral Pattern

    策略模式很类似现在多功能的洗衣机,每次在洗衣服之前,都需要由用户自己选择想要的洗衣策略,洗衣机收到指定的洗衣策略后,组合成一份新的算法和数据结构才去执行。 策略模式和状态模式的区别在于使用者对它们的 目的 。 策略模式主要用于实现算法的选择和动态切

    2024年02月12日
    浏览(43)
  • 工厂方法模式【Factory Method Pattern】

    实例化对象,用工厂方法代替new操作(重点) 工厂模式包括工厂方法模式和抽象工厂模式 抽象工厂模式是工厂方法模式的扩展 有一组类似的 对象需要创建 在编码时 不能预见需要创建哪种类的实例 系统需要考虑 扩展性 ,不应依赖于产品类实例如果被创建、组合和表达的细节

    2024年02月12日
    浏览(37)
  • Pytest教程__钩子方法setup、teardown、setup_class、teardown_class(8)

    pytest跳过用例执行的用法与unittest跳过用例大致相同。 pytest跳过用例的方法如下: pytest.mark.skip(reason):无条件用例。reason是跳过原因,下同。 pytest.mark.skipIf(condition, reason):condition为True时跳过用例。 被装饰器@pytest.mark.skip装饰的用例会直接跳过执行,有可选参数reason:跳过的

    2024年02月10日
    浏览(32)
  • Factory Method Pattern 工厂方法模式简介与 C# 示例【创建型】【设计模式来了】

    一句话解释:   实体类和工厂类均为单独实现,不影响已实现的类,方便扩展。 工厂方法模式(Factory Method Pattern)是一种创建型模式,它允许客户端通过工厂方法来创建对象,而不是直接使用构造函数。这样可以让客户端代码更加灵活,同时保持实现的独立性。工厂方法

    2024年02月06日
    浏览(42)
  • springboot如何访问resource目录下的文件,访问不到资源处理方法:class path resource [template.xlsx] cannot be resolved to UR

    class path resource [template.xlsx] cannot be resolved to UR ClassPathResource 可以直接访问到资源文件夹reource,但是为什么提示找不到资源呢,首先我先放出我得代码 示例代码 访问不到资源处理方法: 报错:class path resource [template.xlsx] cannot be resolved to UR 于是我检查target文件是否存在编译后

    2024年02月09日
    浏览(43)
  • Java的反射应用(Method和Class)

    记录 :473 场景 :使用java.lang.reflect.Method和java.lang.Class类,根据Java反射原理实现使用指定字符串类名和方法名称,调用对应对象和对应方法。 版本 :JDK 1.8。 1.使用Java反射调用指定类的指定方法 (1)参数说明 String className, 字符串类型,需反射的类的全路径。 String methodName, 字

    2024年02月08日
    浏览(45)
  • Factory Pattern —— Creational Class

    工厂方法模式是比较有 启发 的一个模式,它告诉我们可以通过增加新的对象专门管理“变化”。 例如,我们为了解决new()引起的“变化”,就引入了工厂类型,由新增的工厂类型专门处理new()相关的“变化”,确保客户程序不受这些变化的直接影响。 这个其实就是很典型的

    2024年02月11日
    浏览(38)
  • Prototype Pattern —— Creational Class

    在Java中,Cloneable 接口是一个标记接口(Marker Interface,它们内部都没有方法和属性),实现Cloneable接口表示该对象能被克隆,能使用Object.clone()方法。 要实现克隆功能,需要满足以下两个条件: 类实现了 Cloneable 接口。 在类中重写 clone() 方法。 为了方便记忆,原型模式也叫

    2024年02月11日
    浏览(44)
  • Flyweight Pattern —— Creational Class

    享元模式在主流的标准里是放到结构大类下的,但是我感觉这个模式的最终作用也是为了获取一个类,所以我将其划分到创建大类下。 Flyweight 是指轻量级的。 享元模式旨在支持大量细粒度的对象共享,以减少内存消耗。该模式通过共享相似对象的部分状态,来减少对象的数

    2024年02月10日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包