别再抱怨天天写crud了

162 阅读2分钟

利用多态代替if switch优化代码

最近在读一本叫做《 重构:改善既有代码的设计 》的书,觉得很不错。书中有一个令我印象深刻的优化方式是利用多态代替判断。正好我在公司中也在开发类似代码,于是就想写个demo测试一下。如果可行,准备去优化公司现有代码

代码实现

整体架构

1.png

具体代码

优化之前

Animal 类
import java.io.Serializable;

/**
 * @Author: Yuyan_i
 * @Title: Animal
 * @Date: 2023-04-05 22:40
 * @Description: 动物类
 */
public class Animal implements Serializable {
    private String type;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}
BeforeMain main文件
import java.io.Serializable;

/**
 * @Author: Yuyan_i
 * @Title: BeforeMain
 * @Date: 2023-04-05 22:44
 * @Description:
 */
public class BeforeMain {
    public static void main(String[] args) {
        Animal animal = new Animal();
        animal.setType("cat");
        if ("fish".equals(animal.getType())){
            System.out.println("游");
        }else if ("cat".equals(animal.getType())){
            System.out.println("跑");
        }else {
            System.out.println("出错了");
        }
    }
}

优化之后

OperateChooser类
import com.mydemo.after.domain.Animal;
import com.mydemo.after.domain.animalimpl.Cat;
import com.mydemo.after.domain.animalimpl.Fish;
import com.mydemo.after.operate.AnimalOperate;

/**
 * @Author: Yuyan_i
 * @Title: AnimalChooser
 * @Date: 2023-04-05 21:18
 * @Description: 操作选择器
 */
public class OperateChooser {
    public static AnimalOperate chooseAnimalOperate(Animal animal){
        switch (animal.getType()){
            case "cat":
                return new Cat();
            case "fish":
                return new Fish();
            default:
                return null;
        }
    }
}
Animal 抽象类
import com.mydemo.after.operate.AnimalOperate;

import java.io.Serializable;

/**
 * @Author: Yuyan_i
 * @Title: Animal
 * @Date: 2023-04-05 21:12
 * @Description: 动物 超类
 */
public abstract class Animal implements Serializable, AnimalOperate {
    String type;
    public String getType(){
        return this.type;
    }
}
Cat 猫--子类
import com.mydemo.after.domain.Animal;

import java.io.Serializable;

/**
 * @Author: Yuyan_i
 * @Title: Cat
 * @Date: 2023-04-05 21:15
 * @Description: 猫
 */
public class Cat extends Animal implements Serializable {
    private static String type = "cat";
    public String getType(){
        return this.type;
    }

    @Override
    public void run() {
        System.out.println("跑");
    }
}
Fish 鱼--子类
import com.mydemo.after.domain.Animal;

import java.io.Serializable;

/**
 * @Author: Yuyan_i
 * @Title: Fish
 * @Date: 2023-04-05 21:16
 * @Description: 鱼
 */
public class Fish extends Animal implements Serializable {
    private static String type = "fish";
    public String getType(){
        return this.type;
    }

    @Override
    public void run() {
        System.out.println("游");
    }
}
AnimalOperate 操作接口
/**
 * @Author: Yuyan_i
 * @Title: AnimalOperate
 * @Date: 2023-04-05 21:22
 * @Description: 操作接口
 */
public interface AnimalOperate {
    public void run();
}
PolymorphicTest main文件
import com.mydemo.after.chooser.OperateChooser;
import com.mydemo.after.domain.animalimpl.Cat;
import com.mydemo.after.domain.animalimpl.Fish;

/**
 * @Author: Yuyan_i
 * @Title: PolymorphicTest
 * @Date: 2023-04-05 21:34
 * @Description: main文件
 */
public class PolymorphicTest {
    public static void main(String[] args) {
        Fish fish = new Fish();
        OperateChooser.chooseAnimalOperate(fish).run();

        Cat cat = new Cat();
        OperateChooser.chooseAnimalOperate(cat).run();
    }
}

后言

读到这里可能有人会说,本来几行代码的事情,但是被优化之后变成了如此麻烦的代码,并没有看出重构之后,代码优化在哪里。 是的,因为我们的例子特别简单,所以并不能体现出重构的优点,但如果放到一个相当大,并且需求在不断更新的项目中呢? 另外,于我个人而言。这不仅仅是写代码,更是一种意识。 在读《 重构:改善既有代码的设计 》之前,其实我也抱怨过在公司天天写crud,但是有没有想过,我们写的代码可以以一种更好的方式呈现。 感谢大家能够读到这里。 推荐大家去看一下源码,因为本文的代码耦合度比较高 demo源码地址:

https://gitee.com/yuyan_i/psid