通俗易懂系列 | 设计模式(一):模板模式

实际开发中常常会遇到,代码骨架类似甚至相同,只是具体的实现不一样的场景。例如:流程都有开启、编辑、驳回、结束。每个流程都包含这几个步骤,不同的是不同的流程实例它们的内容不一样。共享单车都是先开锁、骑行、上锁、付款。这些大的步骤固定,不同的是每个实例的具体实现细节不一样。这些类似的业务我们都可以使用模板模式实现。为什么要使用模板模式以及如何使用呢?

介绍#

定义:在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
主要解决:一些方法通用,却在每一个子类都重新写了这一方法。
何时使用:有一些通用的方法。
如何解决:将这些通用算法抽象出来。
关键代码:在抽象类实现,其他步骤在子类实现。

实现#

我们以生活中买菜做饭的例子来写个Demo,烧饭一般都是买菜、洗菜、烹饪、装盘四大过程。中国自古有八大菜系,制作方式肯定都避不开这四个过程。那在模板模式中如何实现呢?
创建一个抽象类,它的模板方法被设置为 final。为防止恶意操作,一般模板方法都加上 final 关键词。

public abstract class AbstractCookingService {    //买菜    protected abstract void shopping();    //清洗    protected abstract void wash();    //烹饪    protected abstract void cooking();    //装盘    protected abstract void dishedUp();    public final void process() {        shopping();        wash();        cooking();        dishedUp();    }}

创建实现了上述抽象类的子类。
// 徽菜烹饪

/** * 徽菜制作大厨 */public class HuiCaiChef extends AbstractCookingService {    @Override    protected void shopping() {        System.out.println("买菜:新鲜鱼一条,红辣椒五两");    }    @Override    protected void wash() {        System.out.println("清洗:红椒洗净切片,鱼头半分");    }    @Override    protected void cooking() {        System.out.println("烹饪:鱼头水蒸,辣椒过油");    }    @Override    protected void dishedUp() {        System.out.println("装盘:用长形盘子装盛");    }}

// 川菜烹制

/** * 川菜制作大厨 */public class HuiCaiChef extends AbstractCookingService {    @Override    protected void shopping() {        System.out.println("买菜:黑猪肉一斤,蒜头5个");    }    @Override    protected void wash() {        System.out.println("清洗:猪肉洗净,蒜头去皮");    }    @Override    protected void cooking() {        System.out.println("烹饪:大火翻炒,慢火闷油");    }    @Override    protected void dishedUp() {        System.out.println("装盘:深碗盛起,热油浇拌");    }}

使用 TemplatePatternDemo 类执行模板方法 process() 来演示烹饪的定义方式。

public class TemplatePatternDemo {    public static void main(String[] args) {        System.out.println("----------川菜制作------------");        AbstractCookingService chuanCaiService = new ChuanCaiChef();        chuanCaiService.process();        System.out.println("-----------徽菜制作-----------");        AbstractCookingService huiCaiService = new HuiCaiChef();        huiCaiService.process();    }}

执行程序,输出结果:

----------川菜制作------------买菜:新鲜鱼一条,红辣椒五两清洗:红椒洗净切片,鱼头半分烹饪:鱼头水蒸,辣椒过油装盘:用长形盘子装盛-----------徽菜制作-----------买菜:黑猪肉一斤,蒜头5个清洗:猪肉洗净,蒜头去皮烹饪:大火翻炒,慢火闷油装盘:深碗盛起,热油浇拌

从以上实例可以看出,其实模板模式也没什么高深莫测的,简单来说就是三大步骤:

  1. 创建一个抽象类,定义几个抽象方法和一个final修饰的模板方法,而模板方法中设定了抽象方法的执行顺序或逻辑。
  2. 无论子类有多少个,只需要继承该抽象类,实现父类的抽象方法重写自己的业务。
  3. 根据不同的需求创建不同的子类实现,每次调用的地方只需调用模板方法,即可完成特定的模板流程。

总结#

从以上的分析和Demo我们可以看到,模板方法提高了我们的代码的可维护性和可扩展性。有优点也有缺点。
优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。
缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。

(0)

相关推荐

