相信大家在平时的工作中都写过那种令人崩溃的switch分支语句,也许你已经对代码进行了优化,比如每一个分支都写成一个函数,最后呈现出来的结果大概是这个样子
public int calculatePay(User user){ switch(user.type){ case A: return methodA(); case B: return methodB(); case C: return methodC(); } }
虽然不想承认,但是我在之前的程序中就是这么写的,有人会问,这么写有问题吗?其实没有什么问题,但是我们还可以将代码写的更加的优美一点,而且假设还有类似的方法,例如。 calculateBill(User user) 等等的话 都要这么麻烦吗?而且这个也明显不符合开放闭合原则,一旦出现新的类型,就不得不修改所有方法的代码!!
那么如何修改呢?解决方法是将switch语句给深埋到抽象工厂下面,不让别人看到,该工厂使用switch语句为User创建适当的实现类,而具体的方法,比如calculatePay以及 calculateBill等 则通过User接口多态的接受派遣,最后的代码呈现为,至于具体的好处就自己慢慢体会吧!!!!
public abstract class User{ public. abstract. int calculatePay(); public abstract int calculateBill(); } public interface UserFactory{ public User getUser(UserType u); } public class UserFactoryImpl implements UserFactory{ public User. getUser(UserType u){ switch(u.type){ case A: return UserA; case B: return UserB; case C: return UserC; } } }
以后有增加新的类型的时候,只需要新增加一个实现类UserD,UserE就行了 业务逻辑是不需要修改的!
原文:https://www.cnblogs.com/changeCode/p/11000452.html