Java常用设计模式实例学习:模板方法模式详解与应用场景

admin 2025-02-20 260 0

[id_1898384304]id_6[id_7697934[id_93[id_1729274603]101939]7]2595000]

[id_1900298552]

1.关于模板方法模式

模板方法模式属于一种行为型设计模式。

模板方法模式是定义一个操作中算法的骨架,并且把一些步骤延迟到子类中去。这样一来,模板方法模式就让子类在不改变算法结构的情况下,能够重新定义该算法的某些特定步骤。

本文以简历模板为场景来学习模板方法模式:

2.实现方式:模板方法模式

这个模式比较简单,直接进行设计模式编码。

为互联网企业提供的普通简历模板是一种简历模板,为国企提供的特殊面试模板也是一种简历模板。

[id_332882275]

AbstractResume 是抽象的简历模板类,它主要提供以下这些编码:

/**
 * 
 *
[id_2040536041]
 */
@Slf4j
@NoArgsConstructor
@RequiredArgsConstructor
[id_1038013594]
[id_603203778] abstract class AbstractResume {
    /**
     * 姓名
     */
    @Getter
    @NonNull
    private String name[id_1[id_1737830009]446734]
    /**
     * 是否填写家庭成员
     */
    private boolean fillInFamily = false;
    /**
     * 是否填写其他
     */
    private boolean fillInOther = false;
    /**
     * 填写简历 这里定义了算法骨架
     */
    public final void fillIn() {
        log.info("=====「{}」开始填写简历=====", name);
        //基本信息
        log.info("-----基本信息如下-----");
        fillInBasic();
        //教育背景
        log.info("-----教育背景如下-----");
        fillInEducation();
        //家庭成员
        if (fillInFamily) {
            log.info([id_100711142]);
            fillInFamily();
        }
        //项目经历
        log.info("-----项目经历如下-----");
        fillInProject();
        //自我总结
        log.info("-----自我总结如下-----");
        fillInSummary();
        //其他
        if (fillInOther) {
            log.info("-----其他如下-----");
            fillInOther();
        }
    }
    /**
     * 填写基本情况
     */
    protected void fillInBasic() {
        log.info("基本情况填写开始:");
        log.info("「{}」开始填写姓名...", name);
        log.info("「{}」开始填写性别...", name);
        log.info("「{}」开始填写出生日期...", name);
        log.info("「{}」开始填写籍贯...", name);
        log.info("「{}」开始填写政治身份...", name);
    }
    /**
     * 填写教育背景
     */
    protected void fillInEducation() {
        log.info([id_2117375422]);
        log.info("「{}」教育背景填写开始:", name);
        if (RandomUtils.nextBoolean()) {
            log.info("「{}」填写了本科阶段的求学经历...", name);
            if (RandomUtils.nextBoolean()) {
                log.info("「{}」填写了研究生阶段的求学经历...", name);
                if (RandomUtils.nextBoolean()) {
                    log.info("「{}」填写了博士阶段的求学经历...", name);
                }
            }
        }
        log.info("「{}」教育背景填写完成。", name);
    }
    /**
     * 填写家庭成员
     */
    protected void fillInFamily() {
        log.info("家庭成员要求填写父母、兄弟姐妹和儿女的情况。");
        log.info([id_862379121], name);
        if (RandomUtils.nextBoolean()) {
            log.info("「{}」填写了父母的基本情况...", name);
        }
        if (RandomUtils.nextBoolean()) {
            log.info("「{}」填写了兄弟姐妹的基本情况...", name);
        }
        if (RandomUtils.nextBoolean()) {
            log.info("「{}」填写了儿女的基本情况...", name);
        }
        log.info("「{}」家庭成员填写完成。", name);
    }
    /**
[id_187371784]
     */
    protected void fillInProject() {
        log.info("项目经验要求控制在5条以内。");
        log.info("「{}」家庭成员填写开始:", name);
        for (int i = 0; i < RandomUtils.nextInt(2, 8) && i < 5; i++) {
            log.info("「{}」填写了第「{}」条项目经验...", name, 1 + i);
        }
        log.info("「{}」项目经验填写完成。", name);
    }
    /**
     * 填写个人总结
     */
    protected void fillInSummary() {
        log.info("个人总结要求在20~100字内。");
        log.info([id_106800404], name);
        log.info("「{}」填写了「{}」个字...", name, RandomUtils.nextInt(20, 100));
        log.info("「{}」个人总结填写完成。", name);
    }
    /**
     * 其他
     */
    protected void fillInOther(){
        //do nothing
    }
}

模板实现:普通简历模板:CustomResume

/**
 * 

普通简历模板: 无需显示家庭成员和其他

* * @author hanchao */
@Slf4j public class CustomResume extends AbstractResume { public CustomResume(@NonNull String name) { super(name, false, false); } }

模板实现:特殊简历模板:

/**
 * 

有一种特殊的简历模板,这种模板需要填写家庭成员以及其他方面的内容,同时还自定义了基本信息。

* * @author hanchao */
@Slf4j public class SpecialResume extends AbstractResume { public SpecialResume(@NonNull String name) { super(name, true, true); } /** * 填写基本情况 这里是将算法的实现延迟到子类中 */ @Override protected void fillInBasic() { super.fillInBasic(); log.info("「{}」开始填写现居地...", super.getName()); log.info("「{}」开始填写工作年限...", super.getName()); log.info("「{}」开始填写是否已婚...", super.getName()); } /** * 其他 这里是将算法的实现延迟到子类中 */ @Override protected void fillInOther() { log.info("「{}」开始填写兴趣爱好...", super.getName()); } }

测试代码:

