使用策略模式减少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 一.引言 本文要介绍的策略模式也就是对策略进行抽象,策略的意思就是方法,所以也就是对方 ...
随机推荐
- caffe笔记
1. 训练 cifar10 示例 ① cd caffe.1.0.0 ./data/cifar10/get_cifar10.sh #获取图片 ② ./examples/cifar10/cre ...
- pthread 编程基础
Linux系统下的多线程遵循POSIX线程接口,称为pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a.与vxworks上任务的概 ...
- 安卓开发之利用XmlSerializer生成XML文件
package com.lidaochen.phonecall; import android.net.Uri; import android.os.Environment; import andro ...
- JAVA栅栏和闭锁的区别
闭锁:一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.即,一组线程等待某一事件发生,事件没有发生前,所有线程将阻塞等待:而事件发生后,所有线程将开始执行:闭锁最初 ...
- 8.Mapper动态代理
在前面例子中自定义 Dao 接口实现类时发现一个问题:Dao 的实现类其实并没有干什么 实质性的工作, 它仅仅就是通过 SqlSession 的相关 API 定位到映射文件 mapper 中相应 id ...
- 使用FindCmdLineSwitch处理命令行参数
一.四个形式(变体) .function FindCmdLineSwitch(const Switch: string; const Chars: TSysCharSet; IgnoreCase: B ...
- 【loj#2133 && luoguP2178】[NOI2015]品酒大会
题目传送门:loj#2133 luoguP2178 简要题意:给定一个字符串\(s\),每个后缀都有权值,对于每个长度\(len\),求出所有最长公共前缀\(\geq len\)的后缀对的总数 ...
- 第六章、ajax方法以及序列化组件
目录 第六章.ajax方法 一.choice参数介绍 二.MTV与MVC模型 三.ajax方法 四.案例 五.Ajax传json格式的数据 六. AJAX传文件 代码如下 ajax传文件需要注意的事项 ...
- 12_Redis_服务器命令
一:Redis 服务器:Redis 服务器命令主要是用于管理 redis 服务
- 03_Redis_String命令
一:Redis命令---String命令:Redis 字符串数据类型的相关命令用于管理 redis 字符串值 字符串类型是Redis中最为基础.常用的数据存储类型,字符串在Redis中是二进制安全的, ...