欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

消灭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之用函数式编程(附源码)

上一篇:

下一篇: