小白写了一堆if-else,大神实在看不下去了,竟然用策略模式直接摆平了
/**
* 策略模式演示类
*/
public class MyService { /**
* 使用if-else的解决方案
*/
public String processResult(String key) {
if ("checkvalue1".equals(key)) {
return "business logic1";
} else if ("checkvalue2".equals(key)) {
return "business logic2";
}else if ("checkvalue3".equals(key)) {
return "business logic3";
}else if ("checkvalue4".equals(key)) {
return "business logic4";
}else if ("checkvalue5".equals(key)) {
return "business logic5";
}else if ("checkvalue6".equals(key)) {
return "business logic6";
}else if ("checkvalue7".equals(key)) {
return "business logic7";
}else if ("checkvalue8".equals(key)) {
return "business logic8";
}else if ("checkvalue9".equals(key)) {
return "business logic9";
}
return "error;
} /**
* 用于业务逻辑分派Map
* Function为函数式接口,下面代码中 Function<String, String> 的含义是接收一个String类型的变量,返回一个String类型的结果
*/
private Map<String, Function<String, String>> myDispatcher = new HashMap<>(); /**
* 使用策略模式的方法
*/ public void policyInit() {
myDispatcher.put("checkvalue1", key -> String.format("business logic1 for %s1", key));
myDispatcher.put("checkvalue2", key -> String.format("business logic2 for %s2", key));
myDispatcher.put("checkvalue3", key -> String.format("business logic3 for %s3", key));
myDispatcher.put("checkvalue4", key -> String.format("business logic4 for %s4", key));
myDispatcher.put("checkvalue5", key -> String.format("business logic5 for %s5", key));
myDispatcher.put("checkvalue6", key -> String.format("business logic6 for %s6", key));
myDispatcher.put("checkvalue7", key -> String.format("business logic7 for %s7", key));
myDispatcher.put("checkvalue8", key -> String.format("business logic8 for %s8", key));
myDispatcher.put("checkvalue9", key -> String.format("business logic9 for %s9", key));
} public String processPolicyResult(String key) {
//从逻辑分派Dispatcher中获得业务逻辑代码,result变量是一个lambda表达式
Function<String, String> result = myDispatcher.get(key);
if (result != null) {
//执行这段表达式获得String类型的结果
return result.apply(key);
}
return "error";
}
}
下面是调用代码:
public class RunPolicy {
private MyService myService;
public String test(String key) {
return myService.processPolicyResult(order);
}
}
从这段代码中可以看到很多好处,例如:
/**
* 策略模式类
*/
public class PolicyService { private Map<String, Function<String, String>> myDispatcherMulti = new HashMap<>(); /**
* 初始化 业务逻辑分派Map 其中value 存放的是 lambda表达式
*/
@PostConstruct
public void dispatcherMuitInit() {
myDispatcherMulti.put("key_order1", key -> String.format("business logic1 for %s", key));
myDispatcherMulti.put("key_order2_order3", key -> String.format("business logic2 for %s", key));
myDispatcherMulti.put("key_order1_order2_order3", key -> String.format("business logic3 for %s", key));
} public String processMuti(String key, int level) {
//根据level获取不同的key
String dKey = getDispatcherKey(key, level); Function<String, String> result = myDispatcherMuti.get(dKey);
if (result != null) {
//执行这段表达式获得String类型的结果
return result.apply(key);
}
return "error";
} /**
* 根据level生成不同层次的key
*/
private String getDispatcherKey(String key, int level) {
StringBuilder k = new StringBuilder("key");
for (int i = 1; i <= level; i++) {
k.append("_" + order + i);
}
return k.toString();
}
} /**
* 测试代码
*/
public class TestPolicyMulti { private PolicyService policyService; public String test(String key, int level) {
return policyService.processMuti(key, level);
}
}
/**
* 专门放业务逻辑的服务类
*/
public class ServiceUnit { public String task1(String key) {
return "业务逻辑1";
}
public String task2(String key) {
return "业务逻辑2";
}
public String task3(String key) {
return "业务逻辑3";
}
public String task4(String key) {
return "业务逻辑4";
}
}
/**
* 使用策略模式的类
*/
public class PolicyService {
private ServiceUnit serviceUnit; private Map<String, Function<String, String>> myDispatcher = new HashMap<>(); /**
* 初始化规则映射
*/
public void dispatcherInit() {
myDispatcher.put("key_order1", key -> serviceUnit.task1(key));
myDispatcher.put("key_order1_order2", key -> serviceUnit.task2(key)));
myDispatcher.put("key_order1_order2_order3", key -> serviceUnit.task3(key));
myDispatcher.put("key_order1_order2_order3_order4", key -> serviceUnit.task4(key));
} public String process(String key, int level) {
// 根据level生成对应的key
String dKey = getDispatcherKey(key, level); Function<String, String> result = myDispatcher.get(dKey);
if (result != null) {
//执行这段表达式获得String类型的结果
return result.apply(order);
}
return "error";
} /**
* 根据level生成对应的key
*/
private String getDispatcherKey(String key, int level) {
StringBuilder k = new StringBuilder("key");
for (int i = 1; i <= level; i++) {
k.append("_" + order + i);
}
return k.toString();
}
}
总结:
小白写了一堆if-else,大神实在看不下去了,竟然用策略模式直接摆平了的更多相关文章
- 链家鸟哥:从留级打架问题学生到PHP大神,他的人生驱动力竟然是?
链家鸟哥:从留级打架问题学生到PHP大神,他的人生驱动力竟然是?| 二叉树短视频 http://mp.weixin.qq.com/s/D4l_zOpKDakptCM__4hLrQ 从问题劝退学生到高考 ...
- VS2012+SQL2008+ODBC编程,第一篇博客,写的不好忘各位大神指点一二~
近期写一个数据库的课程设计,用的是C++ MFC .最開始用的是ADO技术,可是苦于网上大部分的教程都是VC6.0的,对着教程敲了4,5遍还是执行不成功.我用的IDE是VS2012,毕竟VC6.0和V ...
- Perm排列计数(新博客试水,写的不好,各路大神见谅)
B. Perm 排列计数 内存限制:512 MiB 时间限制:1000 ms 标准输入输出 题目描述 称一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2<=i&l ...
- linux 删除命令注意事项(大神勿看)
在做软连接的时候,想到一个问题,如果删除软连接,会不会删除源文件. 如果删除是真删除的话,一旦操作错误那就后悔去吧. 效果是这样的:#rm -rf pp/ 如果pp是软连文件夹,那么 ...
- 求大神帮解答calendar日期插件的问题
小颖最近公司的项目里用了一款日期插件 calendar.js 但是在用的过程中遇到了难题,就是当日期只需要选择具体的月份就可以了,不需要再选具体日期时,小颖解决不了,只能让它默认显示出月份,但是月 ...
- JS高级群的日常!写一个从10到0的倒计时,用console.log打印,不可以用 setInterval!本来说好的研究avalonJS最后演变成了看着大神在那边互相比拼实力。。
JS高级群的日常!写一个从10到0的倒计时,用console.log打印,不可以用 setInterval!本来说好的研究avalonJS最后演变成了看着大神在那边互相比拼实力.. 小森执行一 ...
- 厉害了,Google大神每天写多少行代码?
文章转自开源中国社区,编译自:Quora Quora上有个有趣的问题:Google工程师们每天写多少行代码? Google 的 AdMob 全栈工程师 Raymond Farias 在 Quora 发 ...
- 【同行说技术】iOS程序员从小白到大神必读资料汇总
在文章<iOS程序员从小白到大神必读资料汇总(一)>里面介绍了很多iOS入门学习的资料,今天小编就发几篇技术进阶的文章,快来看看吧! 一.iOS后台模式开发指南 这个教程会教你在什么时候怎 ...
- 真想用c#开发个 wp五笔输入法。。。奈何网上资料太少,源码都是c++写的。求大神指点!!!
真想用c#开发个 wp五笔输入法...奈何网上资料太少,源码都是c++写的.求大神指点!!!!
随机推荐
- Java实现 蓝桥杯VIP 算法提高 数的划分
算法提高 数的划分 时间限制:1.0s 内存限制:256.0MB 问题描述 一个正整数可以划分为多个正整数的和,比如n=3时: 3:1+2:1+1+1: 共有三种划分方法. 给出一个正整数,问有多少种 ...
- Java实现 LeetCode 125 验证回文串
125. 验证回文串 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 示例 1: 输入: "A man, ...
- java实现第三届蓝桥杯源码变换
源码变换 这道题因为有一些html语言在编写的时候不会显示出来,所以就用代码格式把题目写出来 [编程题](满分22分) 超文本标记语言(即HTML),是用于描述网页文档的一种标记语言. HTML通过文 ...
- arduino 的analogRead() 和analogWrite()
模拟输入analogRead()函数的返回值范围是0 到1023; 而模拟输出analogWrite()函数的输出值范围是0 到255; 所以: val = analogRead(potpin); / ...
- 循序渐进VUE+Element 前端应用开发(9)--- 界面语言国际化的处理
我们开发的系统,一般可以不用考虑语言国际化的问题,大多数系统一般是给本国人使用的,而且直接使用中文开发界面会更加迅速 一些,不过框架最好能够支持国际化的处理,以便在需要的时候,可以花点时间来实现多语言 ...
- Spring-AOP之工作实践(一)
案例一.角色校验 项目中,对某些方法需要用户具备指定角色权限才能执行. /** * 角色校验注解 */ @Retention(RetentionPolicy.RUNTIME) @Target(Elem ...
- ubuntu12.04 跳过grub选择
1.修改/etc/grub.d/00_head文件. set timeout=-1 修改成 set timeout = ${GRUB_RECORDFAIL_TIMEOUT:--1} 2.修改/etc/ ...
- 2019-02-07 selenium...
今天是超级郁闷的一天 看教程 下了mysql-----配置-----不会----查资料------2小时后 mongodb-----配置------不会------查资料------1小时后 然后是各 ...
- 【JMeter_17】JMeter逻辑控制器__随机顺序控制器<Random Order Controller>
随机顺序控制器<Random Order Controller> 业务逻辑: 当控制器被触发时,将控制器下的所有子节点顺序打乱执行一遍,执行一遍,执行一遍,不是执行一个. 注意:是将子节点 ...
- 手写简易版Promise
实现一个简易版 Promise 在完成符合 Promise/A+ 规范的代码之前,我们可以先来实现一个简易版 Promise,因为在面试中,如果你能实现出一个简易版的 Promise 基本可以过关了. ...