设计模式之策略模式

策略模式

策略模式属于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);
    }

}

测试

image-20220725230835749

当我们传入type =1 时,我们进入A实现类,type =2 时,我们进入B实现类,符合我们预期。

总结
使用策略模式呢,我们可以更方便以后的业务拓展,比如我们这个场景的其他的一些出行方式,比如 高铁 、飞机 等等,我们只需要增加我们的枚举类型,增加我们的实现方法,不需要修改原来的接口,而且很大程度上避免使用if else 去进行判断实现,减少耦合。


版权声明:本文为qq_37460214原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。