策略枚举应用

    最近在看Effective java 第二版这本书,其中看到第21条:用函数对象表示策略和第30条:用enum代替int常量,发现原先有个项目当中可以用到策略枚举,于是把以前的代码拿出来,重新改版成策略枚举的形式,并把代码发布在这里,以供日后学习使用。另外对这段代码的实践,也使自己澄清了一个误区,原先一直以为j2ee的MVC模式的开发都是固定的模式:Action+service+dao,dao写操作数据库的类,service调用dao层,action再调用service层,而且由于使用spring的注入,以前一直都是这么写

	@Resource
	private IMbPrivilegeService mbPrivilegeService;

由于注入关系,用到一个对象的时候只要从spring容器里边拿出来就可以了,不需要去new一个Action,service,dao等,但是看到很多设计模式当中都new一个对象出来,所以一直都认为j2ee的MVC这种开发模式用到的其他的设计模式很少。因而在开发j2ee项目当中一直使用的MCV这一套思路,写出的代码质量也不高。很惭愧,现在刚刚开始转入android开发才想明白这个事情:只要用一种方法从spring当中获取到对象的实例,然后在别的类里边获取到这个实例的引用,那么其他的设计模式在j2ee的开发当中也是很好使用的。就像以下的写的关于策略枚举一样,其中也调用到操作业务的service层,只要用

SpringUtil.getBean("refstatService");

就能能把service实例从spring容器中拿出来,为整个枚举提供服务。

        以下为策略枚举的源码

/**
 * 策略枚举
 * @author Administrator
 */
public enum MbActivity {
	SUNDAY(Calendar.SUNDAY, ActivityType.ScratchSeven),
	MONDAY(Calendar.MONDAY, ActivityType.ScratchSeven),
	TUESDAY(Calendar.TUESDAY, ActivityType.ScratchSeven),
	WEDNESDAY(Calendar.WEDNESDAY, ActivityType.DownLoad),
	THURSDAY(Calendar.THURSDAY, ActivityType.DownLoad),
	FRIDAY(Calendar.FRIDAY, ActivityType.SecondKill),
	SATURDAY(Calendar.SATURDAY, ActivityType.ScratchSeven);
	
	
	private static Log log= LogFactory.getLog(MbActivity.class);
	private static Calendar calendar = Calendar.getInstance();
	private final static IRefstatService refstatService = (IRefstatService)SpringUtil.getBean("refstatService");
	private final static IMbPrivilegeService mbPrivilegeService = (IMbPrivilegeService)SpringUtil.getBean                ("mbPrivilegeService");
	private ActivityType type;
	private int week;//星期
	private String resultCode;//结果状态码
	private String mobile;//手机号
	private String yxId;//id
	private MbActivity(int week, ActivityType type){
		this.week = week;
		this.type = type;
	}
	
	//策略
	public boolean strategy(String mobile,String id) throws ServiceException{
		this.init(mobile, id);
		this.updatePV();
		type.checkValid();
		this.downLoad();
		this.insertLog();
		return true;
	}
	
	
	public static MbActivity valueOf(int week){
		for(MbActivity mb: values()){
			if (week == mb.week){
				return mb;
			}
		}
		throw new IllegalArgumentException("week:"+week);
	}
	//初始化
	private void init(String mobile,String id) throws ServiceException{
		Assert.hasLength(mobile,"手机号为空");
		Assert.hasLength(id,"id为空");
		CmccSpecialPreferenceVO vo = null;
		try {
			vo = mbPrivilegeService.getMbPrivilegeById(id);
		} catch (ServiceException e) {
			e.printStackTrace();
		}
		Assert.notNull(vo);
		Assert.hasLength(vo.getPrivilegeId(),"yxId为空");
		this.yxId = vo.getPrivilegeId();
		this.mobile = mobile;
	}
	//下发短信
	private void downLoad() throws ServiceException{
		try {
			DownResult downYxplan = mbPrivilegeService.downYxplan(mobile, yxId);
			resultCode = downYxplan.getResultCode();
		} catch (Exception e) {
			e.printStackTrace();
			resultCode = "-1";
		}
	}
	
	/**
	 * 记录日志
	 * @throws ServiceException
	 */
	private void insertLog() throws ServiceException{
		IMbPrivilegeLogService mbPrivilegeLogService = (IMbPrivilegeLogService)SpringUtil.getBean("mbPrivilegeLogService");
		//记录日志,记录成功与失败,以及失败的原因
		TbCmccSpecialPreferenceLog log = new TbCmccSpecialPreferenceLog();
		log.setMobile(mobile);
		log.setPrivilegeId(yxId);
		log.setResult(resultCode);
		log.setCreateTime(new Date());
		String ip = IpUtil.getRequesterIp(ServletActionContext.getRequest()); 
		log.setIp(ip);
		log.setPrivilegeNo(this.findPV()+"");
		mbPrivilegeLogService.insertMbPrivilegeLog(log);
	}
	
	
	/**
	 * 更新用户参与数 (+1)
	 * @throws ServiceException 
	 */
	private void updatePV() throws ServiceException{
		refstatService.updateRefstatPv("2", 1);
	}
	private enum ActivityType{
		//miaosha
		SecondKill {
			boolean checkValid() throws ServiceException{
				int hour = calendar.get(Calendar.HOUR_OF_DAY);
				log.debug("现在时间:"+hour);
				if ((10<=hour && hour<=12) || (14<=hour && hour<=16) || 18<=hour && hour<=20){
					log.debug("时间正确,可以进行miaosha");
				}else{
					throw new ServiceException("尊敬的客户,周五必须在 10点-12点, 14点-16点,18点-20点时间段内才能参加miaosha活动!");
				}
				return true;
			}
		},
		//qiangqi
		ScratchSeven{
			boolean checkValid() throws ServiceException{
				int hour = calendar.get(Calendar.HOUR_OF_DAY);
				if (hour <= 10){
					 throw new ServiceException("hour:"+hour+",不在qiangqi的时间段");
				}
				
				Integer downCount = findPV();//参与数
				log.debug("第"+downCount+"位参加qiangqi的用户");
				if (!downCount.toString().contains("7")){
					throw new ServiceException("尊敬的客户,本次您qiangqi排位第 "+downCount+" 名,排位数字未含“ 7 ” ,请您再接再厉!");
				}
				return false;
			}
		},
		//xiazai
		DownLoad{
			boolean checkValid() throws ServiceException{
				int hour = calendar.get(Calendar.HOUR_OF_DAY);
				if (hour <= 10){
					 throw new ServiceException("hour:"+hour+",不在xiazai的时间段");
				}
				return true;
			}
		};
		
		abstract boolean checkValid() throws ServiceException;
	}
	/**
	 * 获取当前用户参与数
	 * @return
	 * @throws ServiceException 
	 */
	private static int findPV() throws ServiceException{
		TbRefstat tbRefstat = refstatService.findRefstatById("2");
		return tbRefstat.getPv();
	}
	public static void main(String[] args) {
		try {
			//调用
			MbActivity.valueOf(Calendar.FRIDAY).strategy("13580999", "1111");
		} catch (ServiceException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值