首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >详解设计模式:模版方法模式

详解设计模式:模版方法模式

作者头像
栗筝i
发布于 2022-12-05 00:29:17
发布于 2022-12-05 00:29:17
59700
代码可运行
举报
文章被收录于专栏:迁移内容迁移内容
运行总次数:0
代码可运行

模板方法模式(Template Method Pattern)也被称为模板模式(Template Pattern),是在 GoF 23 种设计模式中定义了的行为型模式。 模板方法模式 定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 ~ 本片文章内容包括:关于模版方法模式、观察者模式 Demo、模版方法模式的应用(InputStream 中的模版方法模式)


文章目录


一、关于模版方法模式

1、关于模版方法模式

模板方法模式(Template Method Pattern)也被称为模板模式(Template Pattern),是在 GoF 23 种设计模式中定义了的行为型模式。

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

模板方法模式 核心:处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定。因此,我们采用模版方法模式,将这个节点的代码实现转移给子类完成。即:处理步骤在父类中定义好,具体的实现延迟到子类中定义。

2、关于模版方法模式的构成

模版方法模式主要由 2 种角色构成:

  • 抽象类/抽象模板(Abstract Class):负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成
  • 具体子类/具体实现(Concrete Class):实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤
3、关于抽象模板的方法组成

抽象模板类,由一个模板方法和若干个基本方法构成:

模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法;

基本方法:是整个算法中的一个步骤,包含以下几种类型:

  • 抽象方法(abstract method):在抽象类中声明,由具体子类实现;
  • 具体方法(specific method):在抽象类中已经实现,在具体子类中可以继承或重写它;
  • 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。
4、关于模版方法模式的XML
5、关于模版方法模式的使用场景
  • 算法的整体步骤很固定,但其中个别部分易变时,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。
  • 当多个子类存在公共的行为时,可以将其提取出来并集中到一个公共父类中以避免代码重复。首先,要识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
  • 当需要控制子类的扩展时,模板方法只在特定点调用钩子操作,这样就只允许在这些点进行扩展。
6、关于模版方法模式的优缺点

# 模版方法模式的优点

  • 提高代码复用性,它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。
  • 部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。

# 模版方法模式的缺点

  • 对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象,间接地增加了系统实现的复杂度。
  • 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。
  • 由于继承关系自身的缺点,如果父类添加新的抽象方法,则所有子类都要改一遍。

二、观察者模式 Demo

1、Demo 设计

炒菜的步骤是固定的,我们可以将其简化为倒油、热油、下蔬菜、下酱料、翻炒等步骤,现通过模板方法模式来用代码模拟。

Demo 类图如下:

2、Demo 实现

# AbstractClass 抽象模板类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class AbstractClass {
    
    /**
     * 模板方法
     */
    public final void cookProcess() {
        //第一步:倒油
        this.pourOil();
        //第二步:热油
        this.heatOil();
        //第三步:倒蔬菜
        this.pourVegetable();
        //第四步:倒调味料
        this.pourSauce();
        //第五步:翻炒
        this.fry();
    }

    /**
     * 第一步:倒油 具体方法,直接实现
     */
    public void pourOil() {
        System.out.println("倒油");
    }

    /**
     * 第二步:热油 具体方法,直接实现
     */
    public void heatOil() {
        System.out.println("热油");
    }

    /**
     * 第三步:倒蔬菜 抽象方法
     */
    public abstract void pourVegetable();

    /**
     * 第四步:倒调料 抽象方法
     */
    public abstract void pourSauce();

    /**
     * 第五步:翻炒 具体方法,直接实现
     */
    public void fry() {
        System.out.println("翻炒");
    }
}

# ConcreteClass 具体子类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ConcreteClass_BaoCai extends AbstractClass {

    @Override
    public void pourVegetable() {
        System.out.println("下锅的蔬菜是包菜");
    }

    @Override
    public void pourSauce() {
        System.out.println("下锅的酱料是辣椒");
    }
}
public class ConcreteClass_CaiXin extends AbstractClass {

