小白写了一堆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实现 LeetCode 378 有序矩阵中第K小的元素
378. 有序矩阵中第K小的元素 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素. 请注意,它是排序后的第k小元素,而不是第k个元素. 示例: matrix = [ ...
- Java实现 蓝桥杯 历届试题 横向打印二叉树
问题描述 二叉树可以用于排序.其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树. 当遇到空子树时,则把该节点放入那个位置. 比如,10 8 5 7 ...
- 痞子衡嵌入式:降低刷新率是定位LCD花屏显示问题的第一大法(i.MXRT1170, 1280x480 LVDS)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1170上LCD花屏显示问题的分析解决经验. 痞子衡最近这段时间在参与一个基于i.MXRT1170的大项目(先保个密),需要 ...
- (一)SQL注入漏洞测试的方式总结
一.工具注入 1.SQLMap的作用 判断可注入的参数 判断可以用那种SQL注入技术来注入 识别出哪种数据库 根据用户选择,读取哪些数据(库.表.列.字段值...) 2.注入技术 [A]基于布尔的盲注 ...
- 并发编程之sun.misc.Unsafe类
1.Unsafe知识点整理 2.代码: package com.javabasic.unsafe; import java.lang.reflect.Field; import sun.misc.Un ...
- mysqldump导出数据库
问题描述:要将一个mysql中六个数据库导出来,使用mysqldump导出 mysqldump使用语法:mysqldump -uroot -p -S /data/mysql/db_itax_m/mys ...
- SpringMVC+Mybatis初尝试
一个月前简单学完了SpringMVC框架和Mybatis框架,一直没有使用过,今天主要用它做了个简单的学生管理系统,不过第一次用框架,实现的功能简单,比较low. 注:这里使用的数据库是SQLServ ...
- win10系统下office 2019激活
1.新建一个文本文件,创建批处理文件office.bat @echo off (cd /d "%~dp0")&&(NET FILE||(powershell sta ...
- CSS里盒子模型中【margin垂直方向边界叠加】问题及解决方案
边界重叠是指两个或多个盒子(可能相邻也可能嵌套)的相邻边界(其间没有任何非空内容.补白.边框)重合在一起而形成一个单一边界. 两个或多个块级盒子的垂直相邻边界会重合. 如果都是正边界,结果的边界宽度是 ...
- abp-CMS模块-广告
无论是开发app还是网站,可能都需要一个广告功能,比如我们常见的在首页有个轮播广告,里面会轮播显示多个图片.还有比如一个新闻门户网站 很常见的 banner横幅广告,还有js特效广告等.本篇说说在ab ...