@Slf4j
public class TemplateMethodDemo {
    public static void main(String[] args) {
        //普通简历模板的填写
        AbstractResume resume = new CustomResume("张三");
        resume.fillIn();
        log.info(请提供需要改写的句子呀,你只给了“语言风格:保持原文风格,去掉最前面的序号 把长句拆分成多个小分句,分句越短越好”和“==================================",没有具体的句子呢。);
        //特殊建立模板的填写
        resume = new SpecialResume("李四");
        resume.fillIn();
    }
}

测试结果

2019-07-28 14:40:29,367  INFO - =====「张三」开始填写简历===== 
2019-07-28 14:40:29,371  INFO - -----基本信息如下----- 
2019-07-28 14:40:29,371  INFO - 基本情况填写开始: 
2019-07-28 14:40:29,371  INFO - 「张三」开始填写姓名... 
2019-07-28 14:40:29,371  INFO - 「张三」开始填写性别... 
2019-07-28 14:40:29,372  INFO - 「张三」开始填写出生日期... 
2019-07-28 14:40:29,372  INFO - 「张三」开始填写籍贯... 
2019-07-28 14:40:29,372  INFO - 「张三」开始填写政治身份... 
2019-07-28 14:40:29,372  INFO - -----教育背景如下----- 
2019-07-28 14:40:29,372  INFO - 教育背景要求填写本科以上教育经历。 
2019-07-28 14:40:29,372  INFO - 「张三」教育背景填写开始: 
2019-07-28 14:40:29,373  INFO - 「张三」填写了本科阶段的求学经历... 
2019-07-28 14:40:29,373  INFO - 「张三」填写了研究生阶段的求学经历... 
2019-07-28 14:40:29,373  INFO - 「张三」教育背景填写完成。 
2019-07-28 14:40:29,373  INFO - -----项目经历如下----- 
2019-07-28 14:40:29,373  INFO - 项目经验要求控制在5条以内。 
2019-07-28 14:40:29,373  INFO - 「张三」家庭成员填写开始: 
2019-07-28 14:40:29,375  INFO - 「张三」填写了第「1」条项目经验... 
2019-07-28 14:40:29,376  INFO - 「张三」填写了第「2」条项目经验... 
2019-07-28 14:40:29,376  INFO - 「张三」项目经验填写完成。 
2019-07-28 14:40:29,376  INFO - -----自我总结如下----- 
2019-07-28 14:40:29,376  INFO - 个人总结要求在20~100字内。 
2019-07-28 14:40:29,376  INFO - 「张三」个人总结填写开始: 
2019-07-28 14:40:29,376  INFO - 「张三」填写了「31」个字... 
2019-07-28 14:40:29,377  INFO - 「张三」个人总结填写完成。 
2019-07-28 14:40:29,377  INFO - ================================== 
2019-07-28 14:40:29,377  INFO - =====「李四」开始填写简历===== 
2019-07-28 14:40:29,378  INFO - -----基本信息如下----- 
2019-07-28 14:40:29,378  INFO - 基本情况填写开始: 
2019-07-28 14:40:29,378  INFO - 「李四」开始填写姓名... 
2019-07-28 14:40:29,378  INFO - 「李四」开始填写性别... 
2019-07-28 14:40:29,378  INFO - 「李四」开始填写出生日期... 
2019-07-28 14:40:29,378  INFO - 「李四」开始填写籍贯... 
2019-07-28 14:40:29,378  INFO - 「李四」开始填写政治身份... 
2019-07-28 14:40:29,379  INFO - 「李四」开始填写现居地... 
2019-07-28 14:40:29,379  INFO - 「李四」开始填写工作年限... 
2019-07-28 14:40:29,379  INFO - 「李四」开始填写是否已婚... 
2019-07-28 14:40:29,379  INFO - -----教育背景如下----- 
2019-07-28 14:40:29,379  INFO - 教育背景要求填写本科以上教育经历。 
2019-07-28 14:40:29,379  INFO - 「李四」教育背景填写开始: 
2019-07-28 14:40:29,379  INFO - 「李四」教育背景填写完成。 
2019-07-28 14:40:29,379  INFO - -----家庭成员如下----- 
2019-07-28 14:40:29,379  INFO - 家庭成员要求填写父母、兄弟姐妹和儿女的情况。 
2019-07-28 14:40:29,379  INFO - 「李四」家庭成员填写开始: 
2019-07-28 14:40:29,379  INFO - 「李四」填写了父母的基本情况... 
2019-07-28 14:40:29,380  INFO - 「李四」家庭成员填写完成。 
2019-07-28 14:40:29,380  INFO - -----项目经历如下----- 
2019-07-28 14:40:29,380  INFO - 项目经验要求控制在5条以内。 
2019-07-28 14:40:29,380  INFO - 「李四」家庭成员填写开始: 
2019-07-28 14:40:29,404  INFO - 「李四」填写了第「1」条项目经验... 
2019-07-28 14:40:29,405  INFO - 「李四」项目经验填写完成。 
2019-07-28 14:40:29,405  INFO - -----自我总结如下----- 
2019-07-28 14:40:29,405  INFO - 个人总结要求在20~100字内。 
2019-07-28 14:40:29,405  INFO - 「李四」个人总结填写开始: 
2019-07-28 14:40:29,405  INFO - 「李四」填写了「73」个字... 
2019-07-28 14:40:29,405  INFO - 「李四」个人总结填写完成。 
2019-07-28 14:40:29,405  INFO - -----其他如下----- 
2019-07-28 14:40:29,405  INFO - 「李四」开始填写兴趣爱好... 

3.模板方法模式与外观模式

两种模式的定义:

模板方法模式与外观模式较为相似,二者都有封装方法的作用。它们的不同之处主要体现在以下几个方面:

4.总结

最后以UML类图来总结本文的简历模板场景以及模板方法模式。

在这里插入图片描述