if-else过多,使用策略模式(Strategy)解决if-else乱象

if-else过多,使用策略模式(Strategy)解决if-else乱象,第1张

if-else过多,使用策略模式(Strategy)解决if-else乱象

if else 应用乱象主要分为以下几点:

1.if else 过多
2.if else 嵌套过深
3.表达式过于复杂

会导致以下的问题:

1.可读性差

2.可扩展性差

从软件设计角度来看, 不符合单一职责原则, 也不符合开闭原则; 由于需求千变万化, 所以提高扩展性非常重要;

今天我将使用策略设计模式(基于spring)解决if-else乱象的问题。

可以看出,实现策略模式分为两个重要的步骤:
第一:传入选择某种具体策略的标识;
第二:将所有的策略单独封装
第三:根据传入的标识,选择具体策略

在spring中, 我们可以将所有的策略实现类交给spring来管理;

案例:政法平台解析数据包在不同的地区使用不同的解析模式: 云南-云南模式;四川-四川模式;江苏-江苏模式等。
第一步:定义立案策略接口

public interface ZfptStrategyService {
    //政法平台模式(标识)
    String getZfptms();

    //具体的策略算法(业务处理): xml解析
    String parse(String path);
}

第二步:编写实现类, 以江苏四川为例:

@Service
public class JszfStrategyService implements ZfptStrategyService{
    private static final String zfptms = "jsms";

    @Override
    public String getZfptms() {
        return zfptms;
    }

    @Override
    public String parse(String path) {
        //具体业务处理
        System.out.println("江苏政法模式================");
        return null;
    }
}
@Service
public class SczfStrategyService implements ZfptStrategyService{
    private static final String zfptms = "scms";

    //这里指定与当前策略相匹配的标识;
    @Override
    public String getZfptms() {
        return zfptms;
    }

    @Override
    public String parse(String path) {
        //具体业务处理
        System.out.println("四川政法模式================");
        return null;
    }
}

第三步:编写策略工厂类,方法实现如下:

@Component
public class ZfptStrategyFactory implements InitializingBean {
    //将之前所有的策略实现类注入;
    @Autowired
    List zfptStrategyServices;

    private static Map zfptStrategyServiceMap = new HashMap<>();

    //spring bean初始化时收集所有策略实现类的策略标识,组成策略标识->策略实现的映射
    @Override
    public void afterPropertiesSet() {
        zfptStrategyServices.stream().forEach(zfptStrategyService -> {
            zfptStrategyServiceMap.put(zfptStrategyService.getZfptms(), zfptStrategyService);
        });
        System.out.println("策略组装完成---------》" + zfptStrategyServiceMap);
    }

    public static ZfptStrategyService getZfptService(String zfptms){
        return zfptStrategyServiceMap.get(zfptms);
    }
}


这样就实现了映射关系。

最后根据政法平台模式,执行具体的策略。

ZfptStrategyFactory.getZfptService(zfptms).parse("");

总结:通过策略模式,以后我们再新增新的政法平台模式时,不再需要改以前的代码,只需要继承ZfptStrategyService即可,不仅增强了代码的可扩展性,而且代码简捷宜读。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5671634.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-16
下一篇2022-12-17

发表评论

登录后才能评论

评论列表(0条)

    保存