Java设计模式 (一) 模板方法设计模式

这篇具有很好参考价值的文章主要介绍了Java设计模式 (一) 模板方法设计模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是模板方法设计模式?

模板方法设计模式是一种行为型设计模式,它定义了一个算法的骨架,并将一些步骤的具体实现延迟到子类中。模板方法模式可以帮助确保在算法的不同部分中保持一致性,同时也允许子类根据需要进行具体实现。

模板方法模式的关键特点包括:

  • 抽象类: 定义一个抽象类,其中包含一个模板方法,该方法定义了算法的骨架。这个抽象类可以包含一些通用的实现或共享的代码。
  • 具体步骤: 在抽象类中,将算法的不同步骤定义为抽象方法。这些步骤需要由具体的子类来实现。
  • 模板方法: 这是算法的核心方法,它包含了算法的基本步骤,可能包括调用不同的具体步骤方法。这个方法通常是 final,以防止子类修改整体算法结构。
  • 钩子方法:钩子方法是一种在抽象类中定义的方法,子类可以选择是否覆盖它。这些方法通常是空方法,可以在模板方法的执行过程中被调用,以便影响算法的某些特定步骤。

模板方法设计模式的优点包括:

  • 提供了一种统一的算法结构,使得算法在不同的子类中保持一致。
  • 提供了代码复用和共享的机制,避免了重复的代码。
  • 允许子类根据需要覆盖特定步骤的实现,实现了开闭原则。

一个典型的模板方法设计模式的例子是 Java 中的 AbstractList 类,它定义了访问和修改列表的算法框架,然后由具体的子类(如 ArrayList、LinkedList 等)实现不同的细节。

总之,模板方法设计模式允许您定义一个算法的骨架,然后将一些具体的步骤延迟到子类中实现。这种方式提高了代码的复用性和可维护性,同时也确保了算法的一致性。

模板抽象类


import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @author Wang
 */
@Slf4j
public abstract class AbstractSynFileHandler<T> implements InitializingBean {

    /**
     * parseFile
     * @param inputStream   inputStream
     * @return  <T> List<T>
     * @throws IOException  IOException
     */
    public abstract List<T> parseFile(InputStream inputStream) throws IOException;

    /**
     * getHandlerName
     * @return  String
     */
    public abstract String getFileName();


    @Override
    public void afterPropertiesSet(){
        SynFileFactory.registerHandler(getFileName(), this);
    }

}

在这个代码片段中,AbstractSynFileHandler 是一个抽象类,定义了一个模板方法模式的结构。模板方法模式的关键是抽象类中的模板方法,该方法定义了一个算法的基本步骤,但是某些步骤的具体实现留给了子类来完成。

在这个代码中,parseFilegetFileName方法是需要子类实现的具体步骤。这些步骤的具体实现因应用而异,所以它们被定义为抽象方法。然后,在 afterPropertiesSet方法中,SynFileFactory.registerHandler 方法被调用,该方法将当前实例注册到 SynFileFactory中,实现了模板方法模式中的模板方法调用和延迟到子类的具体实现。文章来源地址https://www.toymoban.com/news/detail-655070.html

子类实现


import cn.hutool.core.text.CharSequenceUtil;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Wang
 */
@RequiredArgsConstructor
@Slf4j
@Component
public class AccountHandler extends AbstractSynFileHandler<AccountEntity> {


