策略模式实例

 

 

本文主要通过一个使用策略模式的实例来帮助读者了解策略模式。

策略模式体现了面向对象程序设计中非常重要的两个原则:

封装变化的概念。

编程中使用接口,而不是使用的是具体的实现类(面向接口编程)。

 

类图:

 

其优点:

1.上下文和具体策略是松耦合关系。因此上下文只知道它要使用某一个实现Strategy接口类的实例,但不需要知道具体是哪一个类。

2.策略模式满足“开-闭原则”。当增加新的具体策略时,不需要修改上下文类的代码,上下文就可以引用新的具体策略的实例。

 

适合情景:

1.一个类定义了多种行为,并且这些行为在这个类的方法中以多个条件语句的形式出现,那么可以使用策略模式在类中使用大量的条件语句。

2.程序不希望暴露复杂的、与算法有关的数据结构,那么可以使用策略模式来封装算法。

3.需要使用一个算法的不同变体。

 

例子:

本文例子为“发奖策略”

AwardPrizeStrategy接口,其中有发奖方法,需要实现类实现。

package com.ismartgo.uqcode.strategy.awardPrize;

import com.ismartgo.uqcode.model.UqcUserJoinRecord;

public interface AwardPrizeStrategy {
	
	boolean award(String takePrizeParams , UqcUserJoinRecord record);

}

免费资源发奖实现类:

package com.ismartgo.uqcode.strategy.awardPrize.impl;

import java.util.HashMap;
import java.util.Map;

import com.ismartgo.uqcode.common.utils.DateUtil;
import com.ismartgo.uqcode.common.utils.HttpClientUtil;
import com.ismartgo.uqcode.model.UqcUserJoinRecord;
import com.ismartgo.uqcode.strategy.awardPrize.AwardPrizeStrategy;

public class AwardFreeResourcePrizeStrategy implements AwardPrizeStrategy {

	@Override
	public boolean award(String takePrizeParams, UqcUserJoinRecord record) {
		//发免费资源逻辑
		return true;
	}

}

红包发奖实现类:

package com.ismartgo.uqcode.strategy.awardPrize.impl;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import com.ismartgo.uqcode.common.constants.QRSVConstants;
import com.ismartgo.uqcode.common.utils.DateUtil;
import com.ismartgo.uqcode.common.utils.HttpClientUtil;
import com.ismartgo.uqcode.common.utils.MD5Util;
import com.ismartgo.uqcode.common.utils.Wx3HttpUtils;
import com.ismartgo.uqcode.model.UqcUserJoinRecord;
import com.ismartgo.uqcode.strategy.awardPrize.AwardPrizeStrategy;

import net.sf.json.JSONObject;

public class AwardMoneyPrizeStrategy implements AwardPrizeStrategy{	
	
	@Override
	public boolean award(String takePrizeParams, UqcUserJoinRecord record) {

		
		Map<String, Object> paramsMap = new HashMap<String, Object>();
		//发奖参数屏蔽
		
		JSONObject result = null;
		try {
			 result = Wx3HttpUtils.post(URL,paramsMap);
		} catch (Exception e) {
			e.printStackTrace();
		}
		if(result!=null&&result.getInt("error")==0) {
			return true;
		}

		return false;
	}


}

Context类:

package com.ismartgo.uqcode.strategy.awardPrize.context;

import com.ismartgo.uqcode.model.UqcUserJoinRecord;
import com.ismartgo.uqcode.strategy.awardPrize.AwardPrizeStrategy;

public class AwardPrizeContext {
	
	private AwardPrizeStrategy awardPrizeStrategy;

	public AwardPrizeContext(AwardPrizeStrategy awardPrizeStrategy) {
		super();
		this.awardPrizeStrategy = awardPrizeStrategy;
	}

	public boolean award(String prizeParams,UqcUserJoinRecord record) {
		return awardPrizeStrategy.award(prizeParams, record);
	}
}

 

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值