1.接口
package com.jd.consume.domain.lock; import java.util.List; import com.jd.consume.domain.model.OrderTask; /** * 用户消费任务锁定 * @author guanpanpan * */ public interface DataLock { /** * 从数据库中查询一定数量的OrderTask,并进行lock,lock到指定条数就返回,如果lock不到就返回空集合 * @param modeSize 总模数 * @param modeNo 当前锁定模数 */ public List<OrderTask> lock(int modeSize, int modeNo); /** * 解锁指定数据 */ public int unLock(long id); }
2.抽象实现类
package com.jd.consume.domain.lock.impl; import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; import org.apache.commons.lang.StringUtils; import com.jd.consume.domain.lock.DataLock; import com.jd.consume.domain.model.OrderTask; import com.jd.consume.infrastructure.repository.OrderTaskRepository; import com.jd.consume.infrastructure.util.RouteUtil; public abstract class DataLockImpl implements DataLock { @Resource protected OrderTaskRepository orderTaskRepository; @Resource protected RouteUtil routeUtil; protected int maxLockSize; protected int getSize; @Override public List<OrderTask> lock(int modeSize, int modeNo) { List<OrderTask> consumeInfoLocks = new ArrayList<OrderTask>(); List<OrderTask> consumeInfos = getData(); for (OrderTask consumeInfo : consumeInfos) { String pin = consumeInfo.getPin(); if (StringUtils.isEmpty(pin)) { continue; } if (modeNo != routeUtil.getMode(pin, modeSize)) { continue; } if (lockSingleData(consumeInfo.getId())) { consumeInfoLocks.add(consumeInfo); } if (consumeInfoLocks.size() >= maxLockSize) { break; } } return consumeInfoLocks; } public abstract boolean lockSingleData(long id); public abstract List<OrderTask> getData(); public void setMaxLockSize(int maxLockSize) { this.maxLockSize = maxLockSize; } public void setGetSize(int getSize) { this.getSize = getSize; } }
3.具体实现类
package com.jd.consume.domain.lock.impl; import java.util.List; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.jd.consume.domain.model.OrderTask; /** * 加消费额度锁定 * @author guanpanpan * */ @Service(value = "addConsumeLock") public class AddConsumeLock extends DataLockImpl { @Override @Value("${addConsumeLock.getSize}") public void setGetSize(int getSize) { super.setGetSize(getSize); } @Override @Value("${addConsumeLock.maxLockSize}") public void setMaxLockSize(int maxLockSize) { super.setMaxLockSize(maxLockSize); } @Override public boolean lockSingleData(long id) { return orderTaskRepository.updateCusumeStatus(id, OrderTask.SYN_LOCK, OrderTask.SYN_WAIT) == 1; } @Override public int unLock(long id) { return orderTaskRepository.updateCusumeStatus(id, OrderTask.SYN_WAIT, OrderTask.SYN_LOCK); } @Override public List<OrderTask> getData() { List<OrderTask> orderTasks = orderTaskRepository.findOrderTasksByConsumeStatus(OrderTask.SYN_WAIT, getSize, false); return orderTasks; } }
package com.jd.consume.domain.lock.impl; import java.util.List; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.jd.consume.domain.model.OrderTask; /** * 减消费额数据锁定 * @author guanpanpan * */ @Service(value = "pastConsumeLock") public class PastConsumeLock extends DataLockImpl { @Override @Value("${pastConsumeLock.getSize}") public void setGetSize(int getSize) { super.setGetSize(getSize); } @Override @Value("${pastConsumeLock.maxLockSize}") public void setMaxLockSize(int maxLockSize) { super.setMaxLockSize(maxLockSize); } @Override public boolean lockSingleData(long id) { return orderTaskRepository.updatePastCusumeStatus(id, OrderTask.PAST_LOCK, OrderTask.SYN_COMPLETE) == 1; } @Override public int unLock(long id) { return orderTaskRepository.updatePastCusumeStatus(id, OrderTask.SYN_COMPLETE, OrderTask.PAST_LOCK); } @Override public List<OrderTask> getData() { List<OrderTask> consumeInfos = orderTaskRepository.findPastOrderTasks(getSize); return consumeInfos; } }
package com.jd.consume.domain.lock.impl; import java.util.List; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.jd.consume.domain.model.OrderTask; /** * 计算等级数据锁定 * @author guanpanpan * */ @Service(value = "gradeLock") public class GradeLock extends DataLockImpl { @Override @Value("${gradeLock.getSize}") public void setGetSize(int getSize) { super.setGetSize(getSize); } @Override @Value("${gradeLock.maxLockSize}") public void setMaxLockSize(int maxLockSize) { super.setMaxLockSize(maxLockSize); } @Override public boolean lockSingleData(long id) { return orderTaskRepository.updateCusumeLevStatus(id, OrderTask.LEV_LOCK, OrderTask.LEV_WAIT) == 1; } @Override public int unLock(long id) { return orderTaskRepository.updateCusumeLevStatus(id, OrderTask.LEV_WAIT, OrderTask.LEV_LOCK); } @Override public List<OrderTask> getData() { List<OrderTask> consumeInfos = orderTaskRepository.findOrderTasksByLevStatus(OrderTask.LEV_WAIT, getSize, false); return consumeInfos; } }
相关推荐
设计模式专题之(十三)模板模式---设计模式模板模式示例代码(python--c++)
PPT内容包括:内附代码,实例,方便理解。 继承、封装、多态、UML 设计模式02 设计模式03-创建型模式 ...设计模式16-策略模式、模板方法、访问者 此PPT实例便于理解,对于深入理解OO思想有很大帮助。
本文实例讲述了Android编程设计模式之模板方法模式。分享给大家供大家参考,具体如下: 一、介绍 在面向对象开发过程中,通常会遇到这样的一个问题,我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序,...
5.2.10模板方法模式实例之数据库操作 5.2.11访问者模式实例之奖励审批 5.3实训练习 第6章模式联用与综合实例实训 6.1设计模式补充知识 6.1.1反射与配置文件 6.1.2GRASP模式 6.1.3架构模式与MVC 6.2模式联用...
本书结合设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好、表达清楚的软件设计模式,这些模式在实用环境下特别...
主要介绍了Java设计模式编程中模板方法模式的运用实例,模板方法模式强调基于继承的代码复用,需要的朋友可以参考下
书中应用GoF的经典设计模式,介绍了如何在代码中应用创建型模式、结构型模式和行为模式,如何设计模式以巩固应用程序,并通过设计模式实例介绍MVC在CocoaTouch框架中的工作方式。 《Objective-C编程之道:iOS设计...
设计模式经典样例笔记与代码Swift.zip 基础 [x] 类间的关系 [x] 设计原则 创建型 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定...
工厂方法模式: 而是将具体创建的工作交给子类去做, 工厂方法模式 核心工厂类不再负责所有产品的创建, 成为一个抽象工厂角色, 仅负责给出具体工厂类必须实现的接口, 而不接触哪一个产品类应 当被实例化这种细节...
本书内容覆盖了所有23个经典的“四人小组”设计模式,具体包括:适配器,外观,合成,桥接,单件,观察者,中介者,代理,职责链,享元,生成器,工厂方法,抽象工厂,原型,备忘录,模板方法,状态,策略,命令,...
本文实例讲述了JavaScript设计模式之模板方法模式原理与用法。分享给大家供大家参考,具体如下: 一、模板方法模式:一种只需使用继承就可以实现的非常简单的模式。 二、模板方法模式由两部分组成,第一部分是抽象...
9,模板方法模式:在一个方法中定义一个算法的骨架,而将以些步骤延迟到子类中。模板方法使得子类可以 在不改变算法结构的情况下,重新定义算法中的某些步骤。 10,迭代器模式:提供一种方法,顺序访问一个聚合对象...
在iOS开发中,设计模式是一套被广泛认可的解决特定设计问题的模板。它们帮助开发者构建可维护、可扩展且耦合度低的软件。以下是几种常用设计模式在iOS中的实现说明: 1. **单例模式(Singleton Pattern)**: 单例...
PowerDesigner 和任意一种面向对象编程语言实现几种常用的设计模式,加深对 这些模式的理解,包括装饰模式、外观模式、代理模式、职责链模式、命令模式、迭代器 模式、观察者模式、状态模式、策略模式和模板方法模式...
[PHP 设计模式与示例代码] 创意设计模式 顾名思义,创建模式是用于创建对象的模式。 更具体地说,他们抽象了实例化过程。 随着程序越来越依赖于组合,它更少地依赖于硬编码的实例化,而更多地依赖于一组灵活的行为...
由于C系语言的共性,VBA语言本身的缺陷可以通过 借鉴其他编程语言/设计模式 来弥补。MVC,模板引擎,函数式编程... 这种 无意的"留白" 给了VBA程序员无限的创作空间。另外,在实践中总结与思考也必不可少,通过自动...
设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。工厂模式、抽象工厂模式、...
Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang...
实例一 今天你还是像往常一样来上班,一如既往地开始了你的编程工作。 项目经理告诉你,今天想在服务器端增加一个新功能,希望写一个方法,能对Book对象进行处理,将Book对象的所有字段以XML格式进行包装,这样以后...
作为一个资深Java工程师,我发现《Spring 设计模式总结》PDF非常精彩,它深入剖析了Spring框架中的关键设计模式。例如,简单工厂模式通过BeanFactory展现,实现了松耦合和动态对象创建。工厂方法模式则通过...