栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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即可,不仅增强了代码的可扩展性,而且代码简捷宜读。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/666372.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号