本文主要通过一个使用策略模式的实例来帮助读者了解策略模式。
策略模式体现了面向对象程序设计中非常重要的两个原则:
封装变化的概念。
编程中使用接口,而不是使用的是具体的实现类(面向接口编程)。
类图:
其优点:
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);
}
}