策略设计模式在大厂项目业务场景中的实现

策略模式就是指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法,用我们在代码中的体现就是,代码运行时由算法决定执行谁。

通常我们在真正开发项目的时候,用到策略模式的地方大致就是在同一个业务场景,需要有不同的实现方式,比如你要做ERP电商项目,那就是对接淘宝、京东、拼多多这样的平台,用户选择哪一个平台就由调用哪个平台的接口去实现。

业务比较复杂的情况:

通常我们会定义接口+实现类,当然借助于Spring容器来实现。

定一个接口用以说明该类实现哪些功能

public interface AnimalService {
    String getType();

    void speak();
}

实现接口的实现类 :

@Service("cat")
public class CatServiceImpl implements AnimalService {
    @Override
    public String getType() {
        return "cat";
    }

    @Override
    public void speak() {
        System.out.println("喵喵喵");
    }
}

 

@Service("dog")
public class DogServiceImpl implements AnimalService {
    @Override
    public String getType() {
        return "dog";
    }

    @Override
    public void speak() {
        System.out.println("汪汪汪");
    }
}

由用户选择具体的实现方式: 

@RestController
@RequestMapping("/animal")
public class AnimalController {
    @Autowired
    private Map<String, AnimalService> animalServiceMap;

    @GetMapping("/{type}")
    public ResponseEntity<Void> findById(@PathVariable String type) {
        AnimalService animalService = animalServiceMap.get(type);
        animalService.speak();
        return ResponseEntity.ok().build();
    }
}

在这个简单的Demo中,实现类@Service 注解标明了bean的name,然后直接用Map获取即可。

另一种方式就是我们在接口定义一个类型方法,由不同实现类实现类型。

@RestController
@RequestMapping("/animal")
public class AnimalController {
    @Autowired
    private List<AnimalService> animalServiceList;

    @GetMapping("/{type}")
    public ResponseEntity<Void> findById(@PathVariable String type) {
        animalServiceList.stream().filter(animalService -> animalService.getType().equals(type)).findFirst().ifPresent(AnimalService::speak);
        return ResponseEntity.ok().build();
    }
}

业务逻辑相对简单的情况:

我们在开发条件逻辑比较多的时候为了让代码更简洁美观,一般我们采用Map+函数式接口取代if-else 比如:

public class Test {

    private static final Double FIRST = 0.01;
    private static final Double SENCOD = 0.02;
    private static final Double THIRD = 0.03;

    private static final Map<String, Function<Double, Double>> map = new HashMap<String, Function<Double, Double>>() {
        {
            put("FIRST", (price) -> price * FIRST);
            put("SENCOD", (price) -> price * SENCOD);
            put("THIRD", (price) -> price * THIRD);
        }
    };

    public static void main(String[] args) {
        double price = 100.;
        System.out.println(map.get("FIRST").apply(price));
        System.out.println(map.get("SENCOD").apply(price));
        System.out.println(map.get("THIRD").apply(price));
    }

}

 这也是平时开发过程中最常用的方式推荐使用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

樊高

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

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

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

打赏作者

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

抵扣说明:

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

余额充值