当前位置: 首页 > news >正文

模板模式【Java设计模式】

模板模式【Java设计模式】

  • 前言
  • 推荐
  • 模板模式
    • 1介绍
    • 2 实现
  • 最后

前言


2022/9/25 16:16
2022/9/25 18:30
路漫漫其修远兮,吾将上下而求索


本文是根据袁庭新老师学习所做笔记

仅供学习交流使用,转载注明出处


推荐

袁庭新老师-视频:【Java设计模式】23种Java设计模式,全网最全精讲版本,熬夜爆肝也要学完【10:06:48】

狂神老师-笔记:设计模式【java提高】

模板模式

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

1介绍

意图: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变—个算法的结构即可重定义该算法的某些特定步骤。

**主要解决:**一些方法通用,却在每一个子类都重新写了这一方法。

**何时使用:**有一些通用的方法。

**如何解决:**将这些通用算法抽象出来。

**关键代码:**在抽象类实现,其他步骤在子类实现。

应用实例:

1.在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。

2.西游记里面菩萨定好的81难,这就是一个顶层的逻辑骨架。

3.Spring中对Hibernate的支持,将一些已经定好的方法封装起来,比如开启事务、获取Session,关闭Session等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。

优点:

1.封装不变部分扩展可变部分。

2.提取公共代码,便于维护。

3.行为由父类控制,子类实现。

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

使用场景:

1.有多个子类共有的方法,且逻辑相同。

2.重要的、复杂的方法,可以考虑作为模板方法。

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

2 实现

我们将创建一个定义操作的Game抽象类,其中,模板方法设置为final,这样它就不会被重写。Cricket和Football是扩展了Game的实体类,它们重写了抽象类的方法。

TemplatePatternDemo,我们的演示类使用Game来演示模板模式的用法。

0406

1.创建一个项目名称为template_pattern的Java项目。

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

package com.js;

/**
 * 表示游戏的模板类(方法有具体的子类完成)
 * 定义成抽象类
 */
 //当前类如果还想实现其他的父类,扩展将会违背单继承
public abstract class Game {
    //游戏初始化
    public abstract void initialize();
    //开始游戏
    public abstract void startPlay();
    //结束游戏
    public abstract void endPlay();

    //定义游戏操作方法(模板方法),当前的方法不被子类重写
    public final void play(){
        initialize();
        startPlay();
        endPlay();
    }

}

3.创建游戏的实现类

package com.js;

/**
 * 板球运动
 */
public class Cricket extends Game{
    @Override
    public void initialize() {
        System.out.println("板球游戏开始初始化...");
    }

    @Override
    public void startPlay() {
        System.out.println("板球游戏正在执行中...");
    }

    @Override
    public void endPlay() {
        System.out.println("板球游戏结束!");
    }
}

package com.js;

/**
 * 足球运动
 */
public class FootBall extends Game{
    @Override
    public void initialize() {
        System.out.println("足球游戏初始化...");
    }

    @Override
    public void startPlay() {
        System.out.println("足球游戏正在执行中...");
    }

    @Override
    public void endPlay() {
        System.out.println("足球游戏结束!");
    }
}

4.创建客户端

package com.js;

public class TemplatePatternDemo {
    public static void main(String[] args) {
       Game game = new FootBall();
       game.play();

        Game game1 = new Cricket();
        game1.play();
    }
    
}

5.结果

足球游戏初始化...
足球游戏正在执行中...
足球游戏结束!
板球游戏开始初始化...
板球游戏正在执行中...
板球游戏结束!

最后


2022/9/25 18:53


p14


Markdown 2322 字数 198 行数
HTML 2034 字数 113 段落


相关文章:

  • openGL 材质
  • windows 10 局域网设置固定 IP 地址
  • Python之猜数字游戏
  • Python 程序的输出 | 第十套(异常处理)
  • 【Android入门】8、Service 后台线程、多线程、IntentService
  • 面向医学图像语义分割-MedISeg
  • puzzle(017.9)HueBots
  • SIM卡被锁怎么办
  • 腾讯云服务器有那么多的型号标准型,计算型,内存型等等,到底该如何选择?
  • 【Android入门】6、ContentProvider:跨程序的数据共享:访问其他 App、被其他 App 访问
  • 文献学习(part102-A)--Autoencoders
  • SS-Model【6】:U2-Net
  • 创新战略|工业企业如何应对颠覆式变革带来的挑战?
  • HashMap不安全后果及ConcurrentHashMap线程安全原理
  • 22_access 阶段
  • 【刷算法】从上往下打印二叉树
  • ➹使用webpack配置多页面应用(MPA)
  • EOS是什么
  • extract-text-webpack-plugin用法
  • js数组之filter
  • Median of Two Sorted Arrays
  • npx命令介绍
  • Object.assign方法不能实现深复制
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • PHP那些事儿
  • Python_网络编程
  • 删除表内多余的重复数据
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (C#)一个最简单的链表类
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (Matlab)使用竞争神经网络实现数据聚类
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (转)ORM
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .Net Core 中间件验签
  • .net FrameWork简介,数组,枚举
  • .net Signalr 使用笔记
  • .net Stream篇(六)
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .Net6 Api Swagger配置
  • .net开发引用程序集提示没有强名称的解决办法
  • .net实现客户区延伸至至非客户区
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • ??在JSP中,java和JavaScript如何交互?
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下