首页 > 其他分享 >模板模式(Template Pattern)

模板模式(Template Pattern)

时间:2023-05-17 22:46:57浏览次数:38  
标签:Cricket Pattern void Football game Game Template 模板

模板模式

一、介绍

  模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

  • 意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
  • 主要解决:一些方法通用,却在每一个子类都重新写了这一方法。
  • 何时使用:有一些通用的方法。
  • 如何解决:将这些通用算法抽象出来。
  • 关键代码:在抽象类实现,其他步骤在子类实现。

二、优缺点

2.1 优点

  1. 封装不变部分,扩展可变部分。
  2. 提取公共代码,便于维护。
  3. 行为由父类控制,子类实现。

2.2 缺点

  1. 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

三、使用场景

  1. 有多个子类共有的方法,且逻辑相同。
  2. 重要的、复杂的方法,可以考虑作为模板方法。

注意事项:为防止恶意操作,一般模板方法都要加上final关键词。

四、具体实现

1、创建一个抽象类,它的模板方法被设置为 final。

/**
 * 模板设计模式 game抽象类
 *
 * @author zt1994 2021/4/3 15:41
 */
public abstract class AbstractGame {

    /**
     * 初始化游戏
     */
    abstract void initialize();

    /**
     * 开始游戏
     */
    abstract void startPlay();

    /**
     * 结束游戏
     */
    abstract void endPlay();

    /**
     * 模板 final实现
     */
    public final void play() {
        initialize();

        startPlay();

        endPlay();
    }
}

2、创建扩展了上述类的实体类。

/**
 * Cricket实体类
 *
 * @author zt1994 2021/4/3 15:42
 */
public class Cricket extends AbstractGame {

    @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!");
    }
}

/**
 * Football实体类
 *
 * @author zt1994 2021/4/3 15:43
 */
public class Football extends AbstractGame {

    @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!");
    }
}

3、使用 Game 的模板方法 play() 来演示游戏的定义方式。

/**
 * 模板模式测试类
 *
 * @author zt1994 2021/4/3 15:44
 */
public class TemplatePatternTest {

    public static void main(String[] args) {
        AbstractGame game = new Cricket();
        game.play();
        System.out.println("------");
        game = new Football();
        game.play();
    }
}

4、测试结果

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!

标签:Cricket,Pattern,void,Football,game,Game,Template,模板
From: https://www.cnblogs.com/zt19994/p/17410558.html

相关文章

  • 组合模式(Composite Pattern)
    组合模式一、概述  组合模式(CompositePattern):组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。二、介绍......
  • 策略模式(Strategy Pattern)
    策略模式一、介绍  在策略模式(StrategyPattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。意图:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。主要解决:在有多种算法相似的情况下,使用if...else所带来的复杂和难以维护......
  • SIEMENS/西门子西门子1200plc轴运动控制程序模板 介绍:此
    SIEMENS/西门子西门子1200plc轴运动控制程序模板介绍:此程序是之前给海康威视做的一台装路由器壳子的机器。程序有以下:1):调用轴控制块做的控制3个伺服,2):1个电缸,3):用PUTGET块与上下游plc通讯,4):轴控制块5):气缸报警块6):完整的电路图7):威纶通触摸屏程序8):IO表程序块已经在很多个项......
  • opencv模板匹配
    opencv模板匹配  读取图像并转换为灰度图像。 importcv2#读取图像img=cv2.imread('template.jpg')#转换为灰度图像gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 检测关键点并绘制矩形框。 #使用SIFT算法检测关键点......
  • 【BZOJ4241】【回滚莫队模板题】历史研究
    Description给定一个序列,每次询问区间[l,r][l,r]内,所有权值与其出现次数的乘积的最大值。Solution回滚莫队模板题。将询问以左端点所在块为第一关键字,右端点为第......
  • 企业级项目模板的配置与集成(Vite + Vue3 + TypeScript)
    企业级项目模板的配置与集成(Vite+Vue3+TypeScript)1、项目介绍项目使用:eslint+stylelint+prettier来对我们代码质量做检测和修复。需要使用husky来做commit拦截需要使用commitlint来统一提交规范需要使用preinstall来统一包管理工具。2、环境准备nodev16.14.2pnp......
  • P3919 【模板】可持久化线段树 1(可持久化数组) 题解
    一、题目描述:维护这样的一个长度为$n$的数组,支持以下两种操作$1$:在某个历史版本上修改某一个位置上的值$2$:访问某个历史版本上的某一位置的值每进行一次操作,就会生成一个新的版本(对于操作2,生成的就是一个完全一样的版本)。版本编号即为当前操作......
  • 离散化模板
    https://www.acwing.com/problem/content/description/804/#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#include<vector>usingnamespacestd;typedefpair<int,int>PII;constintN=300010;/......
  • LG P5410 【模板】扩展 KMP(Z 函数)
    \(\text{template}\)注意z[1]=n,从下标\(2\)开始求z!!\(\text{Code}\)#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;constintN=2e7+5;intz[N],p[N],n,m;chara[N],b[N];voidgetZ(char*s,intn,int*z){for(......
  • Python多线程并发通用模板
    多线程可以同时处理多个任务,支持并发处理,从而提高系统的并发能力。多线程爬虫的好处主要有提高爬取效率、提高稳定性、节省资源等。总之,多线程爬虫可以提高爬取效率、稳定性和资源利用率,是一种更加高效、可靠的爬虫实现方式。多线程爬虫并行可以提高爬虫的效率,具体实现方法如下:......