美文网首页
02 设计模式之模板方法

02 设计模式之模板方法

作者: 滔滔逐浪 | 来源:发表于2022-06-18 22:07 被阅读0次

什么是模板方法

1,定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成
模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定的步骤。
2,模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术,没有关联关系。因此,在模板方法模式的类结构

核心设计要点:
AbstratClass: 抽象类,定义并实现一个模板方法。这个模板方法定义了算法的骨架,而逻辑的组成步骤在相应的抽象过程中,推迟到子类实现。

ConcreateClass: 实现父类所定义的一个或者多个抽象方法。
一般模板方法是结合策略模式一起使用
因为策略模式,相同的事,但是有不同的策略实现。


image.png

. 聚合支付系统异步回调、QQ联合登录、对接第三方短信接口、分布式锁实现、jdbc模板

  1. Servlet 请求

对接第三方短信接口
对接阿里云 、华为云、腾讯云 相同事情存放在骨架中(抽象类中 交给子类具体发送)
kafka、rocketmq
kafka
amqpTemplate---执行发送投递消息kafka
rabbitmq
amqpTemplate---执行发送投递消息rabbitmq

分布式锁有哪些实现方式
1.zk分布式锁
2.redis分布式锁
3.数据库分布式锁
分布式锁 获取锁、释放锁
class ZkLock{
tryLock(){
Long startTime = System.currentTimeMillis();
获取锁-------zk获取锁具体流程
Long endTime = System.currentTimeMillis();
获取锁时间endTime-startTime
}
}
class RedisLock{
tryLock(){
Long startTime = System.currentTimeMillis();
获取锁-------redis获取锁具体流程
Long endTime = System.currentTimeMillis();
获取锁时间endTime-startTime
}
}
模板重构 有共同的骨架,骨架中有些部分细节不一样 使用模板方法设计模式重构。
模式模式优缺点

1,优点:
模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。子类实现算法的的某些细节,有助于算法的扩展。通过一个父类调用子类中实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”
2,缺点
每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象
3.使用场景
在某些类的算法中,用来相同的方法,造成代码的重复。控制子类扩展。子类必须遵守算法规则。模板方法设计模式配合抽象类实现

相同的代码
共同的骨架:

package com.taotao.template;

import com.taotao.template.imple.RedisDistrbutedLockTemplate;
import lombok.extern.slf4j.Slf4j;

/**
 * @author wangjin
 * @title: DistributedLockTemplate
 * @projectName designmodule
 * @description: TODO
 * @date 2022/6/18 0018 16:57
 */
@Slf4j
public abstract class DistributedLockTemplate {
    //分布式模板

    /**
     * @return * @return: null
     * @Author wangjin
     * @Description //获取锁的方法
     * @Date 2022/6/18 0018
     * @Param * @param null:
     **/
    public void LockTemplate() {
        //开始时间
        Long startTime = System.currentTimeMillis();
        tryLock();
        //结束时间
        Long endTime = System.currentTimeMillis();
        log.info("获取锁的时间:{}",(endTime-startTime));
    }

    protected abstract void tryLock();

    //释放锁的方法
    public void unlockTemplate() {
        //开始时间
        Long startTime = System.currentTimeMillis();
        tryunlock();
        //结束时间
        Long endTime = System.currentTimeMillis();
        log.info("释放锁的时间:{}",(endTime-startTime));
    }

    protected abstract void tryunlock();

    public static void main(String[] args) {
        DistributedLockTemplate distributedLockTemplat=new RedisDistrbutedLockTemplate();
        distributedLockTemplat.LockTemplate();
    }
}


具体实现

@Component
public class RedisDistrbutedLockTemplate  extends DistributedLockTemplate {
    @Override
    protected void tryLock() {
           try {
               Thread.sleep(10);
           }catch (Exception e){

           }
        System.out.println("redis获取分布式锁");
    }

    @Override
    protected void tryunlock() {
        try {
            Thread.sleep(10);
        }catch (Exception e){

        }
        System.out.println("redis释放分布式锁");
    }
}



package com.taotao.template.imple;

import com.taotao.template.DistributedLockTemplate;
import org.springframework.stereotype.Component;

/**
 * @author wangjin
 * @title: RedisDistrbutedLockTemplate
 * @projectName designmodule
 * @description: TODO
 * @date 2022/6/18 0018 17:10
 */
@Component
public class ZKDistrbutedLockTemplate extends DistributedLockTemplate {
    @Override
    protected void tryLock() {
           try {
               Thread.sleep(10);
           }catch (Exception e){

           }
        System.out.println("zk获取分布式锁");
    }

    @Override
    protected void tryunlock() {
        try {
            Thread.sleep(10);
        }catch (Exception e){

        }
        System.out.println("zk释放分布式锁");
    }
}

模板工厂

package com.taotao.factory;

import com.taotao.template.DistributedLockTemplate;
import com.taotao.utils.SpringUtils;

/**
 * @author wangjin
 * @title: TemplateFactory
 * @projectName designmodule
 * @description: TODO
 * @date 2022/6/18 0018 21:03
 */
public class TemplateFactory {

    public static DistributedLockTemplate getPayCallbackTemplate(String templateId) {
        DistributedLockTemplate payCallbackTemplate = (DistributedLockTemplate) SpringUtils.getBean(templateId);
        return payCallbackTemplate;
    }
}



访问测试

package com.taotao.controller;

import com.taotao.factory.TemplateFactory;
import com.taotao.template.DistributedLockTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author wangjin
 * @title: TemplateController
 * @projectName designmodule
 * @description: TODO
 * @date 2022/6/18 0018 21:07
 */
@RestController
@Slf4j
public class TemplateController {

    @RequestMapping("templateLock")
    public String  templateLock(String templateId){
        DistributedLockTemplate payCallbackTemplate = TemplateFactory.getPayCallbackTemplate(templateId);
        try {
            payCallbackTemplate.LockTemplate();
            log.info("<lockTest>");
            payCallbackTemplate.unlockTemplate();
            return "ok";
        } catch (Exception e) {
            payCallbackTemplate.unlockTemplate();
            return "error";
        }
    }
}


相关文章

网友评论

      本文标题:02 设计模式之模板方法

      本文链接:https://www.haomeiwen.com/subject/xookvrtx.html