设计模式-模板模式(Template)介绍和使用

目录

1 模板模式(Template)

2 抽象Template类

 3 具体Template类

3.1 TemplateA类

3.2 TemplateB类 

 3.3 TemplateC类

3.4 TemplateD类

4 调试代码

 5 调试结果

 注:


1 模板模式(Template)

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

主要解决:一些方法通用,却在每一个子类都重新写了这一方法。

何时使用:有一些通用的方法。

如何解决:将这些通用算法抽象出来。

关键代码:在抽象类实现,其他步骤在子类实现。

应用实例: 1、在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。 2、西游记里面菩萨定好的 81 难,这就是一个顶层的逻辑骨架。 3、spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。

优点: 1、封装不变部分,扩展可变部分。 2、提取公共代码,便于维护。 3、行为由父类控制,子类实现。

缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。

注意事项:为防止恶意操作,一般模板方法都加上 final 关键词。

2 抽象Template类

package com.xudongbase.designpattern.template;

/**
 * 模板(Template) 模式抽象Template类
 *
 * @author xudongmaster
 */
public abstract class CommonTemplate {
    /**
     * 生成模板
     */
    public final void createTemplate() {
        System.out.println("开始生成模板");
        //通用逻辑
        commonLogic();
        //特殊逻辑
        specialLogic();
        System.out.println("结束生成模板\n");
    }

    /**
     * 通用逻辑
     */
    protected final void commonLogic() {
        System.out.println("这是通用逻辑");
    }

    /**
     * 特殊逻辑
     */
    protected abstract void specialLogic();
}

 3 具体Template类

3.1 TemplateA类

package com.xudongbase.designpattern.template;

import org.springframework.stereotype.Component;

/**
 * 模板(Template) 模式具体Template类A
 *
 * @author xudongmaster
 */
@Component("TemplateA")
public class TemplateA extends CommonTemplate {
    /**
     * 特殊逻辑
     */
    @Override
    public void specialLogic() {
        System.out.println("这是模板A的特殊逻辑");
    }
}

3.2 TemplateB类 

package com.xudongbase.designpattern.template;

import org.springframework.stereotype.Component;

/**
 * 模板(Template) 模式具体Template类B
 *
 * @author xudongmaster
 */
@Component("TemplateB")
public class TemplateB extends CommonTemplate {
    /**
     * 特殊逻辑
     */
    @Override
    public void specialLogic() {
        System.out.println("这是模板B的特殊逻辑");
    }
}

 3.3 TemplateC类

package com.xudongbase.designpattern.template;

import org.springframework.stereotype.Component;

/**
 * 模板(Template) 模式具体Template类C
 *
 * @author xudongmaster
 */
@Component("TemplateC")
public class TemplateC extends CommonTemplate {
    /**
     * 特殊逻辑
     */
    @Override
    public void specialLogic() {
        System.out.println("这是模板C的特殊逻辑");
    }
}

3.4 TemplateD类

package com.xudongbase.designpattern.template;

import org.springframework.stereotype.Component;

/**
 * 模板(Template) 模式具体Template类D
 *
 * @author xudongmaster
 */
@Component("TemplateD")
public class TemplateD extends CommonTemplate {
    /**
     * 特殊逻辑
     */
    @Override
    public void specialLogic() {
        System.out.println("这是模板D的特殊逻辑");
    }
}

4 调试代码

package com.xudongbase.designpattern;

import com.xudongbase.designpattern.template.CommonTemplate;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Map;

@SpringBootTest
public class TemplateTest {
    @Autowired
    private Map<String, CommonTemplate> templateMap;

    /**
     * 测试模板模式
     */
    @Test
    public void testTemplate(){
        //生成模板A
        templateMap.get("TemplateA").createTemplate();
        //生成模板B
        templateMap.get("TemplateB").createTemplate();
        //生成模板C
        templateMap.get("TemplateC").createTemplate();
        //生成模板D
        templateMap.get("TemplateD").createTemplate();
    }
}

 5 调试结果

 注:

(1)具体Template类的调用使用了策略模式。

(2) 需要查看源码请前往Gitee的xudongbase项目design_pattern分支。

xudongbase: 主要是项目中可以用到的共通方法 - Gitee.comhttps://gitee.com/xudong_master/xudongbase/tree/design_pattern/

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值