设计模式之模板模式学习笔记

前言

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

定义

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

结构图

在这里插入图片描述角色拆解分析:
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.面对核心算法,可以将其设定为模板方法,周边功能由子类去实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值