职场新人第一次博客—— 记使用spring+设计模式解决大量ifelse的问题(一)

本文主要以策略 + 工厂模式来进行演示

    大家好,我是一名刚入职3个月的职场小菜 [旺柴]这是我自上学到入职以来的第一篇博客,如有错误欢迎指出 !!
    在这三个月中 我接手了个公司以前的项目,其实也没什么干的,就是看然后就修改一些数据。还从零开始做了一个为期1个月的项目[吃瓜] 后期迭代也是我做。
    在看完以前的项目、自己做了一个项目后我发现一个问题(其实是架构提醒的我[滑稽]),就是ifelse巨多,话不多说上图(公司代码就不全亮出来了)。具体代码都封装到新的方法中了
    这只是一小部分,具体内容封装起来了的。我这老项目一个service类里面有1600多行,刚开始看的时候人都差点看傻了。
    在新项目做完后,我们架构和项目经理做了一个复盘,具体说了啥我也不记得了[笑哭]我就记得说了个“像ifelse可以用策略模式嘛” ,说实话我当时策略模式是什么东西我都不知道,后来百度了下,诶 感觉有点东西,挺有意思的,话不多说直接上手。

1、首先我们来搞一个新的java项目,因为是测试就不连接sql了,直接写死

搞一个枚举类,这三个值代表我可能会传进来的值

public enum Role {
    bussiness("Bussiness"),
    collection("Collection"),
    productino("Production");

    private String hotelCode;
    //将三个值加载进list集合
    public static List<String> getList() {
        return Arrays.asList(Role.values()).stream()
                .map(Role::getHotelCode)
                .collect(Collectors.toList());
    }

    Role(String hotelCode) {
        this.hotelCode = hotelCode;
    }

    public String getHotelCode() {
        return hotelCode;
    }

}

2、再来搞一个策略接口

public interface getContactService {
    List<ZsBcContractDate> list(ZsBcContractDate zsBcContractDate);
}

3、第三步我们来创建几个业务类,去实现策略接口,返回值我就直接写死了

public class BussinessContactServiceImpl implements getContactService {

    @Override
    public List<ZsBcContractDate> list(ZsBcContractDate zsBcContractDate) {
        return initContact(zsBcContractDate);
    }

    private List<ZsBcContractDate> initContact(ZsBcContractDate zsBcContractDate) {
        return new ArrayList<ZsBcContractDate>() {
            {
                add(new ZsBcContractDate(1L));
                add(new ZsBcContractDate(2L));
                add(new ZsBcContractDate(3L));
            }
        };
    }
}
public class CollectionContactServiceImpl implements getContactService {

    @Override
    public List<ZsBcContractDate> list(ZsBcContractDate zsBcContractDate) {
        return initContact(zsBcContractDate);
    }

    private List<ZsBcContractDate> initContact(ZsBcContractDate zsBcContractDate) {
        return new ArrayList<ZsBcContractDate>() {
            {
                add(new ZsBcContractDate(4L));
                add(new ZsBcContractDate(5L));
                add(new ZsBcContractDate(6L));
            }
        };
    }
}
public class ProductionContactServiceImpl implements getContactService {
    
    @Override
    public List<ZsBcContractDate> list(ZsBcContractDate zsBcContractDate) {
        return initContact(zsBcContractDate);
    }

    private List<ZsBcContractDate> initContact(ZsBcContractDate zsBcContractDate) {
        return new ArrayList<ZsBcContractDate>() {
            {
                add(new ZsBcContractDate(7L));
                add(new ZsBcContractDate(8L));
                add(new ZsBcContractDate(9L));
            }
        };
    }
}

4、第四步也是最重要的一步了,创建工厂类,在这里我采用了反射的方式来获取类的实例对象(注:这里学的一位老哥的写法,但是我找不到他的博客了[捂脸]这位老哥要是看到了和我说哈)

public class ContactFactory {
    //通过反射来获取实例对象,所以咱就将这里写死了
    private static final String CONTACT_SERVICE_PERFIX = "com.example.designpatterns.service.impl.";
    private static final String CONTACT_SERVICE_SUFFIX = "ContactServiceImpl";
    //将所有业务类加载进这个MAP类中
    private static Map<String, getContactService> CONTACT_SERVER_MAP = new ConcurrentHashMap<>();

    static {
        Role.getList().forEach(r->{
            try {
                //这里因为我将所有的业务类都放在了一个包下,所以这里我就可以拿到全类名了
                String name = CONTACT_SERVICE_PERFIX + r + CONTACT_SERVICE_SUFFIX;
                CONTACT_SERVER_MAP.put(r, (getContactService) Class.forName(name).newInstance());
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            }
        });
    }
    public getContactService getContactServiceImpl(String hotelCode) {
        return CONTACT_SERVER_MAP.get(hotelCode);
    }
}

5、最后一步 可以运行试试看了[旺柴]

    public static void main(String[] args) {
        getContactService bussiness = ContactFactory.getContactServiceImpl("Bussiness");
        getContactService production = ContactFactory.getContactServiceImpl("Production");
        getContactService collection = ContactFactory.getContactServiceImpl("Collection");
        List<ZsBcContractDate> list1 = production.list(new ZsBcContractDate(1L));
        List<ZsBcContractDate> list = bussiness.list(new ZsBcContractDate(1L));
        List<ZsBcContractDate> list2 = collection.list(new ZsBcContractDate(1L));
        System.out.println(list);
        System.out.println(list1);
        System.out.println(list2);
    }

在这里插入图片描述

    怎么样 对比第一张图的switch写法是不是很NICE,虽然多写了几个业务类,但是看起来更加简洁很舒服了不是吗[旺柴]再要添加一个条件的时候直接添加一个枚举值+一个业务类就好了啦!!
    好啦因为还在上班,这一篇就写到这啦,晚上回去在更新如何在使用spring的时候运用这两种模式[吃瓜] 新人一个,如有错欢迎老哥指正 [旺柴]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值