博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式(二)模板方法模式
阅读量:6716 次
发布时间:2019-06-25

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

1.模版方法模式简介

模版方法模式介绍

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

模版方法模式定义

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

模版方法模式结构图

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

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

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

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

1 public abstract class AbstractSwordsman { 2     //该方法为final,防止算法框架被覆写 3     public final void fighting(){ 4        //运行内功,抽象方法 5        neigong(); 6        //调整经脉,具体方法 7        meridian(); 8        //如果有武器则准备武器 9        if(hasWeapons()) {10            weapons();11        }12        //使用招式13        moves();14        //钩子方法15        hook();16    }17     //空实现方法18     protected void hook(){}19     protected abstract void neigong();20     protected abstract void weapons();21     protected abstract void moves();22     protected void meridian(){23         System.out.println("开通正经与奇经");24     }25 26     /**27      * 是否有武器,默认是有武器的,钩子方法28      * @return29      */30     protected boolean hasWeapons(){31          return true;32     }33 }

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

②定义具体实现类

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

1 public class ZhangWuJi extends AbstractSwordsman { 2  3     @Override 4     protected void neigong() { 5         System.out.println("运行九阳神功"); 6     } 7  8     @Override 9     protected void weapons() {10     }11 12     @Override13     protected void moves() {14         System.out.println("使用招式乾坤大挪移");15     }16 17     @Override18     protected boolean hasWeapons() {19         return false;20     }21 }

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

1 public class ZhangSanFeng extends AbstractSwordsman { 2  3     @Override 4     protected void neigong() { 5         System.out.println("运行纯阳无极功"); 6     } 7  8     @Override 9     protected void weapons() {10         System.out.println("使用真武剑");11     }12 13     @Override14     protected void moves() {15         System.out.println("使用招式神门十三剑");16     }17 18     @Override19     protected void hook() {20         System.out.println("突然肚子不舒服,老夫先去趟厕所");21     }22 }

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

③客户端调用

1 public class Client {2     public static void main(String[] args) {3         ZhangWuJi zhangWuJi=new ZhangWuJi();4         zhangWuJi.fighting();5         ZhangSanFeng zhangSanFeng=new ZhangSanFeng();6         zhangSanFeng.fighting();7     }8 }

运行结果:

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

 

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

优点

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

缺点

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

使用场景

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

转载地址:http://pakmo.baihongyu.com/

你可能感兴趣的文章
[转]GC简介
查看>>
poj 1466 Girls and Boys (最大独立集)
查看>>
辛星与您使用CSS导航条
查看>>
统计一个文件中出现字符'a'的次数
查看>>
将Eclipse包括第一3正方形jar包裹Project Export并产生能够执行jar
查看>>
Google Pagespeed,自动压缩优化JS/CSS/Image
查看>>
Gentoo源码安装图解
查看>>
【转载】COM 组件设计与应用(三)——数据类型
查看>>
Python yield与实现
查看>>
购物车特效收集
查看>>
Access中一句查询代码实现Excel数据导入导出
查看>>
2015第49周二
查看>>
Sphinx/Coreseek 4.1的安装流程
查看>>
邮件服务器Postfix的管理 重启php-fpm
查看>>
Android Studio 项目代码全部消失--出现原因及解决方法
查看>>
SQL Server---存储过程
查看>>
MySQL Performance-Schema(二) 理论篇
查看>>
搭建SSH详细步骤及相关说明
查看>>
Android IOS WebRTC 音视频开发总结(五五)-- 音视频通讯中的抗丢包与带宽自适应原理...
查看>>
Libgdx: 将Texturepacker打包的PNG图片还原成一张一张的单个的
查看>>