本文共 2747 字,大约阅读时间需要 9 分钟。
本文主要通过一个使用策略模式的实例来帮助读者了解策略模式。
策略模式体现了面向对象程序设计中非常重要的两个原则:
封装变化的概念。
编程中使用接口,而不是使用的是具体的实现类(面向接口编程)。
类图:
其优点:
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) { MapparamsMap = new HashMap (); //发奖参数屏蔽 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); }}
转载地址:http://pvbai.baihongyu.com/