首页 > 其他分享 >模板方法模式

模板方法模式

时间:2024-06-08 20:30:41浏览次数:22  
标签:子类 Game 模式 算法 方法 模板

什么是模板方法模式

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

在模板方法模式中,有一个抽象类定义了一个模板方法,该方法定义了算法的步骤序列,并且其中的一些步骤可以由子类来实现。模板方法模式还可以定义一些抽象的钩子方法,子类可以选择性地重写这些方法。

模板方法模式的核心思想是将不变的算法结构固定在父类中,将可变的实现细节延迟到子类中。这样做的好处是可以避免代码的重复,提高代码的复用性和可维护性。

模板方法模式在实际应用中广泛使用,例如在框架和库中定义通用的算法骨架,以及在编程中使用的一些设计模式,如工厂方法模式和观察者模式等,都可以使用模板方法模式来实现。

什么时候使用模板方法模式

  1. 当有一组相关的算法步骤,其中一些具体实现可能会在不同的子类中有所不同时。
  2. 当希望将算法的结构代码和具体实现代码分离开,以便于维护和扩展时。
  3. 当希望在不改变算法结构的前提下,可以通过子类来改变具体实现细节时。

通过使用模板方法模式,可以将共同的算法步骤放在抽象类中的模板方法中实现,而将具体实现细节交给子类来实现。

模板方法模式应用场景

  1. 有几个步骤的算法或操作,且这些步骤的执行顺序是固定的,但每个步骤的具体实现可能有所不同。
  2. 所有的子类都需要遵循相同的算法或操作流程,但允许子类根据需要重写某些步骤的具体实现。
  3. 需要在不修改算法或操作流程的情况下,对其中的某些步骤进行扩展或修改。

例如,可以使用模板方法模式来实现一个冲饮料的流程。整个流程包括烧开水、冲泡、添加调料等步骤。不同的饮料(如咖啡、茶等)在这些步骤的具体实现上可能有所不同。使用模板方法模式,可以定义一个抽象类作为模板,其中包含了烧开水、冲泡、添加调料等步骤,并定义了一个模板方法,该方法按照固定的顺序调用这些步骤。不同的饮料可以继承这个抽象类,并重写其中的某些步骤以实现特定的功能。这样就可以保证整个冲饮料的流程是固定的,但每种饮料的具体实现可以有所不同。

代码示例

abstract class Game {
    abstract void initialize();
    abstract void startPlay();
    abstract void endPlay();

    // 模板方法
    public final void play() {

        // 初始化游戏
        initialize();

        // 开始游戏
        startPlay();

        // 结束游戏
        endPlay();
    }
}

class Cricket extends Game {

    @Override
    void initialize() {
        System.out.println("Cricket Game Initialized! Start playing.");
    }

    @Override
    void startPlay() {
        System.out.println("Cricket Game Started. Enjoy the game!");
    }

    @Override
    void endPlay() {
        System.out.println("Cricket Game Finished!");
    }
}

class Football extends Game {

    @Override
    void initialize() {
        System.out.println("Football Game Initialized! Start playing.");
    }

    @Override
    void startPlay() {
        System.out.println("Football Game Started. Enjoy the game!");
    }

    @Override
    void endPlay() {
        System.out.println("Football Game Finished!");
    }
}

public class TemplateMethodPatternDemo {
    public static void main(String[] args) {

        Game game = new Cricket();
        game.play();
        System.out.println();

        game = new Football();
        game.play();
    }
}

在这个例子中,Game 是一个抽象类,其中定义了一个模板方法 play,该方法封装了一系列具体方法的调用顺序。具体的游戏类 CricketFootball 继承自 Game,并实现了相应的具体方法。

运行 TemplateMethodPatternDemo 类将输出以下内容:

Cricket Game Initialized! Start playing.
Cricket Game Started.  Enjoy the game!
Cricket Game Finished!

Football Game Initialized! Start playing.
Football Game Started. Enjoy the game!
Football Game Finished!

模板方法模式在这个例子中的应用是,在 Game 类中定义了一个模板方法 play,该方法规定了游戏的基本流程。具体的游戏类可以根据自身的需要来实现不同的方法,从而实现不同的游戏玩法。

总结

     

模板方法模式是一种行为型设计模式,它定义了一个算法的骨架,将一些步骤的具体实现延迟到子类中。模板方法模式提供了一种框架,使得子类可以按照自己的需求实现某个算法的细节,同时保持算法的整体结构不变。

