API对接之模板方法

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

API对接之模板方法

定义

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

一个栗子

引用菜鸟教程的一个例子

父类定义一个步骤/模板,一般会有默认的步骤实现,只留一个抽象方法留到实现类中实现。

public abstract class Game {
   abstract void initialize();
   abstract void startPlay();
   abstract void endPlay();
 
   //模板
   public final void play(){
 
      //初始化游戏
      initialize();
 
      //开始游戏
      startPlay();
 
      //结束游戏
      endPlay();
   }
}

子类进行具体的实现

public class Football extends Game {
 
   @Override
   void endPlay() {
      System.out.println("Football Game Finished!");
   }
 
   @Override
   void initialize() {
      System.out.println("Football Game Initialized! Start playing.");
   }
 
   @Override
   void startPlay() {
      System.out.println("Football Game Started. Enjoy the game!");
   }
}
public static void main(String[] args) {
      Game game = new Football();
      game.play();      
   }

spring中的模板

spring框架中也提供了一些模板如JdbcTemplate、RestTemplate、RestTemplate。

JdbcTemplate 只需传入要执行的方法ConnectionCallback,其他工作交给模板处理。

// 构造函数注入了DataSource
public JdbcTemplate(DataSource dataSource) {
  setDataSource(dataSource);
  afterPropertiesSet();
}

/**
* 模板步骤 
* 1. 打开链接 Connection
* 2. 执行action (sql)
* 3. 释放链接 releaseConnection
**/
public <T> T execute(ConnectionCallback<T> action) throws DataAccessException {
        Assert.notNull(action, "Callback object must not be null");

        Connection con = DataSourceUtils.getConnection(obtainDataSource());
        try {
            // Create close-suppressing Connection proxy, also preparing returned Statements.
            Connection conToUse = createConnectionProxy(con);
            return action.doInConnection(conToUse);
        }
        catch (SQLException ex) {
            // Release Connection early, to avoid potential connection pool deadlock
            // in the case when the exception translator hasn't been initialized yet.
            String sql = getSql(action);
            DataSourceUtils.releaseConnection(con, getDataSource());
            con = null;
            throw translateException("ConnectionCallback", sql, ex);
        }
        finally {
            DataSourceUtils.releaseConnection(con, getDataSource());
        }
    }

redisTemplate 也类似,处理的业务逻辑更多些

  1. 获取链接
  2. 执行action
  3. 关闭资源、断开链接
public <T> T execute(RedisCallback<T> action, boolean exposeConnection, boolean pipeline) {

 Assert.isTrue(initialized, "template not initialized; call afterPropertiesSet() before using it");
 Assert.notNull(action, "Callback object must not be null");

 RedisConnectionFactory factory = getRequiredConnectionFactory();
 RedisConnection conn = null;
 try {

  if (enableTransactionSupport) {
   // only bind resources in case of potential transaction synchronization
   conn = RedisConnectionUtils.bindConnection(factory, enableTransactionSupport);
  } else {
   conn = RedisConnectionUtils.getConnection(factory);
  }

  boolean existingConnection = TransactionSynchronizationManager.hasResource(factory);

  RedisConnection connToUse = preProcessConnection(conn, existingConnection);

  boolean pipelineStatus = connToUse.isPipelined();
  if (pipeline && !pipelineStatus) {
   connToUse.openPipeline();
  }

  RedisConnection connToExpose = (exposeConnection ? connToUse : createRedisConnectionProxy(connToUse));
  T result = action.doInRedis(connToExpose);

  // close pipeline
  if (pipeline && !pipelineStatus) {
   connToUse.closePipeline();
  }

  // TODO: any other connection processing?
  return postProcessResult(result, connToUse, existingConnection);
 } finally {
  RedisConnectionUtils.releaseConnection(conn, factory, enableTransactionSupport);
 }
}

redisTemplate.opsForValue().get(key) 也是调用了template的execute方法。

