Java设计模式中的策略模式详细解析

 更新时间:2023年12月31日 09:16:32   作者:理想万岁万万岁  
这篇文章主要介绍了Java设计模式中的策略模式详细解析,所谓策略模式,指的是做某一件事时有多种选择(即策略),且不同的策略之间相互独立,而且无论使用哪种策略,得到的结果都是相同的,需要的朋友可以参考下

 一、介绍

所谓策略模式,指的是做某一件事时有多种选择(即策略),且不同的策略之间相互独立,而且无论使用哪种策略,得到的结果都是相同的。

例如你要从上海去重庆旅游,在选择交通工具时你可以选择高铁,也可以选择飞机,也可以自己开车自驾游。你要做的是从上海去重庆,在选择交通工具时面临多种选择,每一种选择就是策略。

二、不使用策略模式

我们先不使用策略模式对上面的描述进行实现,顺便回忆一下当初在学校的时候的代码风格嘻嘻嘻。

创建一个旅游类

通过if-else对不同的交通工具进行判断,同时实现其逻辑

public class Travel {
    public void toChongqing(String transport) {
        System.out.println("从上海出发");
        // 交通工具动次打次动次打次出发了
        if ("drive".equals(transport)) {
            // 自驾游的逻辑
            System.out.println("自驾...");
            System.out.println("历经20个小时...");
        } else if ("train".equals(transport)) {
            // 坐火车的逻辑
            System.out.println("坐火车...");
            System.out.println("历经10个小时...");
        } else if ("airplane".equals(transport)) {
            // 坐飞机的逻辑
            System.out.println("坐飞机...");
            System.out.println("历经3个小时...");
        } else {
            throw new RuntimeException("交通工具尚未发明");
        }
        System.out.println("到重庆了");
    }
}

输出

在这里插入图片描述

从上面的实现来看,每一个策略都需要一个if-else代码块进行处理,因此在大量策略的情况下会导致大量的if-else代码块,这样的方法看起来十分臃肿,更不利于阅读。

三、使用策略模式

再来看看使用策略模式后,我们的代码一下子就升级了。

交通工具接口,交通工具只负责把你送到目的地。

public interface Transport {
    // 出发
    void go();
}

交通工具实现类,有飞机、火车、自驾

public class Airplane implements Transport{
    @Override
    public void go() {
        System.out.println("坐飞机...");
        System.out.println("历经3个小时...");
    }
}
public class Drive implements Transport{
    @Override
    public void go() {
        System.out.println("自驾...");
        System.out.println("历经20个小时...");
    }
}
public class Train implements Transport{
    @Override
    public void go() {
        System.out.println("坐火车...");
        System.out.println("历经10个小时...");
    }
}

去旅游

public class Travel {
    // 去重庆了,需要一个交通工具
    public void toChongQing(Transport transport) {
        System.out.println("从上海出发");
        // 交通工具出发了
        transport.go();
        System.out.println("到重庆了");
    }
}

demo

public class StrategyDemo {
    public static void main(String[] args) {
        Travel travel = new Travel();
        // 自驾游去重庆
        travel.toChongQing(new Drive());
        System.out.println("===================分割线====================");
        // 坐火车去重庆
        travel.toChongQing(new Train());
        System.out.println("===================分割线====================");
        // 坐飞机去重庆
        travel.toChongQing(new Airplane());
    }
}

输出

在这里插入图片描述

使用策略模式可以消灭大量的if-else代码块,而且代码更加简洁。当需要增加一个策略时,只需要新建一个策略实现类,并实现策略接口定义的方法就可以了。

使用策略模式后类的结构如下:

在这里插入图片描述

四、优缺点

优点:

  • 方便扩展,当我们需要增加一个策略时,只需要添加相应的策略实现就好了。
  • 职责单一,不同策略的具体实现都是独立的。

缺点:

  • 每一个策略都要对应一个java文件,当需要大量策略时会导致文件数量膨胀。

到此这篇关于Java设计模式中的策略模式详细解析的文章就介绍到这了,更多相关Java策略模式解析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入理解spring事务

    深入理解spring事务

    这篇文章主要介绍了spring事务深入理解,介绍了事物特性,事物隔离级别,事物的具体使用实例,有感兴趣的同学可以研究下
    2021-03-03
  • 解决IDEA鼠标点击光标变大问题

    解决IDEA鼠标点击光标变大问题

    这篇文章主要介绍了解决IDEA鼠标点击光标变大问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Java实现Dbhelper支持大数据增删改

    Java实现Dbhelper支持大数据增删改

    这篇文章主要介绍了Java实现Dbhelper支持大数据增删改功能的实现过程,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • Java使用itextpdf实现PDF转文本以及转图片

    Java使用itextpdf实现PDF转文本以及转图片

    PDF转文本的插件常用的有pdfbox ,itextpdf 和 spire.pdf,本文主要介绍如何使用itextpdf实现PDF转文本以及转图片,需要的可以参考一下
    2025-01-01
  • Spring中PathMatcher路径匹配器的实现

    Spring中PathMatcher路径匹配器的实现

    Spring框架中的PathMatcher是一个接口,本文主要介绍了Spring中PathMatcher路径匹配器的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • java 将一个数组逆序输出的方法

    java 将一个数组逆序输出的方法

    今天小编就为大家分享一篇java 将一个数组逆序输出的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Spring中Controller和RestController的区别详解

    Spring中Controller和RestController的区别详解

    这篇文章主要介绍了Spring中Controller和RestController的区别详解,@Controller是标识一个Spring类是Spring MVC controller处理器,@Controller类中的方法可以直接通过返回String跳转到jsp、ftl、html等模版页面,需要的朋友可以参考下
    2023-09-09
  • Spring Boot 入门指南

    Spring Boot 入门指南

    Spring Boot 简化了Spring 应用的初始搭建、开发过程,开发人员可使用Spring提供的特定的方式来进行配置,不再需要重复自定义样板化的配置。本文就将带你入门Spring Boot
    2021-05-05
  • SpringBoot 项目瘦身maven/gradle详解

    SpringBoot 项目瘦身maven/gradle详解

    这篇文章主要介绍了SpringBoot项目瘦身(maven/gradle),本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • Java中对象都是分配在堆上吗?你错了!

    Java中对象都是分配在堆上吗?你错了!

    这篇文章主要介绍了Java中对象都是分配在堆上吗?你错了!文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2019-06-06

最新评论