小白写了一堆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实现洛谷P1250 种树 (暴力)
P1250 种树 输入输出样例 输入 9 4 1 4 2 4 6 2 8 9 2 3 5 2 输出 5 PS: 我种最少的树,意味着我的树要最多的被利用,意味着,我的树要尽可能的靠中间种, 也就是我把 ...
- Java实现蓝桥杯凑算式(全排列)
题目6.凑算式 凑算式 B DEF A + - + ------- = 10 C GHI (如果显示有问题,可以参见[图1.jpg]) 这个算式中AI代表19的数字,不同的字母代表不同的数字. 比如: ...
- Java实现 蓝桥杯VIP 算法提高 邮票面值设计
算法提高 邮票面值设计 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤13)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮 ...
- Java实现 洛谷 P1023 税收与补贴问题
import java.util.Scanner; public class Main { public static void main(String[] args){ Scanner in = n ...
- Linux 工作管理
把进程放入后台 进程后加&,这时,进程在后台是运行的 tar -zcf etc.tar.gz /etc & 在执行程序时,快速按下ctrl+z快捷键,这时,进程在后台是停止的 查看后台 ...
- kvm的命令简单使用
virsh命令常用参数总结 参数 参数说明 基础操作 list 查看虚拟机列表,列出域 start 启动虚拟机,开始一个(以前定义的)非活跃的域 shutdown 关闭虚拟机,关闭一个域 dest ...
- Nginx解决前端调用后端接口跨域问题
1.项目中遇到的问题描述: 前端调用zuul统一网关服务接口,请求状态码200,但是无返回数据. 浏览器控制台报错信息:No Access-Control-Allow-Origin header i ...
- Elasticsearch 别管原理,先run起来
少点代码,多点头发 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues. https://github.com/midou-tech/articles 看文章有两点需要注意: 本公 ...
- Autoware 进行 Robosense-16 线雷达与 ZED 双目相机联合标定!
项目要标定雷达和相机,这里记录下我标定过程,用的速腾 Robosense - 16 线雷达和 ZED 双目相机. 一.编译安装 Autoware-1.10.0 我没有安装最新版本的 Autoware, ...
- Email地址验证
<script>function validateForm(){ var x=document.forms["myForm"]["email"].v ...