  • 模板方法模式

    一.模板方法模式介绍 1.定义与类型 定义:定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现 模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤 类型:行为型 2.适用场景 ...

  • 设计模式-行为型-模板模式

    模板模式(Template): 提到模板,可能大多数人想到的是"简历模板"."论文模板"等,比如我们要写简历时,会从网上下载一份漂亮的简历模板,其格式是固定的, ...

  • TemplateMethodPattern模板方法模式

    模板方法模式 1.定义 定义一个操作中的算法的框架,而将一些步骤的实现延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 使用模板方法模式制造两款汽车.定义汽车必须有的特质 ...

  • 设计模式之模板方法

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

  • JAVA架构师之路十四:设计模式之模板模式

    JAVA架构师之路十三:设计模式之委派模式 模板模式 1. 模板模式 2. 模板模式案例 3. JDBC模板模式 没有意志,理想便是幻想. 1. 模板模式 定义 通常又叫模板模式,是指定义一个算法的骨 ...

  • 快速掌握模板方法模式

    概述 模板模式就是定义一个操作中的算法骨架,然后将一些步骤延迟到子类中.模板方法使得子类在不改变算法的结构即可重定义该算法的某些步骤. 使用场景 泡茶 我们都知道泡茶基本步骤有: 烧水.选茶叶.泡茶. ...

  • 通俗易懂系列 | 设计模式(八):建造者模式

    介绍# 今天我们将研究java中的Builder模式.Builder 设计模式是一种创造性的设计模式,如工厂模式和抽象工厂模式. 当Object包含许多属性时,引入了Builder模式来解决Facto ...

  • 通俗易懂系列 | 设计模式(六):责任链模式

    责任链设计模式是行为设计模式之一. 责任链模式用于在软件设计中实现松散耦合,其中来自客户端的请求被传递到对象链以处理它们.然后链中的对象将自己决定谁将处理请求以及是否需要将请求发送到链中的下一个对象. ...

  • 通俗易懂系列 | 设计模式(五):策略模式

    介绍# 策略设计模式是行为设计模式之一.当我们为特定任务使用多个算法时,使用策略模式,客户端决定在运行时使用的实际实现. 策略模式的最佳示例之一是Collections.sort()采用Compara ...

  • 图解Java设计模式之模板模式

    豆浆制作问题 模板方法模式基本介绍 模板方法模式原理类图 模板方法模式解决豆浆制作问题 模板方法模式的钩子方法 模板方法模式在Spring框架中的源码分析 模板方法模式的注意事项和细节 豆浆制作问题 ...

  • 通俗易懂系列 | 设计模式(七):观察者模式

    介绍# 观察者模式是行为设计模式之一.当您对对象的状态感兴趣并希望在有任何更改时收到通知时,观察者设计模式非常有用.在观察者模式中,监视另一个对象状态的对象称为Observer,正在被监视的对象称为S ...

  • 通俗易懂系列 | 设计模式(三):适配器模式

    今天看了部特工电影,里面有个桥段,主角在直升机上和反派生死搏斗,而飞机则是无人驾驶的状态,有坠毁的危险.生死存亡,危急时刻主角让团队成员去驾驶,而团队成员很慌张地说:"Hey, man,你开 ...

  • 通俗易懂系列 | 设计模式(二):装饰模式

    2018国庆黄金周来了,恰值国庆黄金周节假日,我想高速上一定车山车海,还好我选择了高铁,不然肯定需要寻找项目合作人或在高速上吃创业人士的炒饭炒面了. 国庆7天长假,天气又如此的好,所谓风和日丽,如此良 ...

  • 通俗易懂设计模式解析——解释器模式

    前言 今天我们来讲解释器模式[Interpreter Pattern],如何理解这一个模式呢?一个简单的例子.中英文翻译器这个东西的作用是啥呢?将不知道的英文翻译成中文以便于理解.或者把中文翻译成英文 ...