策略设计模式在大厂项目业务场景中的实现
策略模式就是指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法,用我们在代码中的体现就是,代码运行时由算法决定执行谁。
通常我们在真正开发项目的时候,用到策略模式的地方大致就是在同一个业务场景,需要有不同的实现方式,比如你要做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));
}
}
这也是平时开发过程中最常用的方式推荐使用。
版权声明:本文为kangkang_01原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。