让我看看谁还写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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值