最新要闻
- 全球观热点:工程建设的范围是什么_工程建设的范围
- 海底捞一门店睡满人导致无法用餐:全是“特种兵”式大学生
- 万物皆有灵下一句是什么_万物皆有灵 全球百事通
- 每日快看:对标《原神》!《王者荣耀世界》新实机画面:蓝BUFF化身寒冰之王
- Uzi老对手官宣转型!LOL“欧成”Rekkles改打辅助
- 快资讯丨苏教版二年级上册数学期中试卷含答案_苏教版二年级上册数学期中试卷
- 当前动态:4999元 荣耀MagicBook 14 GT版上架:RTX 2050独显
- 世界短讯!USB:终于一统江湖
- 视频会议的免费时代:宣告结束了 环球观热点
- 环球新动态:世界第八大奇迹!放假第一天兵马俑游客突破五万人:秦俑打上了保湿抗皱针
- 简讯:椰子怎么喝 椰子怎么喝最好
- 《角斗士》旧情人欣然返场
- 主机用质量模式玩《星球大战绝地》更好?起码可稳30帧 全球热门
- 穿小椰子怎么搭配衣服 穿小椰子鞋如何搭配_全球今日讯
- 最新:男子服务区买15元汉堡只有2片面包 老板:你不要我退钱
- 九号平衡车L8奥特曼定制版发布:首发1799元 可触发彩蛋
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
世界快看点丨【模板方法设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
(资料图)
简介
模板方法模式(Template Method Pattern)也叫模板模式,是一种行为型模式。它定义了一个抽象公开类,包含基本的算法骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤。不同的子类以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。以此基于公共的模板,来实现实现不同的功能。
模板模式适用于一些复杂操作进行步骤分割、抽取公共部分由抽象父类实现、将不同的部分在父类中定义抽象实现、而将具体实现过程由子类完成。对于有多个子类具有共有的方法,且逻辑相同,可以考虑作为模板方法。
作用
- 相同的部分父类给出统一的模板,子类大量复用,从而节省代码,复用逻辑。
- 封装不变部分,扩展可变部分,行为由父类控制,子类灵活实现,便于维护和扩展。
实现步骤
- 创建一个抽象的模板类,定义基本流程,同时定义一些基本方法供子类去实现。
- 创建多个子类继承抽象模板,覆盖父类的相关动作和方法。
UML
template-pattern.pngJava代码
抽象模板类
// GameTemplate.java 定义抽象模板类,有抽象方法和具体方法public abstract class GameTemplate { // 抽象方法待子类来实现 abstract void init(); abstract void start(); abstract void end(); // 可复用的算法流程 public void play() { System.out.println(this.getClass().getSimpleName() + "::play()"); // 初始化游戏 init(); // 开始游戏 start(); // 结束游戏 end(); }}
具体业务类,继承抽象模板
// Basketball.java 定义子类覆写父类抽象方法public class Basketball extends GameTemplate { @Override void init() { System.out.println("Basketball::init() [Basketball Game Initialized! Start playing.]"); } @Override void start() { System.out.println("Basketball::start() [Basketball Game Started. Enjoy the game!]"); } @Override void end() { System.out.println("Basketball::end() [Basketball Game Finished!]"); }}
// Football.java 定义子类覆写父类抽象方法public class Football extends GameTemplate { @Override void init() { System.out.println("Football::init() [Football Game Initialized! Start playing.]"); } @Override void start() { System.out.println("Football::start() [Football Game Started. Enjoy the game!]"); } @Override void end() { System.out.println("Football::end() [Football Game Finished!]"); }}
// Tennis.java 定义子类覆写父类抽象方法public class Tennis extends GameTemplate { @Override void init() { System.out.println("Tennis::init() [Tennis Game Initialized! Start playing.]"); } @Override void start() { System.out.println("Tennis::start() [Tennis Game Started. Enjoy the game!]"); } @Override void end() { System.out.println("Tennis::end() [Tennis Game Finished!]"); } // 在调用父类play之前,如果要执行自己的行为,也可以覆盖父类方法 // 先执行自己的,再调用父类的方法 @Override public void play() { System.out.println("Tennis::play() [Tennis Game play!]"); super.play(); }}
测试调用
/** * 模板方法模式就是当子类具备类似行为的时候,让子类共用一套流程 * 创建一个公共模板,确定公用流程和操作动作,子类覆盖具体的动作 */ GameTemplate football = new Football(); football.play(); System.out.println("==="); GameTemplate basketball = new Basketball(); basketball.play(); System.out.println("==="); GameTemplate tennis = new Tennis(); tennis.play();
C语言代码
头文件
// func.h
#include #include #include #include #include typedef struct GameTemplate GameTemplate;typedef struct Football Football;typedef struct Basketball Basketball;typedef struct Tennis Tennis;// 定义抽象模板,包括各种动作和公共流程typedef struct GameTemplate{ char name[50]; void (*init)(GameTemplate *game); void (*start)(GameTemplate *game); void (*end)(GameTemplate *game); void (*play)(GameTemplate *game);} GameTemplate;void template_play(GameTemplate *game);GameTemplate *game_template_constructor(char *name);// 定义子类覆写父类抽象方法typedef struct Football{ char name[50]; void (*init)(Football *game); void (*start)(Football *game); void (*end)(Football *game); void (*play)(Football *game);} Football;Football *football_constructor(char *name);// 定义子类覆写父类抽象方法typedef struct Basketball{ char name[50]; void (*init)(Basketball *game); void (*start)(Basketball *game); void (*end)(Basketball *game); void (*play)(Basketball *game);} Basketball;Basketball *basketball_constructor(char *name);// 定义子类覆写父类抽象方法typedef struct Tennis{ char name[50]; void (*init)(Tennis *game); void (*start)(Tennis *game); void (*end)(Tennis *game); void (*play)(Tennis *game);} Tennis;Tennis *tennis_constructor(char *name);
抽象模板类
// game_template.c 定义抽象模板类,有抽象方法和具体方法#include "func.h"// 定义抽象模板类的公共部分,这里用struct替代// 抽象方法待子类来实现void template_init(GameTemplate *game) {}void template_start(GameTemplate *game){ printf("\r\n GameTemplate::start() [GameTemplate Initialized! Start playing.]");}void template_end(GameTemplate *game) {}// 可复用的算法流程void template_play(GameTemplate *game){ printf("\r\n GameTemplate::play() [name=%s]", game->name); // 初始化游戏 game->init(game); // 开始游戏 game->start(game); // 结束游戏 game->end(game);}GameTemplate *game_template_constructor(char *name){ // printf("\r\n game_template_constructor() [构建GameTemplate]"); GameTemplate *game = (GameTemplate *)malloc(sizeof(GameTemplate)); strcpy(game->name, name); game->init = &template_init; game->start = &template_start; game->end = &template_end; game->play = &template_play; return game;}
具体业务类,继承抽象模板
// basketball.c 定义子类覆写父类抽象方法#include "func.h"// 定义子类覆写父类抽象方法void basketball_init(Basketball *game){ printf("\r\n Basketball::init() [Basketball Game Initialized! Start playing.]");}void basketball_start(Basketball *game){ printf("\r\n Basketball::start() [Basketball Game Started. Enjoy the game!]");}void basketball_end(Basketball *game){ printf("\r\n Basketball::end() [Basketball Game Finished!]");}Basketball *basketball_constructor(char *name){ printf("\r\n basketball_constructor() [构建Basketball]"); GameTemplate *template = game_template_constructor(name); Basketball *game = (Basketball *)template; game->init = &basketball_init; // 如果不覆盖则使用基类的函数 // game->start = &basketball_start; game->end = &basketball_end; return game;}
// football.c 定义子类覆写父类抽象方法#include "func.h"// 定义子类覆写父类抽象方法void football_init(Football *game){ printf("\r\n Football::init() [Football Game Initialized! Start playing.]");}void football_start(Football *game){ printf("\r\n Football::start() [Football Game Started. Enjoy the game!]");}void football_end(Football *game){ printf("\r\n Football::end() [Football Game Finished!]");}Football *football_constructor(char *name){ printf("\r\n football_constructor() [构建Football]"); GameTemplate *template = game_template_constructor(name); Football *game = (Football *)template; game->init = &football_init; game->start = &football_start; game->end = &football_end; return game;}
// tennis.c 定义子类覆写父类抽象方法#include "func.h"// 定义子类覆写父类抽象方法void tennis_init(Tennis *game){ printf("\r\n Tennis::init() [Tennis Game Initialized! Start playing.]");}void tennis_start(Tennis *game){ printf("\r\n Tennis::start() [Tennis Game Started. Enjoy the game!]");}void tennis_end(Tennis *game){ printf("\r\n Tennis::end() [Tennis Game Finished!]");}// 在调用父类play之前,如果要执行自己的行为,也可以覆盖父类方法void tennis_play(Tennis *game){ // 先执行自己的内容,再调用基类的函数 printf("\r\n Tennis::play() [Tennis Game Play!]"); template_play((GameTemplate *)game);}Tennis *tennis_constructor(char *name){ printf("\r\n tennis_constructor() [构建Tennis]"); GameTemplate *template = game_template_constructor(name); Tennis *game = (Tennis *)template; game->init = &tennis_init; game->start = &tennis_start; game->end = &tennis_end; game->play = &tennis_play; return game;}
测试调用
#include "../src/func.h"int main(void){ printf("test start:\r\n"); /** * 模板方法模式就是当子类具备类似行为的时候,让子类共用一套流程 * 创建一个公共模板,确定公用流程和操作动作,子类覆盖具体的动作 */ Football *football = football_constructor("football"); football->play(football); printf("\r\n ==="); Basketball *basketball = basketball_constructor("basketball"); basketball->play(basketball); printf("\r\n ==="); Tennis *tennis = tennis_constructor("basketball"); tennis->play(tennis);}
更多语言版本
不同语言设计模式源码:https://github.com/microwind/design-pattern
关键词:
-
世界快看点丨【模板方法设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
简介模板方法模式(TemplateMethodPattern)也叫模板模式,是一种行为型模式。它定义了一个抽象公开类,包
来源: 世界快看点丨【模板方法设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
全球观热点:工程建设的范围是什么_工程建设的范围
海底捞一门店睡满人导致无法用餐:全是“特种兵”式大学生
[0基础学R语言] 软件下载与环境配置_天天热点
焦点!15 设备类型与设备驱动
万物皆有灵下一句是什么_万物皆有灵 全球百事通
每日快看:对标《原神》!《王者荣耀世界》新实机画面:蓝BUFF化身寒冰之王
Uzi老对手官宣转型!LOL“欧成”Rekkles改打辅助
快资讯丨苏教版二年级上册数学期中试卷含答案_苏教版二年级上册数学期中试卷
当前动态:4999元 荣耀MagicBook 14 GT版上架:RTX 2050独显
世界短讯!USB:终于一统江湖
视频会议的免费时代:宣告结束了 环球观热点
环球新动态:世界第八大奇迹!放假第一天兵马俑游客突破五万人:秦俑打上了保湿抗皱针
世界资讯:ssti注入
简讯:椰子怎么喝 椰子怎么喝最好
《角斗士》旧情人欣然返场
主机用质量模式玩《星球大战绝地》更好?起码可稳30帧 全球热门
MySQL常用数据库语句 天天观天下
穿小椰子怎么搭配衣服 穿小椰子鞋如何搭配_全球今日讯
最新:男子服务区买15元汉堡只有2片面包 老板:你不要我退钱
九号平衡车L8奥特曼定制版发布:首发1799元 可触发彩蛋
赛力斯2022年营收翻倍:问界M5/M7立大功
当前滚动:xss-labs靶场
男人对你说子非鱼是什么意思_子非鱼是什么意思
飞利浦推出新款24.5寸游戏显示器:280Hz高刷、0.5ms极速响应|全球观速讯
速读:14 进程的等待与唤醒机制
【环球新视野】基于python实现将AWS-ElastiCache-的Reserved_Cache_Nodes-预留节点及费用的信息统计
traefik网关的https上游配置_微速讯
五一档新片总票房突破4亿 《长空之王》1.7亿拔得头筹 环球即时
世界报道:红魔二代骁龙8平板来了:144Hz 2.8K屏、12000mAh大电池
“赏花游”“农舍游”成为开启乡村振兴的“金钥匙”
【报资讯】浅谈 LIS 问题的几种做法
自驾游成五一出行新亮点 不少小众游目的地热度上升 最资讯
五一12万人涌入淄博 专家称淄博烧烤一时好不代表长效好_世界播报
女顾客点外卖备注科一95 热心肠骑手慌了:闹出乌龙
天天短讯!30天无理由退换 鼎能电蚊拍9.9元狂促:安全不电人、纯物理灭蚊
P6818 [PA2013]Działka 题解_环球报道
【聚看点】正负值-28全场最差!G6汤神勇不再 卫冕冠军陷入绝境
环球快看:取代C++!微软改用Rust语言重写Win11内核:简洁安全、性能更佳
Python 基于win32com客户端实现Excel操作 讯息
14 进程调度
美SpaceX火箭发射推迟:发射台遭多道闪电击中 画面曝光_当前通讯
美国一学校限制使用男女孩称呼 以分泌精子和卵子的人代替
磁吸免布线:Yeelight充电人体感应灯9元狂促
6月9日上映!《变形金刚7:超能勇士崛起》新海报:擎天柱猩猩队长联手
天天快播:【环球财经】英国3月份商用汽车产量下跌3%
自己创作一首现代诗歌范文_自己创作一首现代诗
环球热推荐:喊话多生孩子防文明崩溃的马斯克突然变脸了 网友抨击:幻想破灭
仰望红绿灯起步加速果然快 痛击自家兄弟比亚迪汉EV 每日资讯
手把手教你高铁上点外卖 能送到座位的那种
日常168元 AL无火香薰1.1折清仓 实付19元(杭州亚运会供应商)-新资讯
银护拯救漫威_全球快讯
天天快消息!《火炬之光》无限白煞获得方法
13 进程
【环球财经】纽约金价28日微涨0.01%
全球今头条!【环球财经】芝加哥农产品期价28日全线上涨
5月新规来了!互联网广告新限制:关闭弹出广告不得经两次以上点击
北京高考满分作文:制约与发展 吉林高考满分作文:风采的小李
RabbitMQ 实现消息队列延迟
csv用Excel打开出现乱码
《新哥斯拉》导演新作《新奥特曼》曝光造型,一个经典设定被取消-环球新要闻
《王者荣耀》妲己九尾狐皮肤被吐槽:有人花了1200元才抽中_天天时讯
没5G 华为手机销量暴涨41%!为何这么多人买4G华为手机
五一旅游高峰人从众景点再现!网友:堵住我的车 堵不住我的腿|全球快资讯
【新华解读】“互换通”正式落地!释放外资参与境内衍生品潜力 促进金融市场稳健开放 环球时讯
深中通道伶仃洋大桥合龙
1799元起 小米电视A55/A65竞技版上架:4K 120Hz高刷屏
今日快讯:米哈游《崩坏:星穹铁道》上线腾讯START云游戏:三端互通、无需下载
全球最资讯丨杭州小伙开法拉利炸街被阿姨当场教育?反转再反转
著名演员李建华去世 网友痛心:陪伴整个童年|天天热讯
更加流畅!小米13、小米平板6升级安卓14了:新系统正测试
学系统集成项目管理工程师(中项)系列14_采购管理
【环球速看料】海关首次截获外来物种巴尔干锯螽斯
微资讯!堵堵堵!五一前各地交通压力攀升:多地明确外地车轻微违章不处罚
汤唯二封百想影后:凭借《分手的决心》站上舞台
淘宝百亿补贴现iPhone 14 Pro Max全网最低价!256GB跌破8K:比官网便宜近2千
Reddit“股吧”散户疯炒香港券商 日内涨幅一度达到1100%
【世界报资讯】Unsorted_bin_UAF
最新资讯:gin自定义中间件解决requestBody不可重复读问题
天天热头条丨win10更改默认浏览器失败_win10更改默认浏览器
天涯死了!死在越来越功利的互联网手上
锐龙6900HX仅3399元!华硕联名迷你主机发布:支持DDR5 双USB 4
8核Zen4+最强核显 AOKZOE掌机众筹:2TB版干到8000元以上
各家都在卷的Mini主机 到底是想赚谁口袋里的钱? 今日讯
世界视点!45颗北斗卫星在轨 我国境内支持北斗的智能手机超3亿部
莎琪丽/sakinre是哪个国家的品牌_什么档次怎么样
高洲原酒和李庄酒哪个好_高洲原酒-环球快消息
图解西子洁能一季报:第一季度单季净利润同比减38.88%
天祝县开展“五一”节前民生保障和假期安全生产督导检查
环球新消息丨五一长假已开启 网友对调休不满 专家称调休式放假更包容更弹性
富士X-T5等四款相机发布最新固件:提升拍摄稳定性
宋慧乔凭《黑暗荣耀》获百想视后:我得奖了妍珍呐! 环球消息
每日短讯:在rt三角形abc中角c等于90度ac等于3bc等于4 在rt三角形abc中角c等于90度
【性能】JDK和Jmeter的安装与配置|每日热门
【金融街发布】央行推重磅新规 “北向互换通” 即日起施行
热点在线丨广州成立青年创新创业税务服务工作站,减轻双创青年办税缴费负担
睡觉前千万别做这件事!伤身又伤心 你肯定“中枪”过
欧媒:金砖国家重塑全球政经秩序|世界要闻
中国进出口银行绿色信贷余额超4500亿元_世界今亮点
《圣斗士星矢》真人电影抢先看:星矢大战不死鸟一辉!特效华丽