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; } }
相关推荐
模板模式是一种行为设计模式,它使你能在不破坏封装性的前提下,定义执行算法的框架,而将一些步骤延迟到子类中。这样,你就能创建一个可复用的框架,将具体步骤留给子类来实现。这个模式的核心思想是抽象类定义了一...
模板模式是一种行为设计模式,它使你能在代码中定义一个操作的不同步骤,并让子类决定这些步骤如何执行。模板模式提供了创建算法结构的通用接口,而具体的实现则由子类来完成。这种模式允许在不修改原有代码的情况下...
在给定的压缩包文件中,包含了多种设计模式的代码实例,我们将逐一探讨这些模式及其应用。 1. **策略模式(01-策略模式)**:策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,让算法独立于使用...
在本课程“软件开发方法与环境--设计模式”中,我们将会深入探讨设计模式如何提升代码质量、可维护性和复用性。下面将详细阐述设计模式的相关知识点。 1. **设计模式的基本概念**: - 设计模式并不是具体的代码...
模板方法模式是一种非常实用的设计模式,它可以帮助开发者减少重复代码,提高代码的可读性和可维护性。通过将不变的部分抽象出来作为模板,并允许子类重新定义某些步骤的行为,能够有效地应对那些具有固定步骤但又有...
C++源代码文件可以帮助你更好地理解如何在实际项目中应用这些模式,通过阅读和分析代码,你可以学习如何在C++中实现这些设计模式,并将它们融入到自己的编程实践中。 总而言之,设计模式是软件开发中的宝贵财富,...
这个压缩包“设计模式实现代码”包含的是作者在学习设计模式过程中编写的实践代码,使用Eclipse开发环境,解压后可以直接运行,便于理解和学习。 设计模式分为三大类:创建型模式(Creational Patterns)、结构型...
这个“Java-设计模式.zip”压缩包很可能是包含一系列关于Java设计模式的教程或者代码示例。其中,“2.Java面对-10-设计模式”可能是一个文档或章节,专门讨论面向对象的设计模式。 设计模式分为三类:创建型、结构...
本篇将详细探讨"设计模式实例--C++实现"这一主题,通过分析压缩包中的文件,我们可以深入理解如何在C++中应用这些模式。 首先,设计模式分为三大类:创建型模式、结构型模式和行为型模式。创建型模式关注对象的创建...
设计模式不是具体的代码或库,而是一种描述在特定上下文中如何解决常见问题的标准方法。在Java中,有三种主要的设计模式类别:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)和行为型模式...
模板方法模式是一种行为设计模式,它在面向对象编程中扮演着重要的角色。这种模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。这样使得子类可以在不改变算法结构的情况下,重新定义该算法的某些特定步骤...
Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可重用性、可维护性和灵活性。设计模式不是具体的代码或库,而是一种通用解决方案的描述,适用于多种编程语言,Java也...
在软件工程中,设计模式是解决常见问题的模板或最佳实践,它们被广泛应用于构建可扩展和可维护的系统。本篇文章将深入探讨设计模式中的一个核心概念——工厂方法模式,通过Python和C++的示例代码来阐述其原理和应用...
模板方法模式是一种行为设计模式,它允许在定义行为框架的同时,延迟部分具体步骤到子类中实现。这种模式主要用于在父类中定义算法的骨架,而将一些步骤的实现细节留给子类去完成,从而使得不同的子类可以重用相同的...
PPT内容包括:内附代码,实例,方便理解。 继承、封装、多态、UML 设计模式02 设计模式03-创建型模式 ...设计模式16-策略模式、模板方法、访问者 此PPT实例便于理解,对于深入理解OO思想有很大帮助。
在C#中,设计模式的应用极大地提高了代码的可读性、可维护性和可扩展性。这里我们主要讨论的是23种GOF(Gang of Four,即《设计模式:可复用面向对象软件的基础》一书的四位作者)设计模式,它们分为三类:创建型...
这个压缩包文件名为“23种设计模式示例源码”,暗示其中包含了解决23种经典设计模式的具体实现代码,这对于初学者或者希望深入理解设计模式的开发者来说是一份宝贵的资源。下面将对这23种设计模式进行详细解释。 1....
设计模式是软件工程中经过实践证明有效的解决方案,它们为解决特定问题提供了通用模板。在Go语言中,设计模式有助于编写可读性更强、可维护性更高、更易于扩展的代码。 在这个"Go设计模式实例-go-design-pattern....
这个压缩包“设计模式所有代码”显然包含了多种设计模式的实现示例,对于学习和理解设计模式有着极大的帮助。下面我们将深入探讨设计模式的核心概念、分类以及每个类别中的代表模式。 设计模式分为三大类:创建型...