代码范例-设计模式-模板方法
代码实例-设计模式-模板方法
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; } }