小白写了一堆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 522 最长特殊序列 II(查找最长的非子序列的长度)
522. 最长特殊序列 II 给定字符串列表,你需要从它们中找出最长的特殊序列.最长特殊序列定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列). 子序列可以通过删去字符串中的某些 ...
- Java实现 LeetCode 263 丑数
263. 丑数 编写一个程序判断给定的数是否为丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例 1: 输入: 6 输出: true 解释: 6 = 2 × 3 示例 2: 输入: 8 输 ...
- Java实现 LeetCode 257 二叉树的所有路径
257. 二叉树的所有路径 给定一个二叉树,返回所有从根节点到叶子节点的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 输入: 1 / \ 2 3 \ 5 输出: ["1->2 ...
- Java实现 LeetCode 201 数字范围按位与
201. 数字范围按位与 给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点). 示例 1: 输入 ...
- Android studio环境配置(运行报错)
报错的种类有很多,下面的方法能解决大多数: 所有路径不能用中文,不能有空格,逗号句号也不能用中文,项目文件路径也不行 首先要配置Java环境,这个就不多说了, 这里有以下JAVA_HOME的配置,下图 ...
- (十)DVWA之SQL Injection--测试分析(Impossible)
DVWA之SQL Injection--测试分析(Impossible) 防御级别为Impossible的后端代码:impossible.php <?php if( isset( $_GET[ ...
- linux性能监控工具nmon生成HTML报告-EasyNmon
一.关于easyNmon说明 为了方便多场景批量性能测试,用golang写了个监控程序,可以通过get url方式启动和停止nmon服务,非常适合配合Loadrunner性能测试框架和jmeter使用 ...
- 不可不知的JSON处理库(cJSON)
ANSI C中的超轻量级JSON解析器 JSON(JavaScript对象表示法)是一种轻量级的数据交换格式.人类易于阅读和书写.机器很容易解析和生成.它基于JavaScript编程语言标准ECMA- ...
- WPF样式学习第一天
因为上班的公司要我用wpf写软件,刚毕业出来,学校也没教过wpf,只会winform,再加上wpf用winform的框架写法也能实现很多需求,但是就不能体现wpf的优点了,今天就先来学wpf的样式,因 ...
- [computer graphics]世界坐标系->相机坐标系详细推导
基变换 理论部分 在n维的线性空间中,任意n个线性无关的向量都可以作为线性空间的基,即空间基不唯一.对于不同的基,同一个向量的坐标一般是不同的.因为在计算机图形学中,主要研究三维的空间,所以可以简化问 ...