    @Override
    public void pourVegetable() {
        System.out.println("下锅的蔬菜是菜心");
    }

    @Override
    public void pourSauce() {
        System.out.println("下锅的酱料是蒜蓉");
    }
}
3、Demo 测试
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Client {
    public static void main(String[] args) {
        //炒手撕包菜
        ConcreteClass_BaoCai baoCai = new ConcreteClass_BaoCai();
        baoCai.cookProcess();

        //炒蒜蓉菜心
        ConcreteClass_CaiXin caiXin = new ConcreteClass_CaiXin();
        caiXin.cookProcess();
    }
}

三、模版方法模式的应用(InputStream 中的模版方法模式)

InputStream 类就使用了模板方法模式。在 InputStream 类中定义了多个 read() 方法,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class InputStream implements Closeable {
    // 抽象方法,要求子类必须重写
    public abstract int read() throws IOException;

    public int read(byte b[]) throws IOException {
        return read(b, 0, b.length);
    }

	  // 模板方法
    public int read(byte b[], int off, int len) throws IOException {
        if (b == null) {
            throw new NullPointerException();
        } else if (off < 0 || len < 0 || len > b.length - off) {
            throw new IndexOutOfBoundsException();
        } else if (len == 0) {
            return 0;
        }

        int c = read(); //调用了无参的read方法,该方法是每次读取一个字节数据
        if (c == -1) {
            return -1;
        }
        b[off] = (byte)c;

        int i = 1;
        try {
            for (; i < len ; i++) {
                c = read();
                if (c == -1) {
                    break;
                }
                b[off + i] = (byte)c;
            }
        } catch (IOException ee) {
        }
        return i;
    }
}

