博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试必问的设计模式 | 模板方法模式
阅读量:4104 次
发布时间:2019-05-25

本文共 3210 字,大约阅读时间需要 10 分钟。

一、简介

模板方法模式 (Template Pattern) 是一种 行为型模式,基本思路是抽象类定义算法基本骨架,相同行为定义在抽象方法中,不同行为实现部分交给子类完成。

二、示例

这里我们使用模板方法模式模拟一个支付功能,进行支付宝和微信支付,我们先定义一个支付功能的抽象类,这里提供了 4 个方法,callBack 封装处理流程的方法,verifyToken,payResult 这两个方法分别是验证 token 和流程处理的方法,在两种支付功能中代码实现不一样,所以定义为抽象类,由子类来实现,log 是打印日志,两种功能都需要打印日志,所以由抽象类统一实现。

public abstract class AbstractPayTemplate {
//回调方法 public String callBack(Map
parm) {
boolean res = verifyToken(parm); if (res) {
log(parm); Map
payResult = payResult(parm); return payResult.get("res"); } return "支付失败"; } //验证token protected abstract boolean verifyToken(Map
parm); //打印日志 private void log(Map
res) {
System.out.println("记录日志 >>>" + res); } //返回结果 protected abstract Map
payResult(Map
parm);}

定义 2 种支付的实现类,继承抽象类,实现其各自的功能

@Componentpublic class AliPayTemplate extends AbstractPayTemplate {
@Override protected boolean verifyToken(Map
parm) {
return true; } @Override protected Map
payResult(Map
parm) {
Map
res = new HashMap<>(); res.put("res","阿里支付成功"); return res; }}
@Componentpublic class WeChatTemplate extends AbstractPayTemplate {
@Override protected boolean verifyToken(Map
parm) {
return true; } @Override protected Map
payResult(Map
parm) {
Map
res = new HashMap<>(); res.put("res","微信支付成功"); return res; }}

以上,就是模板方法的实现思路,现在我们做个测试,我们定义一个工厂模式,针对不同的需求,调用不同的实现类。

由于我们把两种支付的实现类都注入 Spring 容器中了,所以我们可以实现 ApplicationContextAware 动态从 Spring 中获取

@Componentpublic class PayFactory implements ApplicationContextAware {
private static ApplicationContext applicationContext; /** * 工厂模式获取模板 */ public static AbstractPayTemplate getAbstractPayTemplate(String beanName) {
AbstractPayTemplate abstractPayTemplate = applicationContext.getBean(beanName,AbstractPayTemplate.class); return abstractPayTemplate; } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if(PayFactory.applicationContext==null){
PayFactory.applicationContext = applicationContext; } }}

然后我们再写个接口,根据传参调用不同实现类

@RestControllerpublic class PayController {
@RequestMapping("/pay") public String pay(String payName, String token) {
AbstractPayTemplate abstractPayTemplate = PayFactory.getAbstractPayTemplate(payName); Map
parm = new HashMap<>(); parm.put("token", token); return abstractPayTemplate.callBack(parm); }}

访问下面链接,将会模拟返回不同结果

http://localhost:8080/pay?payName=weChatTemplate&token=123

http://localhost:8080/pay?payName=aliPayTemplate&token=123

三、总结

1、模板方法模式策略模式有什么区别

模板方法模式是定义一个算法流程,将一些特定步骤的具体实现、延迟到子类。使得可以在不改变算法流程的情况下,通过不同的子类、来实现“定制”流程中的特定的步骤。

策略模式是使用一些算法相互替换,不影响返回结果。

2、模板方法模式的优缺点

优点

减少代码冗余,使代码结构更加清晰

缺点

不同实现需要定义子类,类增加,设计会更加抽象

3、场景

1、某些业务中,使用了相同的方法,造成代码重复

4、类图

—— 完

ABOUT

公众号:【星尘Pro】

github:

推荐阅读

转载地址:http://hyfsi.baihongyu.com/

你可能感兴趣的文章
基于Visual C++2013拆解世界五百强面试题--题5-自己实现strstr
查看>>
Linux 线程信号量同步
查看>>
C++静态成员函数访问非静态成员的几种方法
查看>>
类中的静态成员函数访问非静态成员变量
查看>>
C++学习之普通函数指针与成员函数指针
查看>>
C++的静态成员函数指针
查看>>
Linux系统编程——线程池
查看>>
yfan.qiu linux硬链接与软链接
查看>>
Linux C++线程池实例
查看>>
shared_ptr简介以及常见问题
查看>>
c++11 你需要知道这些就够了
查看>>
c++11 你需要知道这些就够了
查看>>
shared_ptr的一些尴尬
查看>>
C++总结8——shared_ptr和weak_ptr智能指针
查看>>
c++写时拷贝1
查看>>
C++ 写时拷贝 2
查看>>
Linux网络编程---I/O复用模型之poll
查看>>
Java NIO详解
查看>>
单列模式-编写类ConfigManager读取属性文件
查看>>
java中float和double的区别
查看>>