资讯专栏INFORMATION COLUMN

把「模板方法」应用到实际项目中

RebeccaZhong / 1479人阅读

摘要:阅读原文把模板方法应用到实际项目中如果不在工作中思考,模板方法模式的概念和定义即使背再多遍估计也是徒劳,今天我思考如何解决实际项目中的问题时发现,模板方法正是解决问题的良策。

阅读原文:把「模板方法」应用到实际项目中

如果不在工作中思考,模板方法模式的概念和定义即使背再多遍估计也是徒劳,今天我思考如何解决实际项目中的问题时发现,模板方法正是解决问题的良策。

需求

我们项目中要实现一个创建会议的需求,但我们系统可设置将会议同步到其他第三方系统中。而在创建会议前要经过几个必须的步骤,比如验证冲突,计算循环规则,对比时间段是否符合等。

思路 不同点

创建会议的方式不同:

本地系统创建

第三方系统创建

相同点

验证会议是否冲突

根据循环规则计算出预定时间段

是否符合预定规则

特殊点

即使会议又冲突,但有需求是依然要能创建成功!所以验证冲突步骤是可选的。

业务梳理后如下:

开始抽象

只有抽象类能实现我们的要求,既能要一部分方法有实现又能实现抽象方法不用实现。

@Slf4j
public abstract class AbstarctRecurringHandler {

    /**
     * 处理创建会议
     */
    public final void handle() {
        if (isConfirm()) {
            calculateConflict();
        }
        calcBookingPeriod();
        checkRule();
        createEvent();
    }

    /**
     * 验证规则
     */
    public void checkRule() {}

    /**
     * 获取预定的所有会议时间段
     *
     * @return
     */
    public List calcBookingPeriod() {}

    /**
     * 计算冲突会议
     */
    public void calculateConflict() {}

    /**
     * 钩子方法
     *
     * @return
     */
    public abstract boolean isConfirm();

    public abstract void createEvent();
}
 

模板方法

我们这里的handle方法已经固定了整个创建会议的流程,并且我们使用final修饰,表示不允许别人修改这个过程。
不同的创建可能有不同的人来完成,这个能够避免部分人员的粗心大意也就是规范了创建流程,而且其他开发人员也不必再关心除创建会议之外的其他过程。

钩子方法

虽然我们的创建会议的整体过程不允许修改,但部分功能可能有所不同,所以我们需要钩子方法来使部分功能可选或者改变部分流程。钩子方法可使用默认值,也可由子类来决定是否改变。

两种不同的实现

两个子类唯一的职责就只剩单纯的创建功能。

本地创建

@Slf4j
@Service
public class LocalRecurringHandler extends AbstarctRecurringHandler {

    /**
     * 钩子方法
     *
     * @return
     */
    @Override
    public boolean isConfirm() {
        return true;
    }

    @Override
    public void createEvent() {
        //创建本地会议
    }

}

第三方创建

@Slf4j
@Service
public class EwsRecurringHandler extends AbstarctRecurringHandler {

    /**
     * 钩子方法
     *
     * @return
     */
    @Override
    public boolean isConfirm() {
        return false;
    }

    @Override
    public void createEvent() {
        //创建本地会议
    }

}
模板方法定义

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

角色

模板方法模式涉及到的角色有:

抽象模板角色

定义一组基本方法供子类实现,定义并实现组合了基本方法的模板方法。

具体模板角色

实现抽象模板角色定义的基本方法。

总结 好处

提高代码的复用性

相同的代码放到了抽象类中,复用且可维护性强。

具有一定的扩展性

不同的实现交由子类来自行实现,用子类来进行扩展。

反向控制

行为由父类控制,子类实现。

实践要在理论的基础之上,所以理论基础也是非常重要的。

往期文章一览

把「策略模式」应用到实际项目中

造个轮子,我学到了什么

技术面试中的软技能

关注 「码上实战」 回复 :面试视频 和 架构师 送你非常不错的资料。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74374.html

相关文章

  • webpack多页应用架构系列(十三):构建一个简单的模板布局系统

    摘要:原文地址如果您对本系列文章感兴趣,欢迎关注订阅这里前言上文多页应用架构系列十二利用生成普通网页页面模板我们基本上已经搞清楚如何利用来生成普通网页页面模板,本文将以我的脚手架项目介绍如何在这基础上搭建一套简单的模板布局系统。 本文首发于Array_Huang的技术博客——实用至上,非经作者同意,请勿转载。原文地址:https://segmentfault.com/a/1190000007...

    yedf 评论0 收藏0
  • Django 博客开发教程 6 - 真正的 Django 博客首页视图

    摘要:在此之前我们已经编写了的首页视图,并且配置了和模板,让能够正确地处理请求并返回合适的响应。正确引入了静态文件后样式显示正常了。在真正的博客首页视图追梦人物的博客的评论区留言。更多教程,请访问追梦人物的博客。 在此之前我们已经编写了 Blog 的首页视图,并且配置了 URL 和模板,让 Django 能够正确地处理 HTTP 请求并返回合适的 HTTP 响应。不过我们仅仅在首页返回了一句...

    yzzz 评论0 收藏0
  • webpack多页应用架构系列(十五):论前端如何在后端渲染开发模式下夹缝生存

    摘要:回到纯静态页面开发阶段,让页面不需要后端渲染也能跑起来。改造开始本文着重介绍如何将静态页面改造成后端渲染需要的模板。总结在后端渲染的项目里使用多页应用架构是绝对可行的,可不要给老顽固们吓唬得又回到传统前端架构了。 本文首发于Array_Huang的技术博客——实用至上,非经作者同意,请勿转载。原文地址:https://segmentfault.com/a/119000000820338...

    dinfer 评论0 收藏0
  • webpack多页应用架构系列(十五):论前端如何在后端渲染开发模式下夹缝生存

    摘要:回到纯静态页面开发阶段,让页面不需要后端渲染也能跑起来。改造开始本文着重介绍如何将静态页面改造成后端渲染需要的模板。总结在后端渲染的项目里使用多页应用架构是绝对可行的,可不要给老顽固们吓唬得又回到传统前端架构了。 本文首发于Array_Huang的技术博客——实用至上,非经作者同意,请勿转载。原文地址:https://segmentfault.com/a/119000000820338...

    dingda 评论0 收藏0
  • Lunar, 一个Python网络框架的实现

    摘要:核心的几个组件模板引擎,框架,请求和应答的处理还是有一些难度,但是经过一步步的分析和编码还是能够完成功能。模板引擎模板引擎是另外一个比较大和的模块。 前前后后,大概两个月的时间,lunar这个项目终于达到了一个很高的完整度。 Lunar是一个Python语言的网络框架,类似于Django,Flask,Tornado等当下流行的web framework。最初有这个想法是在大二下学期,...

    邱勇 评论0 收藏0

发表评论

0条评论

RebeccaZhong

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<