关于用策略模式代替if else

jk1022 2015-08-28 12:15:29

if(type.equals(1)){
return 1;
}else if(type.equals(2)){
return 2;
}else if(type.equals(3)){
return 3;
}else if(type.equals(4)){
return 4;
}else{
return null;
}

google了些关于用策略模式代替if else的方式
如上段代码, 无论是用策略模式或是策略+工厂模式来代替if else
都有一个必须的前提条件就是我必须知道type是什么值才能实现用设计模式去代替if else

假如说我不知道type会是什么值, 请假各位这时我应该样去做才能减少if else
...全文
667 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
summeryTrees 2016-08-15
  • 打赏
  • 举报
回复
引用 10 楼 skgary 的回复:
[quote=引用 8 楼 jk1022 的回复:] 这个只是举个例子而已, 现在疑惑的只是在需要用设计模式的时候用不上... 不知道就像我最后说的那种...不知道该怎么用设计模式了...
2楼不是已经给出例子了嘛。 对于策略模式而言,每一个子类的type是固定的值。[/quote] 你压根就没有明白,作者想表达的是什么!!
skgary 2015-08-31
  • 打赏
  • 举报
回复
引用 8 楼 jk1022 的回复:
这个只是举个例子而已, 现在疑惑的只是在需要用设计模式的时候用不上... 不知道就像我最后说的那种...不知道该怎么用设计模式了...
2楼不是已经给出例子了嘛。 对于策略模式而言,每一个子类的type是固定的值。
jk1022 2015-08-28
  • 打赏
  • 举报
回复
引用 2 楼 sgwen20 的回复:
public interface Strategy { public int cal(); } public class StrategyA implements Strategy { public int cal() { return 1; } } public class StrategyB implements Strategy { public int cal() { return 2; } } public class UseStrategy { public int do(Stragegy strategy) { return strategy.cal(); } }
没太懂你的意思, 如果用这种方式 呢

if(type < 1){
           return 1;
}else if(type > 1 && type < 3){
           return 2;
}else if(type > 3 && type < 5){
           return 4;
}else{
           return 5;
}
jk1022 2015-08-28
  • 打赏
  • 举报
回复
引用 1 楼 skgary 的回复:
楼主可能还是对面向对象的设计理解上有点问题。 对于策略模式而言,你根据type分成若干个字类,然后对于子类而言,type是固定的,所以只需要调用相应子类的方案即可。
我可以理解为你的意思就是

map.put(1, 子类1)
map.put(2, 子类2)
可能是我表达出错了..我想表达的是

if(type < 1){
           return 1;
}else if(type > 1 && type < 3){
           return 2;
}else if(type > 3 && type < 5){
           return 4;
}else{
           return 5;
}
如果是这样的方式我还能用设计模式吗?
dlhansy 2015-08-28
  • 打赏
  • 举报
回复
1. if else 并不都适合用策略模式替代,只有每个分支足够复杂,且每个分支用不同方法做同一件事,才需要使用策略模式 2.使用策略模式确实也是需要知道type的,工厂类根据type实例化不同的子类,每个子类只实现其中一个type的功能
shiguowen 2015-08-28
  • 打赏
  • 举报
回复
public interface Strategy { public int cal(); } public class StrategyA implements Strategy { public int cal() { return 1; } } public class StrategyB implements Strategy { public int cal() { return 2; } } public class UseStrategy { public int do(Stragegy strategy) { return strategy.cal(); } }
skgary 2015-08-28
  • 打赏
  • 举报
回复
楼主可能还是对面向对象的设计理解上有点问题。 对于策略模式而言,你根据type分成若干个字类,然后对于子类而言,type是固定的,所以只需要调用相应子类的方案即可。
dlhansy 2015-08-28
  • 打赏
  • 举报
回复
if else 条件分支多不是使用策略模式的理由,而是每个分支足够复杂。 设计模式使用不合适会造成不必要的复杂度。 另外type如何判断无所谓,使用工厂都可以做到
jk1022 2015-08-28
  • 打赏
  • 举报
回复
引用 7 楼 skgary 的回复:
[quote=引用 4 楼 jk1022 的回复:] [quote=引用 1 楼 skgary 的回复:] 楼主可能还是对面向对象的设计理解上有点问题。 对于策略模式而言,你根据type分成若干个字类,然后对于子类而言,type是固定的,所以只需要调用相应子类的方案即可。
我可以理解为你的意思就是

map.put(1, 子类1)
map.put(2, 子类2)
可能是我表达出错了..我想表达的是

if(type < 1){
           return 1;
}else if(type > 1 && type < 3){
           return 2;
}else if(type > 3 && type < 5){
           return 4;
}else{
           return 5;
}
如果是这样的方式我还能用设计模式吗?[/quote] 如3楼所说,你每个分支都足够复杂,才用设计模式。 如果你每个分支只是return,代码反而会让人变的让人难以理解。 如果你每个return 都至少对应于20行以上的代码的,可以用设计模式去优化一下。(个人觉得一个函数应该小于80行)[/quote] 这个只是举个例子而已, 现在疑惑的只是在需要用设计模式的时候用不上... 不知道就像我最后说的那种...不知道该怎么用设计模式了...
skgary 2015-08-28
  • 打赏
  • 举报
回复
引用 4 楼 jk1022 的回复:
[quote=引用 1 楼 skgary 的回复:] 楼主可能还是对面向对象的设计理解上有点问题。 对于策略模式而言,你根据type分成若干个字类,然后对于子类而言,type是固定的,所以只需要调用相应子类的方案即可。
我可以理解为你的意思就是

map.put(1, 子类1)
map.put(2, 子类2)
可能是我表达出错了..我想表达的是

if(type < 1){
           return 1;
}else if(type > 1 && type < 3){
           return 2;
}else if(type > 3 && type < 5){
           return 4;
}else{
           return 5;
}
如果是这样的方式我还能用设计模式吗?[/quote] 如3楼所说,你每个分支都足够复杂,才用设计模式。 如果你每个分支只是return,代码反而会让人变的让人难以理解。 如果你每个return 都至少对应于20行以上的代码的,可以用设计模式去优化一下。(个人觉得一个函数应该小于80行)
jk1022 2015-08-28
  • 打赏
  • 举报
回复
引用 3 楼 dlhansy 的回复:
1. if else 并不都适合用策略模式替代,只有每个分支足够复杂,且每个分支用不同方法做同一件事,才需要使用策略模式 2.使用策略模式确实也是需要知道type的,工厂类根据type实例化不同的子类,每个子类只实现其中一个type的功能
1. 我理解的是if else分支过多的时候就可以考虑策略模式,主要的目的是为了减少if else 2. 上面那个表达的稍微有点问题,下面是我想表达的

if(type < 1){
           return 1;
}else if(type > 1 && type < 3){
           return 2;
}else if(type > 3 && type < 5){
           return 4;
}else{
           return 5;
}

50,730

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