API对接之模板方法

本文涉及的产品
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){

  }
}
  

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

相关文章
|
2月前
|
JSON 安全 测试技术
医药电商:对接处方审核API实现线上购药合规化
医药电商需合规销售处方药。本文详解对接处方审核API,实现自动化真实性验证、用药合理性审查与全程留痕,满足监管要求。提升审核效率至3秒内,错误率低于0.5%,降低人力成本40%。构建审核闭环,保障安全与体验双赢。(238字)
349 0
|
2月前
|
监控 安全 API
什么是API?进行API对接的5大常见误区!
API是软件间通信的桥梁,API对接则实现系统间数据互通。广泛应用于内外部系统集成,提升效率、降低成本、增强竞争力。本文详解其概念、场景、方法及常见误区。
什么是API?进行API对接的5大常见误区!
|
2月前
|
JSON 监控 API
Shopee:对接海外仓API实现本地发货,优化物流时效
Shopee卖家可通过对接海外仓API实现本地发货,将物流时效从10-15天缩短至3-5天,显著提升买家体验与店铺转化率。本文详解API对接原理、步骤及代码示例,助力优化跨境物流效率。
155 1
|
2月前
|
数据采集 缓存 API
小红书笔记详情 API 实战指南:从开发对接、场景落地到收益挖掘(附避坑技巧)
本文详解小红书笔记详情API的开发对接、实战场景与收益模式,涵盖注册避坑、签名生成、数据解析全流程,并分享品牌营销、内容创作、SAAS工具等落地应用,助力开发者高效掘金“种草经济”。
小红书笔记详情 API 实战指南:从开发对接、场景落地到收益挖掘(附避坑技巧)
|
2月前
|
JSON 监控 API
小红书:对接苹果支付API满足iOS用户习惯,提升转化率
小红书集成Apple Pay可显著提升iOS用户支付体验,简化流程、增强安全、提高转化率。本文详解从开发配置、代码实现到后端验证与优化策略的全流程,助力高效落地,推动业务增长。(238字)
345 0
|
2月前
|
人工智能 API 开发工具
京东:对接白条API提供分期付款,降低消费门槛
本文详解京东白条API集成,涵盖技术原理、分步对接流程及Python代码实现,帮助开发者快速接入分期付款功能。通过API调用实现信用评估与分期计算,降低消费门槛,提升电商转化率。内容基于官方文档,确保准确可靠。
225 8
|
2月前
|
存储 监控 API
京东电子面单API对接指南:实现订单自动打单,发货效率提升300%
电子面单通过API自动化实现降本增效,显著提升订单处理效率。对接需准备app_key、access_token等参数,结合京东API实现快速打单。系统设计支持自动打印与异常告警,实测日均处理量提升316%,错单率大幅下降,人力成本节省超65%。
351 0
|
2月前
|
数据采集 监控 API
亚马逊:对接竞品监控API实时跟踪价格变动,调整定价策略
在电商竞争中,亚马逊通过对接竞品监控API,实现价格实时采集与分析,动态调整定价策略。本文详解其技术实现、商业价值及挑战,展现数据驱动下的智能定价如何提升竞争力与利润。
370 0
|
2月前
|
监控 搜索推荐 数据挖掘
小红书:对接话题挑战API激发UGC创作,打造爆款内容
小红书话题挑战API助力品牌高效激发UGC,通过自动化创建活动、精准推送与数据分析,降低运营门槛,提升爆款率。结合吸引力主题、激励机制与裂变传播,实现内容生态繁荣,推动品牌增长。
157 0
|
2月前
|
JSON 监控 API
京东:对接秒杀活动API策划限时抢购,制造稀缺感
京东秒杀活动通过API实现限时抢购,制造稀缺感,提升用户转化率。本文详解API对接流程、稀缺策略及代码示例,助力商家高效运营,实现销量增长。
168 0