前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >这就是模板方法?TemplateMethod,一个你一直都在用的设计模式!

这就是模板方法?TemplateMethod,一个你一直都在用的设计模式!

作者头像
行百里er
发布2020-12-02 14:46:49
2480
发布2020-12-02 14:46:49
举报
文章被收录于专栏:JavaJourney

强行代入

模板方法的定义:

“Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure. 定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。 它是一种行为型模式。 ”

这写的是啥?不急,我们先来假设一个场景,通过代码来看这说的是啥。

假设:

动物Animal这个抽象类,有新陈代谢metabolism这个方法,这个方法经过eat()、drink()和sleep()三个动作后执行完成。

小马Pony、小牛Calf继承Animal

该假设场景的类图:

模拟场景类图

代码实现

代码语言:javascript
复制
/**
 * 模板方法设计模式
 * 范式重写的方法,系统帮我们自动调用的
 * 都可以称之为模板方法
 */
public class Main {
    public static void main(String[] args) {
        Animal pony = new Pony();
        pony.metabolism();
    }
}

abstract class Animal {
    /**
     * 新陈代谢
     * 假设都需要经过吃、喝、睡
     */
    public void metabolism() {
        eat();
        drink();
        sleep();
    }

    abstract void eat();

    abstract void drink();

    abstract void sleep();
}

class Pony extends Animal {
    @Override
    void eat() {
        System.out.println("Pony eating");
    }

    @Override
    void drink() {
        System.out.println("Pony drinking");
    }

    @Override
    void sleep() {
        System.out.println("Pony sleeping");
    }
}

如果再来一个小牛Calf,它也是小动物,自然也可以继承自Animal,如果main方法里调用小牛的新陈代谢方法呢?直接调用就完了,不需要逐一调用eat、drink和sleep了(自动在metabolism方法里调用)。

代码语言:javascript
复制
class Calf extends Animal {
    @Override
    void eat() {
        System.out.println("Calf eating");
    }

    @Override
    void drink() {
        System.out.println("Calf drinking");
    }

    @Override
    void sleep() {
        System.out.println("Calf sleeping");
    }
}

调用:

代码语言:javascript
复制
public static void main(String[] args) {
    Animal pony = new Pony();
    pony.metabolism();
    System.out.println("------------------------");
    Animal calf = new Calf();
    calf.metabolism();
}

运行结果:

代码语言:javascript
复制
Pony eating
Pony drinking
Pony sleeping
------------------------
Calf eating
Calf drinking
Calf sleeping

Process finished with exit code 0

OK,程序写完了,而且我用到了模板方法设计模式!

现在回过头来看一下,模板方法的定义:

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

小动物类Animal的新陈代谢方法metabolism就相当于一个算法骨架,我们的子类并没有改变算法(没有重写),只是对算法内部调用的方法继承下来,每个子类对这些特定步骤有自己的实现而已。

客户端调用的时候只需要调用骨架即可,具体的内部方法(eat、drink、sleep),系统会帮我们自动调用。

这种模式就是模板方法设计模式。

是的,我们一直在用它!

模板方法类图

这个时候,我们应该已经很熟悉模板方法了,类图很简单:

模板方法通用类图

总结模板方法的特点

通过上面的例子,我们可以看到,这种模式的优点:

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

当然我们也能看到,对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象。

欢迎阅读

“看完点赞,养成习惯。举手之劳,赞有余香。 ”

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 行百里er 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 强行代入
  • 代码实现
  • 模板方法类图
  • 总结模板方法的特点
  • 欢迎阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档