策略模式
策略模式属于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 {
/**
* 我们的实现类有多个,所以需要用List去接收。
*/
@Autowired
private List<TypeService> typeServices;
@GetMapping(("/test"))
private String go(String type) {
// 根据Type 调用不同的实现类
System.out.println(type);
getTypeService(type).go();
return "SUCCESS";
}
/**
* 根据 type 获取实现类
*
* @param type 出行方式
* @return
*/
private TypeService getTypeService(String type) {
// 使用 java8 的 stream().filter() 过滤List对象 查找符合条件的对象集合
List<TypeService> 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 去进行判断实现,减少耦合。
版权声明:本文为qq_37460214原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。