前言大家好,我是捡蜗牛的小男孩。这篇文章的内容是:在原有代码的基础上,如何通过设计模式一步步优化代码?在日常工作中,我们使用最多的设计模式是策略模式、工厂模式和模板方法模式。最近正好用这几个模式来优化代码,所以今天就和大家说说我是怎么优化的,我的思路是什么。希望这篇文章对大家有所帮助。优化前伪代码的流程策略模式如何应用,工厂设计模式如何应用,模板方法模式如何应用。唠叨几句1.先看一下优化前的伪代码流程。优化前,原代码的大体逻辑。代码如下:classParameter{intpageSize;intpageNo;int请求号;//其他参数。}//逻辑处理,是否打客户群booleanisMarketHit(Parameterdto){//如果是企业客户群类型if(dto.type=='enterprise'){//没有请求关闭开关if(isEnterpriseSwitchClose){返回false;}//如果只请求一条记录if(dto.reqNum==1){//调用大数据查询接口returnsingleRemoteEOIinvoke(dto);//如果请求多条记录}elseif(dto.reqNum>1){//调用大数据批处理接口returnbatchRemoteEOIinvoke(dto);}//如果是营销型}elseif(dto.type=='market_list'){//不请求关闭if(isMarketListSwitchClose){returnfalse;}//如果只请求一条记录if(dto.reqNum==1){//调用营销查询接口returnsingleRemoteMarketinvoke(dto);//如果请求多条记录}elseif(dto.reqNum>1){//调用营销批量接口returnbatchRemoteMarketinvoke(dto);}}}这段代码可能存在什么问题?如果if分支多了,代码就会变得臃肿。如果你需要访问一个新的类型,你只能在源代码中修改它。更专业一点,上面的代码违反了面向对象的开闭原则和单一性原则。开闭原则:(对扩展开放,对修改关闭),增加或删除某个逻辑需要修改原有代码。单一原则:(规定一个类应该只有一个变更原因),修改任何类型的分支逻辑代码都需要修改当前类的代码。2、策略模式如何应用?大家是否还记得,如果代码中有多个if...else等条件分支,并且每个条件分支都可以封装替换,我们就可以使用策略模式进行优化。回想一下,什么是策略模式?策略模式定义了一族算法,并将它们分别封装起来,使它们可以相互替换。此模式使算法更改独立于使用该算法的客户端。这个策略模型的定义是不是有点抽象?打个通俗易懂的比方:假设你在和不同性格类型的女生约会,需要采用不同的策略。有的不如请个电影,有的不如吃点心。是的,一些shopping最适合shopping。目的当然是为了博取小姐的芳心。看电影、吃零食、逛街是不同的策略。Strategy模式将每一种算法封装到一个不同的独立类中,为一组算法实现一个通用的接口,这样它们就可以相互替换。我们一般如何定义策略模式?一个接口或抽象类,其中有两个方法(一个方法匹配类型,一个替代逻辑实现方法)。不同策略的差异化实现(即不同策略的实现类)。因此,对于原来的伪代码流程,我们可以定义企业客户群类型的策略实现类,营销类型的策略实现类。这两个策略实现类都实现了两个方法。一种方法是匹配类型,就是返回原代码if...else条件判断的类型;另一种方法是if...else条件的实现内容。代码如下://一个接口interfaceIGroupLabelStrategyService{//这个方法对应策略实现类的具体实现booleanprocessBiz(Parameterdto);//该方法为策略类的类型,对应```if...else```条件判断的类型StringgetType();}//企业客户群类型策略实现类EnterpriseGroupLablelStrategyServiceImplimplementsIGroupLabelStrategyService{//在企业客户组类型对应的条件分支中执行booleanprocessBiz(Parameterdto){//关闭Norequestif(isEnterpriseSwitchClose){returnfalse;}//如果只有一条记录请求if(dto.reqNum==1){//调用大数据查询接口returnsingleRemoteEOIinvoke(dto);//如果请求多条记录}elseif(dto.reqNum>1){//调用远程大数据批量接口returnbatchRemoteEOIinvoke(dto);}}//对应的企业类型StringgetType(){return"enterprise";}}//营销类型策略实现类MarketListGroupLablelStrategyServiceImplimplementsIGroupLabelStrategyService{//营销类型对应的条件分支中的实现booleanprocessBiz(Parameterdto){//开关在没有请求的情况下关闭if(isMarketListSwitchClose){returnfalse;}//如果只有一条记录请求if(dto.reqNum==1){//调用营销点查询接口returnsingleRemoteMarketinvoke(dto);//如果请求了多个商品}elseif(dto.reqNum>1){//调用营销批量接口returnbatchRemoteMarketinvoke(dto);}}StringgetType(){返回“市场列表”;}}3。如何使用工厂设计模式现在每个策略都实现了,如何把不同策略的实现类交给spring管理呢?我们可以实现ApplicationContextAware接口,将策略的实现类注入到一个map中,然后根据请求者的请求类型实现不同的策略。调用其实和工厂模式的思想差不多。代码如下:@ComponentpublicclassGroupLabelStrategyServiceFactoryimplementsApplicationContextAware{//存放对应的类型和实现类privateMap
