ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

总结之springboot中通过策略和工厂模式来处理if-else

2021-11-01 21:59:47  阅读:275  来源: 互联网

标签:总结 Map return String userMap private else public springboot


意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

主要解决:在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。

何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。

如何解决:将这些算法封装成一个一个的类,任意地替换。

关键代码:实现同一个接口。
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

要点:

spring两种方式可以将实现了同一接口的所有实现类注入map和list中
通过Spring将实现user的实现类都自动注入到userMap类中,

第一种注入方式

	@Autowired
    private List<IUser> userList;
    @Autowired
    private final Map<String, IUser> userMap = new ConcurrentHashMap<>();

    public SimpleContext(Map<String, IUser> userMap) {
        this.userMap.clear();
        userMap.forEach((k, v)-> this.userMap.put(k, v));
    }

实现IUser接口的类都会注入到userList中,userList中就有数据了有OneUser,TwoUser

第二种注入方式

    private List<IUser> userList;

    private final Map<String, IUser> userMap = new ConcurrentHashMap<>();
	@Autowired
    public void SimpleContext(Map<String, IUser> userMap) {
        this.userMap.clear();
        userMap.forEach((k, v)-> this.userMap.put(k, v));
    }
    @Autowired
    public void aa(List<IUser> list){
		this.userList=list;
    }

通过上面特性可以做工厂模式

通过工厂来获取对应的策略

实例如下:

form工厂

@Service
public class AppFormFactory {
    private  static  final Map<String, IAppForm> STRATEGY_MAP = new ConcurrentHashMap<>();
   public AppFormFactory(Map<String, IAppForm> map){
       STRATEGY_MAP.clear();
       map.forEach((k,v)->STRATEGY_MAP.put(v.getAppType(),v));
   }

   public static IAppForm getInstance(String appType){
       return STRATEGY_MAP.get(appType);
   }
}

抽象方法提取公共部分,返回不同(可以不需要)

public  abstract  class AppFormAbstract  implements IAppForm {

    public abstract String getAppType() ;

    @Override
    public JsonResult initBpm(Boolean isNeedinitBpmDef,Map<String, List<FormPcDto>> mappc) {
        if(isNeedinitBpmDef == null || isNeedinitBpmDef) {
            //调用初始化一个流程定义
            JsonResult dpmResult = SpaceUtil.doActOriginal(TokenUtil.getToken(), JSON.toJSONString(mappc));
            if (Objects.isNull(dpmResult) || dpmResult.getCode() == JsonResult.FAIL_CODE) {
                return JsonResult.Fail("初始化流程定义失败!");
            }
            return  dpmResult;
        }
        return JsonResult.Success("不需要初始化");
    }

    @Override
    public abstract String backAppInterface(JSONObject jsonObject);
}

n个实现类

@Service
public class WorkOrderForm extends AppFormAbstract {
    private final static String WORKORDER_APP_TYPE="wordOrder";
    @Override
    public String getAppType() {
        return WORKORDER_APP_TYPE;
    }


    @Override
    public String  backAppInterface(JSONObject jsonObject) {
        xxxxxxx;
    }
}
@Service
public  class LightServiceForm extends AppFormAbstract {
    private final static String LIGTH_APP_TYPE="lightApp";

    @Override
    public String getAppType() {
        return LIGTH_APP_TYPE;
    }

    @Override
    public String backAppInterface(JSONObject jsonObject) {
      xxxxxx
    }
}

使用

 IAppForm appForm=AppFormFactory.getInstance(StringUtils.isNotEmpty(serviceType)?serviceType:SpaceUtil.SERVICE_TYPE_WORD_ORDER);
                    //是否需要
                    Boolean needInitPmDef=json.getBoolean("isNeedInitBpmDef");
                    JSONObject backObject=new JSONObject();
                    JsonResult dpmResult=appForm.initBpm(needInitPmDef,mappc);
                    str=appForm.backAppInterface(backObject);

上述也是aba\abab解决方案

if(a){
	A
	}else if(b){
		B
	}else{
	A
	}

标签:总结,Map,return,String,userMap,private,else,public,springboot
来源: https://blog.csdn.net/IManiy/article/details/121089302

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有