设计模式之模板模式学习笔记
发布日期:2021-05-06 23:31:40 浏览次数:23 分类:精选文章

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

前言

相信大家都写过各种各样的文档,需求文档、设计文档、使用手册等等。为了提高复用性和灵活度,需要采用一系列的模板来应对。

定义

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

结构图

在这里插入图片描述角色拆解分析:

1.AbstractClass:抽象类,定义了一套算法框架
2.ConcreteClass:具体实现类

举栗实现

封装固定的流程,第一步是什么,第二步是什么,这些都在抽象类中定义好。子类可以有不同的算法实现,在算法框架不被修改的前提下,实现某些步骤的算法的替换。这里还以迈腾举栗,迈腾的生产要安装发动机模块、中控模块、座椅模块…

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

public abstract class AbstractCar {       //final防止算法框架被重写    public final void magotan(){           //发动机模块        engine();        //中控模块        screen();        //省略其他模块...    }    protected abstract void engine();    protected abstract void screen();}

2.ConcreteClass具体实现类

迈腾从乞丐版到顶配版,中间包含了多种配置类型,其中以230为代表的乞丐版只搭配了EA211发动机和一个小窄屏(德原朗乞丐版送一个大众原厂手机支架…),高配搭配了EA888发动机和德赛西威187b。虽然实现不同,但是模板都是一样的,往上一怼就装上了。
先看看乞丐版迈腾是什么配置的:

public class LowMagotan extends AbstractCar {       @Override    protected void engine() {           System.out.print("乞丐版迈腾装配了一台EA211的1.4T涡轮增压发动机");    }    @Override    protected void screen() {           System.out.print("乞丐版迈腾装配的屏幕太小了...");    }}

再看看高配迈腾:

public class HighMagotan extends AbstractCar {       @Override    protected void engine() {           System.out.print("高配迈腾搭载了一台EA888发动机");    }    @Override    protected void screen() {           System.out.print("高配迈腾搭载了一块德赛西威187b的中控屏");    }}

3.客户端调用

分别启动高配、低配迈腾的组装方法,安装发动机、中控等…

public class Client {       public static void main(String []args){           HighMagotan highMagotan = new HighMagotan();        highMagotan.magotan();        LowMagotan lowMagotan = new LowMagotan();        lowMagotan.magotan();    }}

优缺点对比

优点

1.把不变的方法移动到超类,去除了子类的重复代码
2.子类实现的某些细节,方便拓展
缺点
1.每个实现都需要定义一个子类,会使类变得更多,设计越来越抽象

使用场景

1.多个子类有共有方法,并且逻辑基本相同

2.需要子类来决定父类中算法的某个步骤是否执行,实现子类对父类的反向控制
3.面对核心算法,可以将其设定为模板方法,周边功能由子类去实现

上一篇:设计模式之观察者模式学习笔记
下一篇:设计模式之策略模式学习笔记

发表评论

最新留言

不错!
[***.144.177.141]2025年04月02日 12时16分46秒