利用多态代替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