策略模式解决if-else问题

释义:

策略模式是一种行为设计模式,它允许在运行时根据不同的情况来选择不同的策略。

这种模式支持开闭原则,在不修改现有代码的前提下,动态的添加、删除、替换算法。

组成部分:

策略接口(Strategy):它是一个接口,具体的策略实现类去实现这个接口,就可以提供不同的实现方式。

策略环境(Context):可以根据需要来修改策略,或者定义一个工厂类

策略实现类(ConcreteStrategy):以Strategy接口实现某具体算法

代码实现步骤:

1、定义Strategy接口(Strategy)

package com.example.strategy.service;


import com.example.strategy.entity.ResourcesEntity;

/**
 * 获取资源信息策略接口
 *
 */
public interface ResourcesStrategy {


    /*
    * 获取对应资源信息
    * 专家、队伍、装备
    * */
    ResourcesEntity getResourcesData(String type);


}

2、实体类、常量类定义(entity、constant)

//返回实体类
package com.example.strategy.entity;


import lombok.Data;

@Data
public class ResourcesEntity {

    private String name;
    private String lat;
    private String lng;

    private String resourcesType;

}

//常量类
package com.example.strategy.constant;

public class ResourcesConstant {
    public static final String EXPERT = "expert";
    public static final String EQUIP = "equip";
    public static final String MATERIALS = "materials";
    public static final String TEAM = "team";
}

3、具体的策略实现类(EquipStrategy、ExpertStrategy、TeamStrategy)

//装备策略实现类
package com.example.strategy;

import com.example.strategy.constant.ResourcesConstant;
import com.example.strategy.entity.ResourcesEntity;
import com.example.strategy.renum.ResourcesEnum;
import com.example.strategy.service.ResourcesStrategy;
import org.springframework.stereotype.Component;


@Component(ResourcesConstant.EQUIP)
public class EquipStrategy implements ResourcesStrategy {
    @Override
    public ResourcesEntity getResourcesData(String type) {
        ResourcesEntity resources = new ResourcesEntity();
        resources.setResourcesType(ResourcesEnum.EQUIP.id);
        resources.setName("装备");
        resources.setLng("");
        resources.setLat("");
        return resources;
    }
}

//专家策略实现类

package com.example.strategy;

import com.example.strategy.constant.ResourcesConstant;
import com.example.strategy.entity.ResourcesEntity;
import com.example.strategy.renum.ResourcesEnum;
import com.example.strategy.service.ResourcesStrategy;
import org.springframework.stereotype.Component;


@Component(ResourcesConstant.EXPERT)
public class ExpertStrategy implements ResourcesStrategy {
    @Override
    public ResourcesEntity getResourcesData(String type) {
        ResourcesEntity resources = new ResourcesEntity();
        resources.setResourcesType(ResourcesEnum.EXPERT.id);
        resources.setName("李安心专家");
        resources.setLng("");
        resources.setLat("");
        return resources;
    }
}


//队伍策略实现类
package com.example.strategy;

import com.example.strategy.constant.ResourcesConstant;
import com.example.strategy.entity.ResourcesEntity;
import com.example.strategy.renum.ResourcesEnum;
import com.example.strategy.service.ResourcesStrategy;
import org.springframework.stereotype.Component;


@Component(ResourcesConstant.TEAM)
public class TeamStrategy implements ResourcesStrategy {
    @Override
    public ResourcesEntity getResourcesData(String type) {
        ResourcesEntity resources = new ResourcesEntity();
        resources.setResourcesType(ResourcesEnum.TEAM.id);
        resources.setName("队伍1");
        resources.setLng("");
        resources.setLat("");
        return resources;
    }
}

4、策略环境(上下文)Context

package com.example.strategy.context;


import com.example.strategy.service.ResourcesStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Component
public class ResourcesStrategyContext {


    /*
    * 策略集合
    * 注入实例名和对应实例
    * */
    @Autowired
    private Map<String, ResourcesStrategy>  resourcesStrategyMap = new ConcurrentHashMap<>();


    /*
    * 初始化
    * */
    public ResourcesStrategyContext(Map<String, ResourcesStrategy> resourcesStrategyMap){
        //先进行清空处理
        this.resourcesStrategyMap.clear();
        //由于我们的具体策略实现业务类使用了@Component注解,所以会被spring自动扫描并且装配到容器中
        resourcesStrategyMap.forEach(this.resourcesStrategyMap::put);

    }

    public ResourcesStrategy getResourcesStrategy(String strategy){
        return  resourcesStrategyMap.get(strategy);
    }

}

5、功能验证

package com.example.strategy.controller;
import com.example.demo.util.StringUtils;
import com.example.strategy.context.ResourcesStrategyContext;
import com.example.strategy.entity.ResourcesEntity;
import com.example.strategy.renum.ResourcesEnum;
import com.example.strategy.service.ResourcesStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/resources")
public class ResourcesController {

    @Autowired
    ResourcesStrategyContext resourcesStrategyContext;

    @RequestMapping("/getResourcesData")
    public ResourcesEntity getResourcesData(String type){
        ResourcesStrategy resourcesStrategy = resourcesStrategyContext.getResourcesStrategy(type);
        ResourcesEntity resourcesData = resourcesStrategy.getResourcesData(type);
        return resourcesData;
    }
}

6、结果展示

7、策略模式和if-esle比较: 

1、易于拓展:不需要修改原有代码,方便的增加、删除算法。

2、提高代码可读性:不同的业务处理在不同的策略实现类中,易于理解和维护

3、避免大量的if-else语句

4、提高代码复用性

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当代码中的条件语句if-else过于复杂时,可以考虑使用设计模式代替if-else语句,提高代码的可读性和可维护性。以下是一些常见的设计模式,可以用来代替if-else语句: 1. 工厂模式(Factory Pattern):通过工厂方法创建对象,而不是使用条件语句来直接创建对象。这样可以避免在代码中使用大量的if-else语句,同时也可以很方便地添加新的对象类型。 2. 状态模式(State Pattern):将复杂的状态判断逻辑封装到不同的状态类中,避免在代码中使用大量的if-else语句。可以很方便地添加新的状态类型,也可以方便地维护和扩展状态的行为。 3. 策略模式(Strategy Pattern):将不同的算法封装到不同的策略类中,通过选择不同的策略类来实现不同的行为。这样可以避免在代码中使用复杂的if-else语句,同时也可以很方便地添加新的算法类型。 4. 观察者模式(Observer Pattern):将一个对象的状态变化通知给多个观察者对象,避免在代码中使用大量的if-else语句。可以很方便地添加新的观察者对象,也可以方便地维护和扩展观察者的行为。 5. 责任链模式(Chain of Responsibility Pattern):将多个处理对象组成一个链,每个处理对象都可以处理请求,如果一个对象不能处理请求,则将请求传递给下一个处理对象。这样可以避免在代码中使用大量的if-else语句,同时也可以很方便地添加新的处理对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

注。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值