在 InputStream 父类中已经定义好了读取一个字节数组数据的方法是每次读取一个字节,并将其存储到数组的第一个索引位置,读取 len 个字节数据。具体如何读取一个字节数据呢?由子类实现。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
AI生态暗战升级,科技巨头铁幕下的终极博弈
在美剧《权力的游戏》中,不到终局,主角归属始终成谜。如今的AI行业,正上演着同样扣人心弦的戏码。
科技云报道
2025/04/23
1460
AI生态暗战升级,科技巨头铁幕下的终极博弈
DeepSeek AI:能否成为中文 AI 领域的新领军者?
在全球人工智能竞争日益激烈的背景下,DeepSeek AI 作为一款专注于中文理解和生成的大模型,正在迅速崛起。相较于 OpenAI 的 GPT 系列、Anthropic 的 Claude 以及 Google 的 Gemini,DeepSeek AI 是否能够在中文 AI 领域脱颖而出,成为新的领军者?本文将围绕 DeepSeek AI 的技术实力、优势、挑战及未来发展 进行深入探讨。
远方2.0
2025/03/21
1610
DeepSeek AI:能否成为中文 AI 领域的新领军者?
AI巨头集体放大招!DeepSeek优化、豆包变强、ChatGPT画图不靠DALL·E、Gemini 2.5挑战GPT-5?
3月25日,DeepSeek官方宣布其DeepSeek-V3模型完成了小版本升级,版本号更新为DeepSeek-V3-0324。用户可以通过官方网页、App或小程序访问对话界面,关闭“深度思考”功能以体验新版模型。API接口和使用方式保持不变。
福大大架构师每日一题
2025/03/31
2730
AI巨头集体放大招!DeepSeek优化、豆包变强、ChatGPT画图不靠DALL·E、Gemini 2.5挑战GPT-5?
Claude 4 系列 Opus 4 与 Sonnet 4正式发布:Claude 4新特性都有哪些?
随着 Claude 4 系列(Opus 4 与 Sonnet 4)的正式发布,Anthropic 把自家大模型从“会聊天”推进到“能当自主代理”──不仅推理更深、上下文更长,还内置代码执行、多模态理解、工具调用等一揽子全新能力;同时,它已在 GitHub Copilot、Amazon Bedrock 与 Google Vertex AI 等平台同步上线,并在多项基准上刷新行业纪录。本文按“先鸟瞰,再拆解”的思路,带你一次看懂 Claude 4 的全部新特性、性能参数、生态落地与迁移要点。
猫头虎
2025/05/25
3.3K0
Claude 4 系列 Opus 4 与 Sonnet 4正式发布:Claude 4新特性都有哪些?
揭秘Claude 4:AI界的编码王者与多模态新星,性能数据震撼来袭!
Claude 4系列是Anthropic公司于2025年5月23日推出的最新对话式AI模型,包括Claude Opus 4和Claude Sonnet 4,代表了人工智能在推理、编码和多模态处理领域的顶尖水平。本文将深入剖析Claude 4的技术架构、性能指标、核心功能及适用场景,并通过多张图表展示其在关键基准测试中的表现,为用户提供全面的技术参考。
用户11658894
2025/05/23
1K0
Claude生不逢时!谷歌想扶持自己的OpenAI实在太难了
---- 新智元报道   编辑:LRS 【新智元导读】赢家通吃,GPT-4之后的语言模型还有出路吗? 近期的AI大热门毫无疑问就是OpenAI发布的GPT-4了,与此同时,另一个竞争对手也结束了alpha测试。 由前OpenAI员工创办的新公司Anthropic打造的Claude正式宣布开放申请,也是为数不多能跟ChatGPT打个平手的模型,不过面对更强大的GPT-4,或许很难有招架之力。 想要追平GPT-4估计还要几年的时间,毕竟Claude模型并没有图像处理的能力,Anthropic也没有这方面的
新智元
2023/03/29
5390
Claude生不逢时!谷歌想扶持自己的OpenAI实在太难了
大模型下半场:7个趋势判断
推理模型能力的持续提升,推动大模型迎来“可用”到“好用”的拐点。推理强化和应用拓展启动了大模型下半场的新赛程。个人智能体潜力初步显现,行业应用渐次走深,开源开放日益成为大模型的核心竞争力组成。大算力、多模态、强推理、广开源、准数据、智能体、深应用等,成为当前发展的重要趋势。
小腾资讯君
2025/04/02
2930
AI日报 - 2025年4月18日
▎🤖 AGI探讨 | 专家激辩AGI定义与实现时间点,Causal AI被视为关键一步,o3模型预测2027年实现引关注。
訾博ZiBo
2025/04/17
3230
AI日报 - 2025年4月18日
2025年下半年AI技术发展趋势洞察
2025年可以说是AI Agent的”商用元年”。从2023年AutoGPT开启智能体序幕以来,AI Agent作为新一代智能交互范式,展现出前所未有的发展活力,业界认为Agentic AI时代即将到来,2025年有望成为AI Agent商业化应用元年。
蓝葛亮
2025/07/07
11.3K14
2025年下半年AI技术发展趋势洞察
OpenAI 五月新动向:技术与战略并进
2025年5月15日,OpenAI正式推出GPT-4.1系列,包括旗舰模型GPT-4.1、轻量版GPT-4.1 mini以及超高效的GPT-4.1 nano,逐步取代部分现有模型(如GPT-4o mini)。这一系列模型针对编码、复杂指令遵循和超长上下文处理进行了深度优化,特别契合程序员、开发者和企业的需求。相较于此前的o3和o4-mini模型,GPT-4.1系列在性能上显著提升,推理速度更快、运行成本更低,成为构建高性能AI应用的首选。
用户11658894
2025/05/15
1180
AI工程师薪酬远超其他同行!入门级超170万元;GPT4o新功能已免费开放;普华永道成ChatGPT最大企业客户丨AI情报局
科聪引入金蚂投资完成A+轮融资:本轮融资由金蚂投资领投,老股东元璟资本持续跟投。浙江科聪是一家移动机器人自主导航控制系统整体解决方案提供商。资金主要用于产能扩容建设,大幅提升产能,进一步加速布局国内外销售渠道。
AI科技评论
2024/06/03
3060
AI工程师薪酬远超其他同行!入门级超170万元;GPT4o新功能已免费开放;普华永道成ChatGPT最大企业客户丨AI情报局
【大模型】 基于AI和全球化进程的权衡:开源大模型与闭源大模型
实际上关于开源or闭源,一直以来都是颇有争议的话题,人们争执于数据的隐私性和共享性,到底哪一方能获得的收益更大。而对于开源与闭源哪个更好实际上也就是说是隐私更好还是公开更好。
Skrrapper
2024/06/18
3380
【大模型】 基于AI和全球化进程的权衡:开源大模型与闭源大模型
游戏规则改变者:OpenAI 发布 Deep Research API 与 o3/o4 模型,重新定义“智能引擎”
2025年6月27日北京时间凌晨,OpenAI的一系列重磅发布,不仅是技术迭代的又一声回响,更像是其商业化征程中一个清晰的战略转向信号。这次更新的核心,不再是单纯炫技于模型能力的提升,而是宣告其战略重心正悄然从提供“作为工具的语言模型”,转向交付“作为服务的自动化工作流”(Workflow-as-a-Service)。
攻坚克难的那份表
2025/07/01
1990
2025年7月最新多语言模型研发效能分析(Gemini 2.5 vs Claude 4 vs GPT-4.1)
2025年,AI大模型战场硝烟再起!Claude 4横空出世,GPT-4.1磨刀霍霍,Gemini 2.5蓄势待发。如果说2024年是大模型的"春秋战国时代",那么2025年就是"三国鼎立"的新格局。
蓝葛亮
2025/07/11
4.1K0
2025年7月最新多语言模型研发效能分析(Gemini 2.5 vs Claude 4 vs GPT-4.1)
大模型之火烧出1亿级用户应用,百模大战2024谁将赢得决战?
有传言说,谷歌用来对打ChatGPT超级大杀器Gemini Ultra,很可能会在24小时内上线!
新智元
2024/02/26
4160
大模型之火烧出1亿级用户应用,百模大战2024谁将赢得决战?
除了DeepSeek,你还可以在轻流上使用这些顶级大模型
昨天,我们又上架了几个模型,他们分别是:OpenAI、Grok、Claude和Gemini;
用户11720959
2025/07/07
1070
除了DeepSeek,你还可以在轻流上使用这些顶级大模型
Anthropic Claude Neptune 震撼来袭:安全与性能双突破,国内体验通道已开启
AI 领域迎来重要进展 ——Anthropic 旗下全新大型语言模型 Claude Neptune 已进入内部安全测试冲刺期。据权威科技媒体报道,Anthropic 正通过自研 Workbench 平台对模型进行全维度压力测试,其中针对 "越狱攻击" 的红队演习计划于 5 月 18 日完成。作为 Anthropic 安全体系的核心组件,"constitutional classifiers" 系统在测试中表现亮眼:与前代模型相比,Claude Neptune 对风险指令的识别敏感度提升 47%,恶意代码生成拦截率达 99.2%,凸显其在 AI 可控性领域的技术突破。
PoloaiAPI
2025/05/15
2280
Anthropic Claude Neptune 震撼来袭:安全与性能双突破,国内体验通道已开启
o3 deep research: LLM 驱动的 Agent 综述
大型语言模型(LLM)的崛起在过去几年引发了人工智能领域的飞跃式发展。尤其是 2022 年底 OpenAI 推出的 ChatGPT,短短两个月内月活用户就突破一亿,成为史上用户增长最快的消费者应用 (ChatGPT sets record for fastest-growing user base - analyst note | Reuters)。ChatGPT 所展现的强大自然语言对话和内容生成能力,如一场“核爆”引发全球对于通用人工智能的极大关注,各行各业开始思考如何将这类大模型应用到实际业务中。紧随其后,OpenAI 发布了更先进的 GPT-4 模型,能够理解更复杂的指令,并支持图像等多模态输入。这场由 ChatGPT 引领的LLM浪潮,不仅催生了大量类似产品和开源模型,也让“ AI 更自主地完成复杂任务”成为下一个技术探索热点。在这种背景下,由 LLM 驱动的 Agent(智能代理)概念逐渐兴起,成为 AI 技术爱好者和产业从业者共同关注的前沿方向。
立委
2025/03/08
4210
AI实力榜大洗牌!OpenAI谷歌强势领跑,Anthropic节节败退
最近,Poe发布了最新的使用报告,报告显示,OpenAI和谷歌的地位越来越稳,势头很猛。
新智元
2025/05/17
1220
AI实力榜大洗牌!OpenAI谷歌强势领跑,Anthropic节节败退
Anthropic推出Claude 4:AI技术的新篇章
当地时间,2025年5月22日,人工智能研究公司Anthropic在其首届开发者大会上正式发布了Claude 4系列模型。这一发布标志着AI技术在编码、推理和复杂任务执行领域的重大突破。Claude 4包括两个主要模型:Claude Opus 4和Claude Sonnet 4,它们在多项基准测试中展现了卓越性能,特别是在软件工程和终端操作任务中。本文将详细探讨Claude 4的特性、性能、应用场景以及其对AI行业的影响。
AI.NET 极客圈
2025/05/25
3120
Anthropic推出Claude 4:AI技术的新篇章
推荐阅读
AI生态暗战升级,科技巨头铁幕下的终极博弈
1460
DeepSeek AI:能否成为中文 AI 领域的新领军者?
1610
AI巨头集体放大招!DeepSeek优化、豆包变强、ChatGPT画图不靠DALL·E、Gemini 2.5挑战GPT-5?
2730
Claude 4 系列 Opus 4 与 Sonnet 4正式发布:Claude 4新特性都有哪些?
3.3K0
揭秘Claude 4:AI界的编码王者与多模态新星,性能数据震撼来袭!
1K0
Claude生不逢时!谷歌想扶持自己的OpenAI实在太难了
5390
大模型下半场:7个趋势判断
2930
AI日报 - 2025年4月18日
3230
2025年下半年AI技术发展趋势洞察
11.3K14
OpenAI 五月新动向:技术与战略并进
1180
AI工程师薪酬远超其他同行!入门级超170万元;GPT4o新功能已免费开放;普华永道成ChatGPT最大企业客户丨AI情报局
3060
【大模型】 基于AI和全球化进程的权衡:开源大模型与闭源大模型
3380
游戏规则改变者:OpenAI 发布 Deep Research API 与 o3/o4 模型,重新定义“智能引擎”
1990
2025年7月最新多语言模型研发效能分析(Gemini 2.5 vs Claude 4 vs GPT-4.1)
4.1K0
大模型之火烧出1亿级用户应用,百模大战2024谁将赢得决战?
4160
除了DeepSeek,你还可以在轻流上使用这些顶级大模型
1070
Anthropic Claude Neptune 震撼来袭:安全与性能双突破,国内体验通道已开启
2280
o3 deep research: LLM 驱动的 Agent 综述
4210
AI实力榜大洗牌!OpenAI谷歌强势领跑,Anthropic节节败退
1220
Anthropic推出Claude 4:AI技术的新篇章
3120
相关推荐
AI生态暗战升级,科技巨头铁幕下的终极博弈
更多 >
LV.1
腾讯云社群运营
目录
  • 文章目录
  • 一、关于模版方法模式
    • 1、关于模版方法模式
    • 2、关于模版方法模式的构成
    • 3、关于抽象模板的方法组成
    • 4、关于模版方法模式的XML
    • 5、关于模版方法模式的使用场景
    • 6、关于模版方法模式的优缺点
  • 二、观察者模式 Demo
    • 1、Demo 设计
    • 2、Demo 实现
    • 3、Demo 测试
  • 三、模版方法模式的应用(InputStream 中的模版方法模式)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档