策略模式属于23种设计模式中使用较为常用的一种,它的概念是:定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换,可以针对不同业务选择不同逻辑的执行。
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。
场景:
1、假如我们上班,有几种方式我们可以选择,1 公交车 2 地铁 3 步行 …,我们需要根据的不同方式执行对应的方法,所以我们定义一个枚举来定义这几种方式。
public enum TypeEnum {
A("1"),
B("2");
private String type;
TypeEnum(String type) {
this.type = type;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
2、完成我们的上班方式枚举定义,我们可以创建一个接口来定义我们的go方法
public interface TypeService {
void go();
TypeEnum getType();
}
3、实现我们的接口:
@Service
public class TypeServiceImplA implements TypeService {
@Override
public void go() {
System.out.println("坐公交车上班~~~");
}
@Override
public TypeEnum getType() {
return TypeEnum.A;
}
}
@Service
public class TypeServiceImplB implements TypeService {
@Override
public void go() {
System.out.println("坐地铁上班~~~");
}
@Override
public TypeEnum getType() {
return TypeEnum.B;
}
}
4、完成我们的实现方法,创建我们的controller去验证
@RestController
public class TypeController {
@Autowired
private List typeServices;
@GetMapping(("/test"))
private String go(String type) {
// 根据Type 调用不同的实现类
System.out.println(type);
getTypeService(type).go();
return "SUCCESS";
}
private TypeService getTypeService(String type) {
// 使用 java8 的 stream().filter() 过滤List对象 查找符合条件的对象集合
List collect = typeServices.stream().filter(o -> o.getType().getType().equals(type)).collect(Collectors.toList());
System.out.println(collect);
// 我们的类型相同的只有一个 所以 获取第一个就可以
return collect.get(0);
}
}
测试
当我们传入type =1 时,我们进入A实现类,type =2 时,我们进入B实现类,符合我们预期。
总结
使用策略模式呢,我们可以更方便以后的业务拓展,比如我们这个场景的其他的一些出行方式,比如 高铁 、飞机 等等,我们只需要增加我们的枚举类型,增加我们的实现方法,不需要修改原来的接口,而且很大程度上避免使用if else 去进行判断实现,减少耦合。



