博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
策略模式实例
阅读量:4170 次
发布时间:2019-05-26

本文共 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) {				Map
paramsMap = 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/

你可能感兴趣的文章
跨系统的录音格式兼容性问题: iOS Android
查看>>
JVM 的垃圾回收器
查看>>
Mybatis的缓存
查看>>
@validated注解异常返回JSON值
查看>>
@JsonFormat注解使用
查看>>
Spring boot集成jxls实现导入功能
查看>>
Spring boot读取配置的方式(指定配置文件)
查看>>
Spring Boot切换不同环境配置
查看>>
Spring cloud之Ribbon搭建
查看>>
TreeMap 与 HashMap 的区别
查看>>
初识CAS
查看>>
Fork/Join 框架
查看>>
服务雪崩效应
查看>>
策略模式实例
查看>>
PostgreSQL数据库管理 第八章日常运维
查看>>
PostgreSQL数据库管理第十章Repmgr
查看>>
Linux shell正则表达式-sed-awk-grep应用
查看>>
linux系统管理—第五章Linux-bashshell
查看>>
PostgreSQL数据库管理 第二章体系结构
查看>>
PostgreSQL数据库管理 第三章实例管理与管理工具
查看>>