0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何通过模板模式重构代码

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-08 16:15 次阅读

1、什么是模板模式?

Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.

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

说人话:父类模板方法定义不变的流程,子类重写流程中的方法。

2、模板模式定义

图片

①、AbstractClass 抽象模板

一、基本方法

上面的 baseOperation() 或者 customOperation() 方法,也叫基本操作,是由子类实现的方法,并且在模板方法中被调用。

基本方法尽量设计为protected类型, 符合迪米特法则, 不需要暴露的属性或方法尽量不要设置为protected类型。实现类若非必要, 尽量不要扩大父类中的访权限。

二、模板方法

上面的 templateMethod() 方法,可以有一个或者几个,实现对基本方法的调度,完成固定的逻辑。

为了防止恶意操作,通常模板方法都加上 final 关键字,不允许覆写。

②、ConcreteClass 具体模板

实现父类定义的一个或多个抽象方法,也就是父类定义的基本方法在子类中得以实现。

3、模板模式通用代码

public abstract class AbstractClass {
    // 共同的且繁琐的操作
    private void baseOperation() {
        // do something
    }

    // 由子类定制的操作
    protected abstract void customOperation();

    // 模板方法定义的框架
    public final void templateMethod() {
        /**
         * 调用基本方法,完成固定逻辑
         */
        baseOperation();
        customOperation();
    }

}
public class ConcreteClass1 extends AbstractClass{

    @Override
    protected void customOperation() {
        // 具体模板1 业务逻辑
        System.out.println("具体模板1:customOperation()");
    }
}
public class ConcreteClass2 extends AbstractClass{
    @Override
    protected void customOperation() {
        // 具体模板2 业务逻辑
        System.out.println("具体模板2:customOperation()");
    }
}

测试:

public class TemplateClient {
    public static void main(String[] args) {
        AbstractClass abstractClass1 = new ConcreteClass1();
        AbstractClass abstractClass2 = new ConcreteClass2();
        applyTemplate(abstractClass1);
        applyTemplate(abstractClass2);
    }

    public static void applyTemplate(AbstractClass abstractClass){
        abstractClass.templateMethod();
    }
}

4、模板模式优点

①、封装不变部分, 扩展可变部分

把认为是不变部分的算法封装到父类实现, 而可变部分的则可以通过继承来继续扩展。

②、提取公共部分代码, 便于维护

③、行为由父类控制, 子类实现

基本方法是由子类实现的, 因此子类可以通过扩展的方式增加相应的功能, 符合开闭原则。

5、模板模式缺点

①、子类执行的结果影响了父类的结果,这和我们平时设计习惯颠倒了,在复杂项目中,会带来阅读上的难度。

②、可能引起子类泛滥和为了继承而继承的问题

6、回调

为了解决模板模式的缺点,我们可以利用回调函数代替子类继承。

图片

public interface Callback {
    void customOperation();
}
public class SubCallback implements Callback{
    @Override
    public void customOperation() {
        System.out.println("SubCallback customOperation");
    }
}
/**
 * 模板类
 * 声明为 final,无法被继承
 */
public final class Template {
    private void baseOperation(){
        System.out.println("模板类公共操作");
    }

    public void templateMethod(Callback callback){
        baseOperation();
        callback.customOperation();
    }
}

测试:

public class TemplateClient {
    public static void main(String[] args) {
        Template template = new Template();
        applyTemplate(template);
    }

    public static void applyTemplate(Template template){
        Callback callback = new SubCallback();
        template.templateMethod(callback);
    }
}

Template是一个稳定的final类,无法被继承,不存在子类行为影响父类结果的问题,而Callback是一个接口,为了继承而继承的问题消失了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 封装
    +关注

    关注

    126

    文章

    7775

    浏览量

    142708
  • 模板
    +关注

    关注

    0

    文章

    108

    浏览量

    20554
  • 函数
    +关注

    关注

    3

    文章

    4304

    浏览量

    62420
  • 代码
    +关注

    关注

    30

    文章

    4742

    浏览量

    68333
