针对同类型业务模板方法简直不要太好用

1.背景

        之前工作做过几个需求:

        1.1类似**险种,**产品。功能类似,例如给产品/险种上设置**责任。两者区别就只在于最后的查询不一致,我们可以使用模版方法

        1.2不同机构有类似的处理,例如针对一些字典项相同处理,多选参数的处理之类。多个机构的区别在于底层查询方法不同

        1.3;不同公告,相同的时间校验,是否开启**功能处理等。不同在于底层获取的数据不一致

2.模版方法

        做了一点小修正,注意父类的方法要用final修饰,不允许被继承重写

        2.1 模版方法的抽象父类,对于背景中,该类表示险种,产品抽象父类,不同机构的抽象父类,不同公告的抽象父类。

        公用方法在父类中写,子类中完成非this调用的方法。也就是我们abstract修饰的方法getSpecialList(AgencyReq req)

public abstract class AbstractAgencyService {

    public final List<? extends AgencyRes> getAgencyList(AgencyReq req){

        this.checkTime(req);

        this.parseParam(req);

        List<? extends AgencyRes>  result = getSpecialList(req);

        this.parseResult(result);

        return result;
    }

    private void parseResult(List<? extends AgencyRes> result) {
        //todo 处理返回结果,例如状态值转化,0->不可用,1->可用
    }

    protected abstract List<? extends AgencyRes> getSpecialList(AgencyReq req) ;

    private void parseParam(AgencyReq req) {
        // todo 处理参数,例如参数转化,把String类型转数据

    }
    //公用处理时间
    private void checkTime(AgencyReq req) {
        //todo 处理参数中的时间
    }

}

        2.2 子类实现演示

        这是两个子类,分别继承了抽象类,并完成了方法重写

/*
  陈旧机构
 */

@Service
public class CjAgencyServiceImpl extends AbstractAgencyService {
    @Override
    protected List<? extends AgencyRes> getSpecialList(AgencyReq req) {
        //todo mapper调用数据查询自己特殊的机构查询方式
        return null;
    }
}




/**
 * 创新机构
 */
@Service
public class CxAgencyServiceImpl extends AbstractAgencyService {

    @Override
    protected List<? extends AgencyRes> getSpecialList(AgencyReq req) {
        //todo mapper调用数据查询自己特殊的机构查询方式
        return null;
    }
}

2.3  抽象方法的使用

        以上模版我们使用在具体业务类中,通过applicationcontext上下文和我们对应的实现类注册到spring的名称来获取具体实现,最后调用方法即可完成

package com.zs.account.service.Impl;


import com.zs.account.POJO.AgencyReq;
import com.zs.account.POJO.AgencyRes;
import com.zs.account.service.AbstractAgencyService;
import com.zs.account.service.AgencyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 具体业务实现类
 */
@Service
public class AgencyServiceImpl implements AgencyService {

    @Autowired
    private ApplicationContext context;

    /**
     * 这个方法做个说明,这个是属于业务类,我们可以做很多跟业务相关,而返回的AgencyRes,不一定是我们需求,我只是为了简单这样操作了
     * 通常这个返回会跟业务相关,而我们的子实现只是业务中的一环,你可以在该业务操作中做跟业务相关逻辑
     *
     * @param req
     * @param type
     * @return
     */
    @Override
    public List<? extends AgencyRes> getList(AgencyReq req, String type) {

        //todo 通过类型转化,获取到对应service的名称,从而拿到对应的子实现类serviceImpl

        AbstractAgencyService childServiceImpl = context.getBean(type, AbstractAgencyService.class);

        List<? extends AgencyRes> agencyList = childServiceImpl.getAgencyList(req);

        return agencyList;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值