设计模式17——模板方法模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

模板方法模式(Template Method)

是一种行为型模式。

目录

一、概述

1.1、直观的理解:

1.2、适用场景:

1.3、主要角色:

1.4、描述对象之间关系的UML图:

二、模板代码示例

2.1、对象之间的关系用UML图表示如下:

2.2、Java代码如下:


一、概述

复制代码
1、定义一个操纵中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变一个算法的结构下,重新定义该算法的某些特定步骤。
复制代码
2、当需要完成的某一系列功能之间的步骤大体都是一致的,但在个别更详细的地方有区别,那么我们可以考虑使用模板方法模式来处理。
复制代码
3、继承的意义之一:要让父类成为子类的模板,所有重复的代码都应该上升到父类中去,而不是让每个子类去重复。
复制代码
4、把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势。
复制代码
5、提供一个代码复用平台。
复制代码
6、帮助子类摆脱重复的不变行为的纠缠。

1.1、直观的理解

这时肯定会有小伙伴说这个和享元模式好像啊!那么就再从另外一个角度看:

方法0,就是从它们的公共部分的提取出来的。

可以发现,我们还可以提取出抽象的步骤。这样就可以让不一样的步骤被子类去实现,从而一方面能更充分使用公共部分,另一方面也限制了子类的步骤数量和执行顺序。

1.2、适用场景:

  • 一次性实现一个算法的不变部分,并将可变的行为留给子类
  • 各子类中公共的行为应该被提出来集中到一个公共的父类中以避免代码重复
  • 控制子类的扩展

1.3、主要角色:

  • ++超类++:公共的、或者说是重复的、不变的部分
  • ++子类++:独立的、变化的部分

1.4、描述对象之间关系的UML图:

二、模板代码示例

和上面1.1节的第二张图的例子类似,假设有两个对象的内部步骤大都一样。其中templateMethod是共享的模板方法,例子上述以分析过,就不再赘述,你可以把这当做一个模板,然后灵活使用:

2.1、对象之间的关系用UML图表示如下:

2.2、Java代码如下:

超类抽象类:

java 复制代码
abstract class AbstractClass {
    public void templateMethod() {

        //共享的代码
        //......
        System.out.println("共享的步骤");

        //个别步骤调用子类特有的方法来完成整个步骤
        this.primitiveOperation1();
        this.primitiveOperation2();
    }

    public abstract void primitiveOperation1();

    public abstract void primitiveOperation2();
}

子类A:

java 复制代码
public class ConcreteClassA extends AbstractClass{
    @Override
    public void primitiveOperation1() {
        System.out.println("子类A的方法1实现");
    }

    @Override
    public void primitiveOperation2() {
        System.out.println("子类A的方法2实现");
    }
}

子类B:

java 复制代码
public class ConcreteClassB extends AbstractClass {
    @Override
    public void primitiveOperation1() {
        System.out.println("子类B的方法1实现");
    }

    @Override
    public void primitiveOperation2() {
        System.out.println("子类B的方法2实现");
    }
}

主程序(发起请求的类):

java 复制代码
public class Main {
    public static void main(String[] args) {
        AbstractClass classA = new ConcreteClassA();
        classA.templateMethod();
        AbstractClass classB = new ConcreteClassB();
        classB.templateMethod();
    }
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞给作者一点鼓励吧!如果有建议,也请评论指教和讨论!

相关推荐
geovindu14 小时前
CSharp:Chain of Responsibility Pattern
开发语言·后端·设计模式·c#·.net·责任链模式·行为模式
梓仁沐白16 小时前
【Agent 设计模式】多智能体协作
microsoft·设计模式·php
努力学习的廖同学16 小时前
前端进阶-设计模式
设计模式
workflower2 天前
情境感知系统
人工智能·机器学习·设计模式·自然语言处理·机器人
咖啡八杯2 天前
设计模式中的原则
设计模式·接口隔离原则·里氏替换原则·开闭原则·合成复用原则·单一职责原则
安冬的码畜日常2 天前
【工欲善其事】深入理解 Node.js 带并发上限的异步任务批量执行逻辑
javascript·设计模式·node.js·ai编程·异步编程·并发执行
AI大法师2 天前
一个机场如何被做成 IP 场景:宝可梦机场的设计方法总结
大数据·人工智能·设计模式·新媒体运营
晚安code2 天前
干掉成山的 if-else:工厂造、策略选,一文讲透两个模式的配合
后端·设计模式
workflower3 天前
从幻觉,到现实
人工智能·深度学习·机器学习·设计模式·机器人
电子科技圈3 天前
第二代无线平台历久弥新,赋能物联网创新迭代
人工智能·嵌入式硬件·mcu·物联网·设计模式·硬件架构·iot