收藏 人收藏

    评论

    相关推荐

    改善代码质量的6种重构模式

    根据上面所讨论的代码坏味道,下面给出可以有效解决这些问题的6种重构模式,合理使用这些模式能够帮你解决大多数的代码质量问题并成为一名更优秀的开发者。1.抽取类与移动方法:如上所述,诸如过
    发表于 12-12 16:09

    为什么要重构?如何重组Python包?

    导航时,它们也是您最好的GPS导航器。  开始重构—重组/重组  在本节中,我将config.py通过重组结构,合并重复的方法,分解和编写测试代码以确保向后兼容性,向您展示一个示例
    发表于 09-15 15:28

    基于ATmega162的自重构机器人控制模式

    本文通过对自重构机器人的特点和总体结构进行分析,提出一种基于ATmega162 的部分主从分布式控制模式,该模式利用ATmega162 的外扩存储器功能实现扩展总线,从而对自
    发表于 06-18 10:49 39次下载

    模板方法模式在回溯算法中的应用

    描述了模板方法模式及回溯算法的模板方法模式的Java 语言实现,该实现使得回溯算法的实现达到了可扩展性、灵活性和可插入性三个目标,提高了算法的可维护性和可复用性。
    发表于 01-15 16:48 20次下载

    模板方法模式在回溯算法中的应用

    描述了模板方法模式及回溯算法的模板方法模式的Java 语言实现,该实现使得回溯算法的实现达到了可扩展性、灵活性和可插入性三个目标,提高了算法的可维护性和可复用性。
    发表于 01-15 16:51 0次下载

    一种基于体系结构模板的粗粒度可重构SoC设计方法

    针对传统的面向应用领域的多核SoC体系结构设计方法存在系统结构探索空间大、设计复杂度高等问题,提出了一种基于体系结构模板的粗粒度可重构SoC系统架构设计方法。该设计方法以体系结构设计为中心,体系结构模板
    发表于 11-29 10:12 0次下载
    一种基于体系结构<b class='flag-5'>模板</b>的粗粒度可<b class='flag-5'>重构</b>SoC设计方法

    使用英特尔SIMD数据布局模板提高矢量化效率

    了解英特尔®SIMD数据布局模板(英特尔®SDLT)可通过指定首选SIMD数据布局来提高性能,而无需重构代码
    的头像 发表于 11-05 07:10 2066次阅读

    MM32单片机的模板代码合集免费下载

      本文档的主要内容详细介绍的是MM32单片机的模板代码合集免费下载。
    发表于 10-14 17:16 363次下载
    MM32单片机的<b class='flag-5'>模板</b><b class='flag-5'>代码</b>合集免费下载

    HarmonyOS如何自动生成JS FA调用Java PA的模板代码

    模板代码,且模板代码可能与业务代码相互耦合,使得代码可维护性和可读性较差。于是,js2java-
    的头像 发表于 09-28 10:09 2095次阅读

    SOC课程——③——Verilog程序(典型电路的模板

    典型电路的模板1 模板代码1.1 输出时序逻辑的模板代码1.1.1 异步复位的时序电路(用的最多)1.1.2 同步复位的时序电路1.2 输出
    发表于 12-22 18:57 4次下载
    SOC课程——③——Verilog程序(典型电路的<b class='flag-5'>模板</b>)

    重构或重新设计时验证代码

      与重新设计相反,重构是一种优化代码内部实现的努力,以提高其可维护性并降低其总体运营成本。和许多人一样,我相信软件重构的最佳定义之一是由Martin Fowler在他的“重构书”中写
    的头像 发表于 11-25 15:17 418次阅读

    如何借助GPT-4评审、重构代码

    重构代码之所以重要,有以下几个原因:它增强了可读性和可维护性,使开发人员更容易理解和修改代码。它还有助于防止潜在的错误,并确保您的代码遵循已建立的最佳实践。最终,
    的头像 发表于 03-31 09:27 2741次阅读

    设计模式行为型:模板方法模式

    模板模式中,一个抽象类公开定义了执行它的方法的方式/模板
    的头像 发表于 06-07 15:13 562次阅读
    设计<b class='flag-5'>模式</b>行为型:<b class='flag-5'>模板</b>方法<b class='flag-5'>模式</b>

    代码重构的经验总结

    具体的重构手段可参考《代码大全2》或《重构:改善既有代码的设计》,本文不再班门弄斧,而侧重重构时一些粗浅的“方法论”,旨在提高
    的头像 发表于 08-23 10:10 556次阅读
    <b class='flag-5'>代码</b><b class='flag-5'>重构</b>的经验总结

    重构:改善既有代码的设计」实战篇

    代码层面的整理,它更是一种软件开发的哲学,强调持续改进和适应变化的重要性。    书中通过详细的案例分析和代码示例,将理论与实践巧妙地融合在一起。我尤其赞赏作者 如何将复杂的重构任务
    的头像 发表于 08-14 10:42 205次阅读
    「<b class='flag-5'>重构</b>:改善既有<b class='flag-5'>代码</b>的设计」实战篇