模板方法模式(Template Method)

转载 2016年08月30日 08:45:23

模板方法模式(Template Method)

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

类图:

这里写图片描述

模板方法模式是编程中经常用到的模式,其非常简单,AbstractClass叫抽象模板,其方法分为3类:

  • 1.抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现。

  • 2.模版方法:由抽象类声明并加以实现。一般来说,模版方法调用抽象方法来完成主要的逻辑功能,并且,模版方法大多会定义为final类型,指明主要的逻辑功能在子类中不能被重写。

  • 3.钩子方法:由抽象类声明并加以实现。但是子类可以去扩展,子类可以通过扩展钩子方法来影响模版方法的逻辑。

实现类用来实现细节。抽象类中的模版方法正是通过实现类扩展的方法来完成业务逻辑。

现在要实现一个对无序数组从小到大排序并打印数组的类。

排序算法有很多种,打印功能固定的。定义一个AbstractClass定义抽象排序方法由子类去实现;模板类实现打印方法。

//抽象模板类
public abstract class AbstractSort {

    public abstract void sort(int[] array);
    //防止子类覆盖使用final修饰
    public final void printArray(int[] array) {
        sort(array);
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }
}
//具体实现类
public class QuickSort extends AbstractSort {
    @Override
    public void sort(int[] array) {
        //使用快排算法实现
    }
}
public class MergeSort extends AbstractSort {
    @Override
    public void sort(int[] array) {
        //使用归并排序算法实现
    }
}
public static void main(String[] args) {
        int[] arr = {3,5,2,45,243,341,111,543,24};
        //AbstractSort s = new MergeSort();
        AbstractSort s = new QuickSort();
        s.printArray(arr);
    }

总结

模板方法模式优点:

  • 1.容易扩展。一般来说,抽象类中的模版方法是不易发生改变的部分,而抽象方法是容易发生变化的部分,因此通过增加实现类一般可以很容易实现功能的扩展,符合开闭原则。

  • 2.便于维护。对于模版方法模式来说,正是由于他们的主要逻辑相同,才使用了模版方法。

适用场景:

  • 在多个子类拥有相同的方法,并且这些方法逻辑相同时,可以考虑使用模版方法模式。在程序的主框架相同,细节不同的场合下,也比较适合使用这种模式。

Test

package com.qbz.test;
//抽象检测类(抽象模板方法)
abstract class AbstractCheck {
    abstract void startup();

    abstract void speeup();

    abstract void brake();

    abstract void stop();

    // 防止子类覆盖使用final修饰
    public final void check() {
        startup();
        speeup();
        brake();
        stop();
    }

}

// 检测911
class Porsche911 extends AbstractCheck {
    @Override
    void startup() {
        System.out.println("检测911启动");
    }

    @Override
    void speeup() {
        System.out.println("检测911加速");
    }

    @Override
    void brake() {
        System.out.println("检测911刹车");
        // 检测方法标准
        System.out.println("911刹车合格");
    }

    @Override
    void stop() {
        System.out.println("检测911熄火");
    }
}

// 检测Cayma类
class PorscheCayma extends AbstractCheck {
    @Override
    void startup() {
        System.out.println("检测Cayma启动");
    }

    @Override
    void speeup() {
        System.out.println("检测Cayma加速");
    }

    @Override
    void brake() {
        System.out.println("检测Cayma刹车");
        // 检测方法标准
        System.out.println("Cayma刹车合格");
    }

    @Override
    void stop() {
        System.out.println("检测Cayma熄火");
    }
}

public class Main {

    public static void main(String[] args) {
        AbstractCheck ac = new Porsche911();
        // 开始检测911
        ac.check();
        // 检测Cayma
        AbstractCheck ac2 = new PorscheCayma();
        ac2.check();
    }

}

输出:

检测911启动
检测911加速
检测911刹车
911刹车合格
检测911熄火
检测Cayma启动
检测Cayma加速
检测Cayma刹车
Cayma刹车合格
检测Cayma熄火

Android Stutio中使用java8的Lambda表达式

目录:为什么要使用Lambda表达式 让Android Stutio支持Lambda 函数式接口Functional interfaces Lambda表达式的目标类型以及匹配 Lambda表达式语法...
  • u010163442
  • u010163442
  • 2016年05月29日 14:36
  • 6849

TemplateMethod模板方法模式之应用

一,定义:模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。            二,类图:  ...
  • liujiahan629629
  • liujiahan629629
  • 2014年02月22日 19:37
  • 2363

模板方法模式(Template Method) - 最易懂的设计模式解析

前言今天我来全面总结一下Android开发中最常用的设计模式 - 模板方法模式。 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析...
  • carson_ho
  • carson_ho
  • 2017年02月07日 15:37
  • 5141

(C++实现)——模板方法模式(Template Method Pattern)

概述:      我们最近在开发一个支持多种压缩类型文件的解压缩且制作成pdf的一个应用。对我们的架构来说我们需要支持多种压缩文件类型,但却有固定的操作顺序(先解压缩,在读取里面的文件分析、制作...
  • u011676589
  • u011676589
  • 2013年09月18日 14:21
  • 1068

【java设计模式】之 模板方法(Template Method)模式

1. 模板方法的一个实例         这一节主要来学习一下设计模式中的模板方法模式。我们先来看一个例子:假如现在老板让你做一个汽车的模型,要求只要完成基本功能即可,不考虑扩展性,那你会怎么做呢?...
  • eson_15
  • eson_15
  • 2016年05月06日 08:57
  • 4088

(行为型模式)TEMPLATE METHOD——模板方法模式

1、意图 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。template method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 2、核心思想    ...
  • u011744843
  • u011744843
  • 2016年05月21日 17:12
  • 93

模板方法模式(Template method)

意图 定义一个操作中的算法骨架,而将一些步骤延迟到子类中。 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 应用场景 uu 类图 参与者 Abstra...
  • tanhaiyuan
  • tanhaiyuan
  • 2013年11月25日 11:21
  • 685

设计模式:模板方法模式-template method

定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤在抽象父类中,可以定义多种不同类型的方法...
  • hjd199464
  • hjd199464
  • 2017年01月11日 09:35
  • 239

模板方法模式(Template Method Pattern)。

博文中的内容来源《设计模式之禅》这一本书,感激不尽。
  • en_joker
  • en_joker
  • 2017年07月20日 21:02
  • 147

模板方法模式 template method pattern

我对模板方法模式的理解,其本质上是标准化。     所谓标准化是指在经济、技术、科学和管理等社会实践中,对重复性的事物和概念,通过制订、发布和实施标准达到统一,以获得最佳秩序和社会效益。来自百度百科>...
  • tnt87
  • tnt87
  • 2017年08月15日 11:55
  • 159
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:模板方法模式(Template Method)
举报原因:
原因补充:

(最多只允许输入30个字)