[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类图来总结本文的简历模板场景以及模板方法模式。
