使用策略模式减少if else
首先要明确的说出策略模式会不可避免导致你的代码类变得很多,如果对应方法逻辑很复杂时可采用,如果逻辑不是很复杂就有点大材小用了。
package com.zihexin.application.strategy; /**
* @Author: SimonHu
* @Date: 2019/7/18 15:38
* @Description:定义策略模式
*/
public interface Strategy {
void consumeTask(); void refundTask(); void sqtConsumeTask(); void sqtRefundTask();
}
package com.zihexin.application.strategy.strategyImpl; import com.zihexin.application.strategy.SpringUtils;
import com.zihexin.application.strategy.Strategy;
import com.zihexin.application.task.BaiDuWaiMaiTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; /**
* @Author: SimonHu
* @Date: 2019/7/18 15:40
* @Description:
*/
@Component
public class BaiDuWaiMaiStrategy implements Strategy {
@Autowired
private BaiDuWaiMaiTask baiDuWaiMaiTask; public BaiDuWaiMaiStrategy() {
baiDuWaiMaiTask = SpringUtils.getBean("baiDuWaiMaiTask");
} @Override
public void consumeTask() {
baiDuWaiMaiTask.consumeTask();
} @Override
public void refundTask() {
baiDuWaiMaiTask.refundTask();
} @Override
public void sqtConsumeTask() {
} @Override
public void sqtRefundTask() {
}
}
package com.zihexin.application.strategy; import com.zihexin.application.strategy.strategyImpl.*; import java.util.HashMap;
import java.util.Map; /**
* @Author: SimonHu
* @Date: 2019/7/18 15:42
* @Description:策略工厂,负责Strategy实例的创建,避免if else判断
*/
public class StrategyFactory {
private static StrategyFactory factory = new StrategyFactory(); private StrategyFactory() {
} private static Map strategyMap = new HashMap<>(); static {
strategyMap.put("daMaiTask", new DmStrategy());
strategyMap.put("baiDuWaiMaiTask", new BaiDuWaiMaiStrategy());
strategyMap.put("elmTask", new ElmStrategy());
strategyMap.put("maoYanTask", new MaoYanStrategy());
strategyMap.put("meidianTask", new MeidianStrategy());
strategyMap.put("tppTask", new TPPStrategy());
strategyMap.put("wuBaTask", new WuBaStrategy());
} public Strategy creator(String type) {
return (Strategy) strategyMap.get(type);
} public static StrategyFactory getInstance() {
return factory;
}
}
package com.zihexin.application.strategy; /**
* @Author: SimonHu
* @Date: 2019/7/18 15:42
* @Description:创建环境角色Context:
*/
public class Context {
private Strategy strategy; public void consumeTask(String type) {
strategy = StrategyFactory.getInstance().creator(type);
strategy.consumeTask();
} public void refundTask(String type) {
strategy = StrategyFactory.getInstance().creator(type);
strategy.refundTask();
} public void sqtConsumeTask(String type) {
strategy = StrategyFactory.getInstance().creator(type);
strategy.sqtConsumeTask();
} public void sqtRefundTask(String type) {
strategy = StrategyFactory.getInstance().creator(type);
strategy.sqtRefundTask();
} public Strategy getStrategy() {
return strategy;
} public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
}
//调用
public void testst(String type) {
Context context = new Context();
context.consumeTask(type);
context.refundTask(type);
context.sqtConsumeTask(type);
context.sqtRefundTask(type);
}
使用策略模式减少if else的更多相关文章
- 有效的减少代码中太多的if、else?-策略模式
写这篇文章的目的和上一篇单例模式一样,策略模式也是一种常用的设计模式,太多的if-else不仅看着不太美观而且不好维护,对于自己来说也等于复习了一遍策略模式.先说一下策略 模式的定义: 策略模式封装了 ...
- javascript设计模式:策略模式
前言 策略模式有效利用组合.委托.多态等技术和思想,可以有效避免多重条件选择语句. 策略模式对开放-封闭原则提供了很好的支持,将算法封装在strategy中,使得他们易于切换.理解.扩展. 策略模式中 ...
- 设计模式-策略模式(Strategy Model)
1.概述 在开发过程中常常会遇到类似问题,实现一个功能的时候往往有多种算法/方法(策略),我们可以根据环境的不同来使用不同的算法或策略来实现这一功能. 如在人物比较排序的实现中,我们有 ...
- IOS之Objective-C学习 策略模式
对于策略模式,我个人理解策略模式就是对各种规则的一种封装的方法,而不仅仅是对算法的封装与调用而已.与工厂模式中简单工厂有点类似,但是比简单工厂更有耦合度,因为策略模式以相同的方法调用所有的规则,减少了 ...
- [Head First设计模式]策略模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
- C++设计模式-Strategy策略模式
Strategy策略模式作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: Strategy模式将逻辑(算法)封装到一个类(Cont ...
- JAVA设计模式 之 策略模式
一. 定义 设计模式定义了算法族,分别封装起来,让他们之间可以互相替代,此模式让算法的变化独立于使用算法的客户(该定义来自于Head First 设计模式). 二. 应用场景 当我们在应用程序中完成一 ...
- 设计模式学习之策略模式(Strategy,行为型模式)(13)
转载地址:http://www.cnblogs.com/zhili/p/StragetyPattern.html 一.引言 本文要介绍的策略模式也就是对策略进行抽象,策略的意思就是方法,所以也就是对方 ...
随机推荐
- idea的EasyCode使用
EasyCode可以自动根据表格生成:entity,dao,service,serviceImpl,controller 使用方法: 一.安装EasyCode插件: File-setting-Plug ...
- CSS设置浮动导致背景颜色设置无效的解决方法
float浮动会使父元素高度塌陷,父级元素不能被撑开,所以导致背景颜色不能被撑开 解决方法: 对父元素设置高度 对父元素设置 overflow:hidden清除浮动 把父元素也设置为float浮动 结 ...
- linux——目录说明
1) bin -> usr/bin : 这个目录存放最经常使用的命令 2) boot : 这个目录存放启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件 3) dev: de ...
- FreeIPA ACI (Access Control Instructions) 访问控制说明
目录 FreeIPA ACI (Access Control Instructions) 访问控制说明 一.ACI 位置 二.ACI 结构 三.ACI 局限性 四.复制拓扑中的ACI 五.操作ACI ...
- tensorflow.python.framework.errors_impl.PermissionDeniedError: /data; Permission denied
在linux系统中,tensorflow跑mnist数据集出现错误,本应该自动下载的数据集 将mnist自动下载的路径,由/data/mnist之前的/删掉即可.改为data/mnist.
- css hack的理解
什么是CSS hack 由于不同厂商的流览器或某浏览器的不同版本(如IE6-IE11,Firefox/Safari/Opera/Chrome等),对CSS的支持.解析不一样,导致在不同浏览器的环境中呈 ...
- MyBatis中的OGNL教程
MyBatis中的OGNL教程 有些人可能不知道MyBatis中使用了OGNL,有些人知道用到了OGNL却不知道在MyBatis中如何使用,本文就是讲如何在MyBatis中使用OGNL. 如果我们搜索 ...
- ubuntu 中 搭建 C编程环境
在 ubuntu 中 使用 快捷键 Ctrl + Alt + T 打开 终端 在终端输入 gcc 查看 有没有安装 gcc (c语言的编译器) ( 我这里是 已经 安装 好的 ) 进行 安装 gcc ...
- kickstart批量装机脚本
#!/bin/bash #安装必备的软件 yum -y install dhcp tftp-server tftp xinetd syslinux vsftpd yum -y install *kic ...
- BZOJ 1982 / Luogu SP2021: [Spoj 2021]Moving Pebbles (找平衡状态)
这道题在论文里看到过,直接放论文原文吧 在BZOJ上是单组数据,而且数据范围符合,直接int读入排序就行了.代码: #include <cstdio> #include <algor ...