博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之-模版方法(Template Method Design Pattern)
阅读量:5051 次
发布时间:2019-06-12

本文共 3070 字,大约阅读时间需要 10 分钟。

模板方法是一种行为设计模式,它用于创建一个方法存根和推迟一些步骤执行的子类。模板方法定义的步骤来执行一个算法,它可以提供一种可能是共同的所有或一些子类的默认的实现。

让我们来了解这种模式有一个例子,假设我们要提供一个算法来盖房子。该步骤需要执行盖房是 - 建筑物地基,建筑物的支柱,建筑墙体和窗户。最重要的一点是,我们不能改变执行的顺序,因为我们不能建立在建地基前去建造窗户。因此,在这种情况下,我们可以创建将使用不同的方法来构建房子的模板方法。
现在所有类型的房子的地基都是是相同的,不论是它的一个木制的房子或是玻璃房子。因此,我们可以提供基本实现,如果子类需要重写此方法,它们可以重新实现内容,但大多是很常见的房屋所有类型。

模版方法抽象类:

由于我们想要子类实现该方法,所以我们创建基类为抽象类;

HouseTemplate.java

package com.journaldev.design.template; public abstract class HouseTemplate {     //模版方法, final 拒绝子类重写    public final void buildHouse(){        buildFoundation();        buildPillars();        buildWalls();        buildWindows();        System.out.println("House is built.");    }     //默认实现    private void buildWindows() {        System.out.println("Building Glass Windows");    }     //子类必须实现方法    public abstract void buildWalls();    public abstract void buildPillars();     private void buildFoundation() {        System.out.println("Building foundation with cement,iron rods and sand");    }}

buildHouse()为模版方法,它定义了执行指令顺序由几个步骤组成

我们可能会有多种类型房屋,这里以木质房,玻璃房为例

WoodenHouse.java

package com.journaldev.design.template; public class WoodenHouse extends HouseTemplate {     @Override    public void buildWalls() {        System.out.println("Building Wooden Walls");    }     @Override    public void buildPillars() {        System.out.println("Building Pillars with Wood coating");    } }
我们可以实现多个方法,这里为了简单选择两个实现

GlassHouse.java

package com.journaldev.design.template; public class GlassHouse extends HouseTemplate {     @Override    public void buildWalls() {        System.out.println("Building Glass Walls");    }     @Override    public void buildPillars() {        System.out.println("Building Pillars with glass coating");    } }
测试一下模版方法测试类:

HousingClient.java

package com.journaldev.design.template; public class HousingClient {     public static void main(String[] args) {                 HouseTemplate houseType = new WoodenHouse();                 //using template method        houseType.buildHouse();        System.out.println("************");                 houseType = new GlassHouse();                 houseType.buildHouse();    } }

注意这里调用调用基类的模板的方法,并根据不同的实施步骤,使用了从基类中继承,一些在子类中的重新实现方法。

输出结果:

Building foundation with cement,iron rods and sand
Building Pillars with Wood coating
Building Wooden Walls
Building Glass Windows
House is built.
************
Building foundation with cement,iron rods and sand
Building Pillars with glass coating
Building Glass Walls
Building Glass Windows
House is built.

Template Method Class Diagram

实现要点:

    1,模板方法应包括某些步骤的顺序是固定的,对于某些方法,由不同子类具体去实现,模板方法应该是最终是固定的。

    2, 大多数时候,子类调用从父类,但在模板模式的方法,父类的模板方法调用方法的子类,这是被称为好莱坞原则 - “不给我们打电话,我们会打电话给你。”
    3,在基类中的方法默认的实现被称为钩,他们的目的是由子类重写,如果你想使一些方法不能被覆盖,你可以使用final修饰,例如,在我们的例子中,我们可以 使用final buildFoundation()修饰,因为我们不想子类重写它。

jdk中模版模式应用:

所有非抽象方法

java.io.InputStream, java.io.OutputStream, java.io.Reader and java.io.Writer.

 java.util.AbstractList, java.util.AbstractSet and java.util.AbstractMap.

原文链接:http://www.journaldev.com/1763/template-method-design-pattern-in-java

转载于:https://www.cnblogs.com/happyxiaoyu02/p/6818945.html

你可能感兴趣的文章
Makefile Shell 脚本;sed命令
查看>>
win7 装docker
查看>>
利用python爬取海量疾病名称百度搜索词条目数的爬虫实现
查看>>
python3 下的文件输入输出特性以及如何覆盖文件内容和接下去输入
查看>>
linux OA搭建
查看>>
清除远程桌面连接历史记录
查看>>
使用matlab遇到的问题
查看>>
Java中的HashMap遍历和C#的字典遍历
查看>>
21_listview展示数据内容回顾
查看>>
在手机网络情况下,Android的微信页面不能播放背景音乐
查看>>
SpringBoot:第二篇 集成日志lombok
查看>>
【Python】新建自定义个数的自定义长度名字
查看>>
区块链与比特币小结
查看>>
也说python的类--基于python3.5
查看>>
Oracle 存储过程
查看>>
HashMap原理阅读
查看>>
冲刺7
查看>>
html5 drag 文件拖拽浅淡
查看>>
window安装Scrapy———解决报错问题
查看>>
关于VS2010编译警告LNK4221
查看>>