    @Override
    public List<AccountEntity> parseFile(InputStream inputStream) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        List<AccountEntity> list = new ArrayList<>();
        String line;
        int lineNum = 0;
        while ((line = reader.readLine()) != null) {
            if (lineNum == 0) {
                lineNum++;
                continue;
            }
            String[] values = line.split(Cons.Delimiter.WAVY);
            AccountEntity accountEntity = new AccountEntity();
            this.buildEntity(values, accountEntity);
            list.add(accountEntity);
            lineNum++;
        }
        return list;
    }

    private void buildEntity(String[] values, AccountEntity accountEntity) {
        if(CharSequenceUtil.isNotBlank(values[0])){
            accountEntity.setSiebelId(values[0]);
        }
        if(CharSequenceUtil.isNotBlank(values[1])){
            accountEntity.setFirstName(values[1]);
        }
        if(CharSequenceUtil.isNotBlank(values[2])){
            accountEntity.setLastName(values[2]);
        }
        if(CharSequenceUtil.isNotBlank(values[3])){
            accountEntity.setMiddleInitial(values[3]);
        }
        if(CharSequenceUtil.isNotBlank(values[4])){
            accountEntity.setEmail(values[4]);
        }
        if(CharSequenceUtil.isNotBlank(values[5])){
            accountEntity.setCellPhone(values[5]);
        }
        if(CharSequenceUtil.isNotBlank(values[6])){
            accountEntity.setAddress1(values[6]);
        }
        if(CharSequenceUtil.isNotBlank(values[7])){
            accountEntity.setAddress2(values[7]);
        }
        if(CharSequenceUtil.isNotBlank(values[8])){
            accountEntity.setCity(values[8]);
        }
        if(CharSequenceUtil.isNotBlank(values[9])){
            accountEntity.setState(values[9]);
        }
        if(CharSequenceUtil.isNotBlank(values[10])){
            accountEntity.setZip(values[10]);
        }
    }

    @Override
    public String getFileName() {
        return SiebelCons.ACCOUNT;
    }
}

到了这里,关于Java设计模式 (一) 模板方法设计模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【玩转23种Java设计模式】行为型模式篇:模板模式

    软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接:【玩转23种Java设计模式】学习目录汇总

    2024年02月16日
    浏览(23)
  • 【Java基础教程】(十五)面向对象篇 · 第九讲:抽象类和接口——定义、限制与应用的细节,初窥模板设计模式、工厂设计模式与代理设计模式~

    掌握 抽象类和接口的定义、使用、区别、常见设计模式; 抽象类是代码开发中的重要组成部分,利用抽象类可以明确地定义子类需要覆写的方法,这样相当于在语法程度上对子类进行了严格的定义限制,代码的开发也就更加标准。下面具体介绍抽象类的概念。 普通类可以直

    2024年02月16日
    浏览(32)
  • java设计模式-工厂方法模式

    定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程; 在系统增加新的产品时只需要添加

    2024年02月04日
    浏览(29)
  • java设计模式【工厂方法模式】

    工厂方法模式 ( FACTORY METHOD )是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;

    2024年02月05日
    浏览(42)
  • Java 基础:设计模式之工厂方法模式

    工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它提供了一个创建对象的通用接口,但将实际创建逻辑推迟到子类中实现。这种模式允许客户端使用抽象接口来创建特定类型的对象,而无需了解具体的实现细节。以下是工厂方法模式的详细分析: 一. 定义与目的

    2024年04月29日
    浏览(29)
  • Java与设计模式(2):工厂方法模式

    工厂方法模式是一种创建型设计模式,它提供了一种将对象的创建委托给子类的方式。在工厂方法模式中,我们定义一个抽象的工厂类,该类负责定义创建对象的接口,但具体的对象创建由子类来实现。这样可以将对象的创建和使用解耦,使得系统更加灵活和可扩展。 工厂方

    2024年02月11日
    浏览(35)
  • Java工厂方法设计模式

    工厂方法模式是 Java 中常用的一种创建型设计模式,它通过定义一个抽象的工厂接口来创建对象,从而将对象的创建与具体业务逻辑分离开来,提高了代码的可维护性和可读性。 抽象工厂:定义了创建产品对象的接口。 具体工厂:实现了抽象工厂中定义的接口,负责创建具

    2024年02月13日
    浏览(28)
  • Java设计模式 - 学习方法

    设计模式 软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 在学习之前,需要先搞明白两个问题: 设计

    2024年02月07日
    浏览(26)
  • 【Java 设计模式】创建型之工厂方法模式

    在软件开发中,工厂方法模式是一种常见的创建型设计模式, 它提供了一种将对象的实例化延迟到子类的方法 。工厂方法模式通过定义一个创建对象的接口,但是让子类决定实例化哪个类。在本文中,我们将介绍 Java 设计模式中的工厂方法模式,了解其定义、使用场景以及

    2024年01月17日
    浏览(35)
  • 设计模式---模板方法模式

            所谓模板方法模式,就是提供一种方法的模板来实现一种规范,其他人可以利用这个模板定义自己的逻辑。         在Java编程中的应用,主要就是通过接口或者抽象类来实现的,抽象类中可以把逻辑函数声明为final类型,表示不能被重写,即不能改变逻辑。在接口中

    2024年04月24日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包