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

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

文章目录

模式介绍

当我们设计一个类时,我们能明确它对外提供的某个方法的内部执行步骤,但是有一些步骤,不同的子类有不同的行为时,我们应该使用模板方法模式。

具体实现

有一个抽象模板类AbstractClass,其方法分为两类

  • 基本方法:由子类实现的方法,并且在模板方法被调用
  • 模板方法:可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调用,完成固定的逻辑。(一般都加上final关键字,防止被重写)(抽象模板中的基本方法尽量设计为protected类型,符合迪米特法则,不需要暴露的属性或方法尽量不要设置为protected类型。实现类若非必要,尽量不要扩大父类中的访问权限)

最佳实践

模板方法模式是通过父类建立框架,子类在重写了父类部分方法之后,在调用从父类继承的方法,产生不同的效果,通过修改子类,影响父类行为的结果,模板方法在一些开源框架中应用非常多,它提供了一个抽象类,然后开源框架写了一堆子类,如果需要扩展功能,可以继承此抽象类,然后覆写protected基本方法,然后在调用一个类似TemplateMethod()的模板方法,完成扩展开发。

应用场景

  • 多个子类有共有的方法,并且逻辑基本相同
  • 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现
  • 重构时,模板方法是一个经常使用的方法,把相同的代码抽取到父类中,然后通过构造函数约束其行为

模式类图

在这里插入图片描述

代码实例

模板抽象类:

public abstract class AbstractClass {
//让子类去实现特殊的处理逻辑 protected abstract void doAnything(); protected abstract void doSomething(); //模板方法,定义成final,不让子类修改 public final void templateMethod(){
/* * 调用基本方法,完成相关的逻辑 */ this.doAnything(); this.doSomething(); }}

子类1:

public class ConcreteClass1 extends AbstractClass{
@Override protected void doAnything() {
//子类实现具体 System.out.println("ConcreteClass1 doAnything"); } @Override protected void doSomething() {
System.out.println("ConcreteClass1 doSomething"); }}

子类2:

public class ConcreteClass2 extends AbstractClass{
@Override protected void doAnything() {
//子类实现具体 System.out.println("ConcreteClass2 doAnything"); } @Override protected void doSomething() {
System.out.println("ConcreteClass2 doSomething"); }}

总结

优点

  • 封装不变部分,扩展可变部分。把认为不变部分的算法封装到父类中实现,而可变部分的则可以通过继承来继续扩展
  • 提取公共部分代码,便于维护
  • 行为由父类控制,子类实现

缺点

  • 按照设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类负责完成具体的事务属性和方法,但是模板方式正好相反,子类执行的结果影响了父类的结果,会增加代码阅读的难度

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

你可能感兴趣的文章
方兴东:中国网站十年
查看>>
2010年微软和谷歌十大战场:从桌面到浏览器
查看>>
服务器虚拟化的未来之路
查看>>
写给我们这些浮躁的系统工程师
查看>>
和平分手?你根本不知道吴恩达在百度经历了什么
查看>>
业余研究:关于腾讯与他的QQ帝国
查看>>
马云校长湖畔大学第三期讲义完整版
查看>>
iPhone为什么比Android好
查看>>
小程序的今天就是微信指数的明天
查看>>
从互联网到人工智能,BAT这七年来到底做了什么
查看>>
2012年十大科技趋势:Siri将震惊世界
查看>>
2017(第十届)中国绿公司年会马云演讲
查看>>
李彦宏:睡不着觉不是因对手
查看>>
从手Q与微信之争,看腾讯内在的真实矛盾与战略
查看>>
移动互联网的七宗败案
查看>>
互联网十大失败案
查看>>
小米颓势已现,生死劫命悬手机
查看>>
三大隐忧 三星未来路在何方?
查看>>
linux下各种进制转化最简单的的命令行
查看>>
结构体和联合体
查看>>