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

JAVA设计模式-模板模式

一.概念

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

​ 使用了JAVA的继承机制,在抽象类中定义一个模板方法,该方法引用了若干个抽象方法(由子类实现)或具体方法(子类可以覆盖重写);

​ 其实就是JAVA的继承以及抽象方法、重写覆盖的使用;

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

二.角色

  • AbstractClass(抽象模板):定义了一个模板方法和若干抽象方法和具体方法,

  • ConcreteClass(具体模板):继承抽象模板类并实现抽象方法

三.优缺点

1.优点
  • 封装不变部分,扩展可变部分。
  • 提取公共代码,便于维护。
  • 行为由父类控制,子类实现。
2.缺点
  • 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

四.适用场景

  • 多个子类有公有的方法,而且逻辑基本相同时.

  • 重要,复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能由各个子类实现.

  • 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,庵后通过函数约束其行为。

五.模板模式实现

1.场景

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

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

2.创建一个抽象类

它的模板方法被设置为 final。

public abstract class Game {abstract void initialize();abstract void startPlay();abstract void endPlay();//模板public final void play(){//初始化游戏initialize();//开始游戏startPlay();//结束游戏endPlay();}
}
3.创建扩展的子类
Cricket 类
public class Cricket extends Game {@Overridevoid endPlay() {System.out.println("Cricket Game Finished!");}@Overridevoid initialize() {System.out.println("Cricket Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Cricket Game Started. Enjoy the game!");}
}
Football 类
public class Football extends Game {@Overridevoid endPlay() {System.out.println("Football Game Finished!");}@Overridevoid initialize() {System.out.println("Football Game Initialized! Start playing.");}@Overridevoid startPlay() {System.out.println("Football Game Started. Enjoy the game!");}
}
4.测试
public class TemplatePatternDemo {public static void main(String[] args) {Game game = new Cricket();game.play();System.out.println();game = new Football();game.play();      }
}

http://www.lryc.cn/news/189646.html

相关文章:

  • day007
  • Spring Boot项目在Windows上的自启动策略与Windows自动登录配置
  • mac 版hadoop3.2.4 解决 Unable to load native-hadoop library 缺失文件
  • mysql case when 不命中缓存
  • 2023年金九银十网络安全考试试题
  • JS 图片的左右切换
  • 什么是Python虚拟环境?
  • 知识增强语言模型提示 零样本知识图谱问答10.8+10.11
  • Linux编译FFmpeg
  • Netty深入浅出Java网络编程学习笔记(二) Netty进阶应用篇
  • 机器学习基础之《回归与聚类算法(1)—线性回归》
  • 如何实现制造业信息化转型?
  • stable diffusion艰难炼丹之路
  • 竞赛 深度学习 opencv python 实现中国交通标志识别
  • 用Python实现数据透视表、音频文件格式转换
  • java枚举中写抽象方法
  • 麒麟操作系统提示“默认密钥环已上锁”的解决办法
  • 云原生周刊:Docker 推出 Docker Debug | 2023.10.9
  • 设计模式 - 行为型模式考点篇:迭代器模式(概述 | 案例实现 | 优缺点 | 使用场景)
  • Spark任务优化分析
  • 最新数据库流行度最新排名(每月更新)
  • Python:如何在一个月内学会爬取大规模数据
  • K8S云计算系列-(4)
  • 【Mybatis源码】IDEA中Mybatis源码环境搭建
  • VUE如何使得大屏自适应的几种方法?
  • API接口安全运营研究(内附官方开发平台api接口接入方式)
  • 信钰证券:股票交易费用计算方法?
  • 通过js获取用户网络ip地址
  • 微信小程序wxml使用过滤器
  • 内网渗透面试问题