public V get(Object key) {

 return execute(new ValueDeserializingRedisCallback(key) {

  @Override
  protected byte[] inRedis(byte[] rawKey, RedisConnection connection) {
   return connection.get(rawKey);
  }
 }, true);
}

API对接之模板方法

api对接通常需要 加入时间戳,根据一定规则进行签名

XxxApiTemplate

public  class XxxApiTemplate {

  private String key;
  private String secret;

  @Autowired
  private RestTemplate restTemplate;

  private HttpClient httpClient;

  public XxxApiTemplate () {
  }

  public XxxApiTemplate (String key, String secret) {
    this.key = key;
    this.secret = secret;
  }

  public String get(String url, Map<String,String> params){
    // params 加入时间戳
    // sign 根据key、secret进行签名(MD5/AES)
    // 处理url拼接参数
    // 其他工作 如日志等
    // 进行请求 httpClient、restTemplate
    return restTemplate.getForObject(url,String.class);
  }

  public String post(String url, Map<String,String> params){
    // 与get方法类似,处理参数方式不同
    Object request = null;
    return restTemplate.postForObject(url,request,String.class);
  }

  public void execute(CallBackAction action){

  }
}
  

至此模板方法介绍到这。 若你有收获,便是我最大的快乐。

相关文章
|
5天前
|
数据采集 监控 API
亚马逊:对接竞品监控API实时跟踪价格变动,调整定价策略
在电商竞争中,亚马逊通过对接竞品监控API,实现价格实时采集与分析,动态调整定价策略。本文详解其技术实现、商业价值及挑战,展现数据驱动下的智能定价如何提升竞争力与利润。
35 0
|
6天前
|
监控 搜索推荐 数据挖掘
小红书:对接话题挑战API激发UGC创作,打造爆款内容
小红书话题挑战API助力品牌高效激发UGC,通过自动化创建活动、精准推送与数据分析,降低运营门槛,提升爆款率。结合吸引力主题、激励机制与裂变传播,实现内容生态繁荣,推动品牌增长。
37 0
|
6天前
|
JSON 监控 API
京东:对接秒杀活动API策划限时抢购,制造稀缺感
京东秒杀活动通过API实现限时抢购,制造稀缺感,提升用户转化率。本文详解API对接流程、稀缺策略及代码示例,助力商家高效运营,实现销量增长。
32 0
|
6天前
|
算法 API 数据安全/隐私保护
电商 API 双平台实战:淘宝 item.get + 京东 item_detail 对接指南(附可复用代码 + 问题排查)
本文详细解析了淘宝和京东双平台API对接的核心流程,涵盖资质申请、凭证获取、签名生成、高频接口调用及常见问题解决方案,助力开发者高效实现商品数据同步与管理。
机器学习/深度学习 搜索推荐 算法
25 0
监控 数据挖掘 API
37 0
监控 安全 API
52 0
|
13天前
|
监控 供应链 API
唯品会:对接商品库存API,实现限时特卖活动库存动态预警,避免超卖
唯品会通过对接商品库存API,构建实时动态预警系统,有效解决限时特卖中的超卖问题。系统可及时预警低库存商品,结合自动限流与人工干预,大幅降低超卖风险,提升订单履约率与用户体验,助力电商高效运营。
25 1
|
15天前
|
人工智能 监控 小程序
【快递鸟】选择对接你的物流商城/小程序的物流API平台
在电商竞争日益激烈的今天,物流体验已成为影响用户留存和复购的关键因素。一个高效、透明、稳定的物流系统,对于物流商城或小程序来说至关重要。然而,自建物流查询系统需要对接众多快递公司,开发周期长、维护成本高、数据整合困难。
63 0
|
15天前
|
数据采集 JSON 数据挖掘
淘宝API对接系列:商品详情与评论数据分析(JSON数据返回)
1. 商品详情API(taobao.item.get) • 功能:获取商品基础信息(标题、价格、库存、销量)、图片、类目、促销信息等。