`
guanpanpan
  • 浏览: 15893 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

代码实例-设计模式-模板方法

 
阅读更多

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++)

    设计模式专题之(十三)模板模式---设计模式模板模式示例代码(python--c++)

    设计模式课件大全

    PPT内容包括:内附代码,实例,方便理解。 继承、封装、多态、UML 设计模式02 设计模式03-创建型模式 ...设计模式16-策略模式、模板方法、访问者 此PPT实例便于理解,对于深入理解OO思想有很大帮助。

    Android编程设计模式之模板方法模式详解

    本文实例讲述了Android编程设计模式之模板方法模式。分享给大家供大家参考,具体如下: 一、介绍 在面向对象开发过程中,通常会遇到这样的一个问题,我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序,...

    《设计模式实训教程》【PPT+类图与代码+样章】

    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设计模式编程中模板方法模式的运用实例

    主要介绍了Java设计模式编程中模板方法模式的运用实例,模板方法模式强调基于继承的代码复用,需要的朋友可以参考下

    OBJECTIVE-C编程之道 IOS设计模式解析电子书+源代码

    书中应用GoF的经典设计模式,介绍了如何在代码中应用创建型模式、结构型模式和行为模式,如何设计模式以巩固应用程序,并通过设计模式实例介绍MVC在CocoaTouch框架中的工作方式。 《Objective-C编程之道:iOS设计...

    设计模式经典样例笔记与代码Swift.zip

    设计模式经典样例笔记与代码Swift.zip 基础 [x] 类间的关系 [x] 设计原则 创建型 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定...

    C#23种设计模式_示例源代码及PDF

    工厂方法模式: 而是将具体创建的工作交给子类去做, 工厂方法模式 核心工厂类不再负责所有产品的创建, 成为一个抽象工厂角色, 仅负责给出具体工厂类必须实现的接口, 而不接触哪一个产品类应 当被实例化这种细节...

    《c#设计模式》电子书+随书源码

    本书内容覆盖了所有23个经典的“四人小组”设计模式,具体包括:适配器,外观,合成,桥接,单件,观察者,中介者,代理,职责链,享元,生成器,工厂方法,抽象工厂,原型,备忘录,模板方法,状态,策略,命令,...

    JavaScript设计模式之模板方法模式原理与用法示例

    本文实例讲述了JavaScript设计模式之模板方法模式原理与用法。分享给大家供大家参考,具体如下: 一、模板方法模式:一种只需使用继承就可以实现的非常简单的模式。 二、模板方法模式由两部分组成,第一部分是抽象...

    12种常用设计模式C#代码示例

    9,模板方法模式:在一个方法中定义一个算法的骨架,而将以些步骤延迟到子类中。模板方法使得子类可以 在不改变算法结构的情况下,重新定义算法中的某些步骤。 10,迭代器模式:提供一种方法,顺序访问一个聚合对象...

    在iOS中实现设计模式代码实现

    在iOS开发中,设计模式是一套被广泛认可的解决特定设计问题的模板。它们帮助开发者构建可维护、可扩展且耦合度低的软件。以下是几种常用设计模式在iOS中的实现说明: 1. **单例模式(Singleton Pattern)**: 单例...

    [vip专享]java设计模式实验报告.pdf

    PowerDesigner 和任意一种面向对象编程语言实现几种常用的设计模式,加深对 这些模式的理解,包括装饰模式、外观模式、代理模式、职责链模式、命令模式、迭代器 模式、观察者模式、状态模式、策略模式和模板方法模式...

    php-design-patterns:带有示例代码的 php 设计模式

    [PHP 设计模式与示例代码] 创意设计模式 顾名思义,创建模式是用于创建对象的模式。 更具体地说,他们抽象了实例化过程。 随着程序越来越依赖于组合,它更少地依赖于硬编码的实例化,而更多地依赖于一组灵活的行为...

    VBA实例代码

    由于C系语言的共性,VBA语言本身的缺陷可以通过 借鉴其他编程语言/设计模式 来弥补。MVC,模板引擎,函数式编程... 这种 无意的"留白" 给了VBA程序员无限的创作空间。另外,在实践中总结与思考也必不可少,通过自动...

    JAVA23种设计模式及快捷记忆

    设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。工厂模式、抽象工厂模式、...

    JAVA上百实例源码以及开源项目源代码

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    设计模式中的模板方法模式在Ruby中的应用实例两则

    实例一 今天你还是像往常一样来上班,一如既往地开始了你的编程工作。 项目经理告诉你,今天想在服务器端增加一个新功能,希望写一个方法,能对Book对象进行处理,将Book对象的所有字段以XML格式进行包装,这样以后...

    掌握Spring设计模式:Java工程师必备指南

    作为一个资深Java工程师,我发现《Spring 设计模式总结》PDF非常精彩,它深入剖析了Spring框架中的关键设计模式。例如,简单工厂模式通过BeanFactory展现,实现了松耦合和动态对象创建。工厂方法模式则通过...

Global site tag (gtag.js) - Google Analytics