相关文章
设计模式(一)设计六大原则
设计模式(二)单例模式的七种写法
设计模式(三)建造者模式
设计模式(四)简单工厂模式
设计模式(五)观察者模式
设计模式(六)代理模式
设计模式(七)装饰模式
设计模式(八)外观模式

1.模版方法模式简介

模版方法模式介绍

在软件开发中,有时会遇到类似的情况,某个方法的实现需要多个步骤,其中有些步骤是固定的,而有些步骤并不固定,存在可变性。为了提高代码的复用性和系统的灵活性,可以使用模板方法模式来应对这类情况。

模版方法模式定义

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

模版方法模式结构图

  • AbstractClass:抽象类,定义了一套算法。
  • ConcreteClass:具体实现类。

2.模版方法模式的简单实现

延续着上一篇设计模式(八)外观模式的写法,我们仍旧来举一个武侠的例子,原谅博主是一个武侠迷。

创建抽象类,定义算法框架

一个武侠要战斗的时候,也有一套固定的通用模式,那就是运行内功、开通经脉、准备武器和使用招式,我们把这些用代码表示就是:

public abstract class AbstractSwordsman {//该方法为final,防止算法框架被覆写public final void fighting(){//运行内功,抽象方法neigong();//调整经脉,具体方法meridian();//如果有武器则准备武器if(hasWeapons()) {weapons();}//使用招式moves();//钩子方法hook();}//空实现方法protected void hook(){}protected abstract void neigong();protected abstract void weapons();protected abstract void moves();protected void meridian(){System.out.println("开通正经与奇经");}/*** 是否有武器,默认是有武器的,钩子方法* @return*/protected boolean hasWeapons(){return true;}
}

需要注意的是这个抽象类包含了三种类型的方法,分别是抽象方法、具体方法和钩子方法。抽象方法是交由子类去实现,具体方法则在父类实现了子类公共的方法实现,在上面的例子就是武侠开通经脉的方式都一样,所以就在具体方法中实现。钩子方法则分为两类,第一类是15行,它有一个空实现的方法,子类可以视情况来决定是否要覆盖它;第二类则是第9行,这类钩子方法的返回类型通常是bool类型的,一般用于对某个条件进行判断,如果条件满足则执行某一步骤,否则将不执行。

定义具体实现类

本文就拿张无忌、张三丰来作为例子:

public class ZhangWuJi extends AbstractSwordsman {@Overrideprotected void neigong() {System.out.println("运行九阳神功");}@Overrideprotected void weapons() {}@Overrideprotected void moves() {System.out.println("使用招式乾坤大挪移");}@Overrideprotected boolean hasWeapons() {return false;}
}

张无忌没有武器所以hasWeapons方法返回false,这样也不会走weapons方法了。

public class ZhangSanFeng extends AbstractSwordsman {@Overrideprotected void neigong() {System.out.println("运行纯阳无极功");}@Overrideprotected void weapons() {System.out.println("使用真武剑");}@Overrideprotected void moves() {System.out.println("使用招式神门十三剑");}@Overrideprotected void hook() {System.out.println("突然肚子不舒服,老夫先去趟厕所");}
}

最后张三丰突然肚子不舒服所以就实现了钩子方法hook。

客户端调用

public class Client {public static void main(String[] args) {ZhangWuJi zhangWuJi=new ZhangWuJi();zhangWuJi.fighting();ZhangSanFeng zhangSanFeng=new ZhangSanFeng();zhangSanFeng.fighting();}
}

运行结果:
运行九阳神功
开通正经与奇经
使用招式乾坤大挪移
运行纯阳无极功
开通正经与奇经
使用真武剑
使用招式神门十三剑
突然肚子不舒服,老夫先去趟厕所

4.模版方法模式的优缺点和使用场景

优点

  • 模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。
  • 子类实现算法的某些细节,有助于算法的扩展。

缺点

  • 每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。

使用场景

  • 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
  • 面对重要复杂的算法,可以把核心算法设计为模版方法,周边相关细节功能则有各个子类实现。
  • 需要通过子类来决定父类算法中某个步骤是否执行,实现子类对父类的反向控制。

