让我看看谁还写if/switch

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

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

代码实现

整体架构

请添加图片描述

具体代码

优化之前
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();
    }
}

后言

读到这里可能有人会说,本来几行代码的事情,但是被优化之后变成了如此麻烦的代码,并没有看出重构之后,代码优化在哪里。

是的,因为我们的例子特别简单,所以并不能体现出重构的优点,但如果放到一个相当大,并且需求在不断更新的项目中呢?

另外,于我个人而言。这不仅仅是写代码,更是一种意识。

demo源码地址:

https://gitee.com/yuyan_i/psid

猜你喜欢

转载自blog.csdn.net/qq_45770147/article/details/129979909
今日推荐