栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

设计模式之策略模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式之策略模式

策略模式

策略模式属于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 去进行判断实现,减少耦合。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1027516.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号