设计模式(九)模版方法模式相关推荐

  1. 详解设计模式:模版方法模式

    模板方法模式(Template Method Pattern)也被称为模板模式(Template Pattern),是在 GoF 23 种设计模式中定义了的行为型模式. 模板方法模式 定义一个操作中的 ...

  2. Java设计模式学习 - 模版方法模式策略模式

    个人博客项目地址 希望各位帮忙点个star,给我加个小星星✨ 设计模式-模板方法&策略模式 简单介绍 模板方法模式(Template):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. ...

  3. 设计模式-模版方法模式

    定义 定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现. 模版方法使子类在不改变算法结构的情况下,重新定义算法的某些步骤 使用场景 一次性实现算法的不变部分,将可变的行为留给子类来实现 各子类 ...

  4. 设计模式之模版方法模式的钩子方法

    public abstract class SoyaMilk {//模版方法 可以做成finaL,不让子类去覆盖final void make(){select();if(customerWantCo ...

  5. 设计模式之模版方法模式demo

    public abstract class SoyaMilk {//模版方法 可以做成finaL,不让子类去覆盖final void make(){select();addCondiments();s ...

  6. 设计模式 模版方法模式 展现程序员的一天

    继续设计模式~ 模版方法模式 老套路,先看下定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤. 简单看下定义,模版方法定义了一个算 ...

  7. 设计模式——模版方法模式详解(论沉迷LOL对学生的危害)

    0. 前言 写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦 ...

  8. Java设计模式笔记(4)模版方法模式

    模版方法模式:定义一个操作中的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重定义该算法的某些步骤. 抽象模版的方法分为两类: 1. 基本方法也叫基本操作,是由子类实现的方 ...

  9. 模版方法模式/Template Method

    模版方法模式/Template Method 意图/适用场景: 模版方法模式其实是一种应用很广泛的模式,特别是在使用抽象类的时候. 模版方法模式中必然有一个核心的抽象类,不能是接口.声明一些抽象方法, ...

最新文章

  1. (运维日志)在win7安装Oracle并部署Oracle数据库
  2. 在ffmpeg中加入x264模块
  3. 20172329 2017-2018-2 《程序设计与数据结构》第五周学习总结
  4. 基于分割的PTD渐进三角网加密滤波(SBF)算法
  5. flask mysql sql注入_Python 中如何防止sql注入
  6. Maven的setting仓库配置
  7. 程序员删库跑路案例之 —— 这家网站首页变图片
  8. 旧手机改电脑外挂,文本补充
  9. WebApp - 微信浏览器解决安全提示“防盗号或诈骗,请不要输入QQ密码”
  10. 数值微分的python实现
  11. 读《日本包装设计鉴赏》有感之——博客第一篇
  12. 华为云 内容审核API调用 前端 js uni-app
  13. 抖音企业号获客系统技术操作手册
  14. 使用vue-seamless-scroll实现滚动,出现空白间隔的问题
  15. win7 php7 redis扩展,win7 php5.6 redis扩展
  16. android环境监测,基于Wi―Fi和Android家居环境监测与实现
  17. xcode打包优化级别设置
  18. SpringBoot实现用户统一管理与单点登陆
  19. JAVA完全参考手册(第8版) 第1章至第5章
  20. 想告别繁琐的工作?你可能需要这个。

热门文章

  1. js的 流程控制(笔记)
  2. BZOJ1567 [JSOI2008]Blue Mary的战役地图
  3. Mina IoBuffer的特性介绍
  4. Intellij IDEA--格式化SQL文件的方法
  5. 亚马逊MWS开发--商品的上传(1)
  6. 冬日娜刻薄提问雷哭史冬鹏 无厘头堪比韩乔生
  7. 3D游戏编程与设计1——游戏的本质
  8. 5.17黄金跌破2000还会涨吗?多单被套怎么办?
  9. 微信小程序与后台PHP交互
  10. 在农村,读书是唯一的出路!