模板方法模式的主要特点是:

  1. 定义了一个抽象类,其中包含了一个或多个抽象方法和一个模板方法。抽象方法由子类实现,模板方法是一个具体方法,定义了算法的骨架,其中调用了抽象方法。

  2. 模板方法将算法的整体流程固定下来,但具体的实现可以由子类自由选择和扩展。子类可以通过实现抽象方法来定义算法中的细节部分。

  3. 模板方法模式的核心思想是封装变化,在抽象类中定义算法的结构,在子类中实现算法的细节,从而使得算法的结构稳定,细节可以自由变化。

  4. 模板方法模式提供了一种非常灵活的扩展机制。可以通过增加抽象方法和钩子方法来扩展算法的功能,而不需要修改已有的算法结构。

  5. 模板方法模式也可以用于解决代码复用的问题。将一些通用的代码放在模板方法中,不同的子类可以共享这些代码。

标签:子类,Game,模式,算法,方法,模板
From: https://blog.csdn.net/Flying_Fish_roe/article/details/139379604

相关文章

  • 设计模式-外观模式
    什么是外观模式    外观模式(FacadePattern)是一种结构型设计模式,它提供了一个简单统一的接口,用于访问复杂子系统中的一组接口。外观模式通过隐藏系统的复杂性,向客户端提供一个简化的接口,使得客户端更容易使用系统。它可以将一组复杂的类和子系统封装在一个外观类中,通过......
  • [方法论]再论如何读书——对过去阅读的总结与对未来的要求
    前言陆爻齐在以前曾花心思读了不少关于“如何阅读”这个主题的书,有时对某条表示“顿悟”,然后做了几次就往在一边,什么笔记法啊,阅读法啊,大多十分的繁杂,连把整个流程走完一边都十分繁琐无聊,坚持下去于陆爻齐而言就是天方夜谭。在偶然瞥见某篇文章时,突然又有所顿悟,希望能把这个简单的......
  • 最优阈值的确定方法(详细解释,通俗易懂)
            上一篇文章我们提到,查全率和查准率是一对矛盾的度量,那在实际的应用中怎么选取一个合适的值去平衡这两个度量,这里我们介绍三种方法,这个值就叫做最优阈值。1.方法一:选择平衡点      我们看下图        如图一中所示,Threshold就是阈值,Precision......
  • 无人机遥感在农林信息提取中的实现方法与GIS融合应用
    在新一轮互联网信息技术大发展的现今,无人机、大数据、人工智能、物联网等新兴技术在各行各业都处于大爆发的前夜。为了将人工智能方法引入农业生产领域。首先在种植、养护等生产作业环节,逐步摆脱人力依赖;在施肥灌溉环节构建智慧节能系统;在产量预测和商品定价生产管理环节提高效......
  • 【模板】单源最短路径(Dijkstra + 堆优化)
    #include<iostream>#include<queue>usingnamespacestd;constintinf=2147483647;constintMAXX=2e5+11;intn,m,s,cnt;intdis[MAXX];intto[MAXX],nxt[MAXX],val[MAXX],h[MAXX];boolvis[MAXX];structnode{intv,w;friendbool......
  • 仅主机模式下无网配置ISO本地yum源,实现无网下载
            仅主机:虚拟机网络环境中的一种,一般认为仅主机模式下是不能联网的,不能和外网通信。实际上仅主机模式是可以连接外网的,只是配置比较麻烦,相比于桥接模式和NAT模式操作更加繁琐。        接下来,我们就说说怎么配置本地yum源。(我使用的是CentOS7)  ......
  • 常用字符串与数组方法学习
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title><......
  • 面向可再生能源的微电网电能质量特点分析与综合评价方法研究---matlab论文复现
      微电网已成为智能电网建设中的重要组成部分,是可再生能源等分布式电源接入电网的有效方式。微电网电能质量客观科学的综合评价对于微电网的运营建设具有重要的现实意义和指导价值。基于微电网中电能质量的特点进行分析,提出了一种新的适合于微电网电能质量的评价方法。首先,......
  • 本地部署GLM-4-9B清华智谱开源大模型方法和对话效果体验
    GLM-4-9B是清华大学和智谱AI推出的最新一代预训练模型GLM-4系列中的开源版本。在语义、数学、推理、代码和知识等多方面的数据集测评中,GLM-4-9B及其人类偏好对齐的版本GLM-4-9B-Chat均表现出较高的性能,其通用能力评测结果甚至超越了Llama-3-8B开源大模型,多模态版本也与GPT-4版本齐......
  • 【Rust】——面向对象设计模式的实现
     ......