消灭ifelse之策略模式(附源码)
程序员文章站
2024-01-05 14:48:10
...
我们经常看到下面这种代码,里面成篇的ifelse,看起来非常low,本咸鱼在刚入门时就经常写这样的代码,为此经常被大佬吐槽…日后,你若写出bug,不要将为师供出来就好。。。。
//举例老的if else
if ("xxx".equals(type)) {
System.out.println("do xxx");
} else if ("yyy".equals(type)) {
System.out.println("do yyy");
} else if ("zzz".equals(type)) {
System.out.println("do zzz");
} else if ("xyz".equals(type)) {
System.out.println("do xyz");
}
// 后面可能会有更多
那么有没有一种设计模式或者编程方法去除呢?
接下来就是见证奇迹的时刻。
策略模式:定义一组算法,并把其封装到一个对象中。然后在运行时,可以灵活的使用其中的一个算法。
在java中比较器Comparator就是一种策略模式的应用
class Node{
int x;
int y;
Node(int x,int y){
this.x=x;
this.y=y;
}
@Override
public String toString() {
return "Node{" +
"x=" + x +
", y=" + y +
'}';
}
}
public class Main {
public static void way(int num[],int n){
}
public static void main(String[] args) {
Node node1=new Node(1,2);
Node node2=new Node(1,1);
ArrayList<Node> list=new ArrayList<>();
list.add(node1);
list.add(node2);
Collections.sort(list, new Comparator<Node>() {
/**o1-o2为升序序排列,o2-o1为降序排列,若具体到某一字段,则根据该字段进行排列*/
@Override
public int compare(Node o1, Node o2) {
if (o1.x==o2.x) //若x属性相等,根据y来升序
return o1.y-o2.y;
return o1.x-o2.x;//x属性不相等,根据x来升序排列
}
});
for (Node node:list
) {
System.out.println(node.toString());
}
}
}
接下来用一个更简单接地气的例子来完整的展示策略模式。
用策略模式来实现计算器
定义四则运算接口,公共方法getresult,后面的实现是不一样的,也就是策略不一样。
public interface FourOperations {
int getresult(int a, int b);
}
定义策略工具类,接收策略和运行策略方法。
public class Strategy {
//初始化策略
FourOperations fo = new Reduce();
public void setFourOperations(FourOperations fo) {
this.fo = fo;
}
public int run(int a, int b) {
return fo.getresult(a, b);
}
}
加法策略
public class Add implements FourOperations {
@Override
public int getresult(int a, int b) {
// TODO Auto-generated method stub
return a + b;
}
}
减法策略
public class Reduce implements FourOperations {
@Override
public int getresult(int a, int b) {
// TODO Auto-generated method stub
return a - b;
}
}
测试类
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Strategy strategy = new Strategy();
strategy.setFourOperations(new Add());
System.out.println("当前策略运行结果:"+strategy.run(1, 2));
}
}
运行
当前策略运行结果:3
代码库:https://gitee.com/SlienceDemo/java-ee.git
https://gitee.com/SlienceDemo/java-ee/tree/master/proxy/src/strategy
可以看到ifelse的确是去掉了,但程序也更加复杂了,有多少种策略就要新建多少个类,好麻烦啊。
别急看我下篇文章----> 消灭ifelse之用函数式编程(附源码)