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策略模式解析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 字符串操作之contains 和 substring 方法最佳实践与常见问题

    Java 字符串操作之contains 和 substring 方法最佳实践与常

    本文给大家详细介绍Java 字符串操作之contains 和 substring 方法最佳实践与常见问题,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-09-09
  • 如何在Eclipse中设置Oracle的JDBC

    如何在Eclipse中设置Oracle的JDBC

    以下是对在Eclipse中设置Oracle的JDBC的具体操作方法进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-08-08
  • 详解java中的四种代码块

    详解java中的四种代码块

    这篇文章主要介绍了详解java中的四种代码块,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • TF-IDF理解及其Java实现代码实例

    TF-IDF理解及其Java实现代码实例

    这篇文章主要介绍了TF-IDF理解及其Java实现代码实例,简单介绍了tfidf算法及其相应公式,然后分享了Java实现代码,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 解决警告:No archetype found in remote catalog. Defaulting to internal catalog.问题

    解决警告:No archetype found in remote c

    新建Maven项目时,若提示远程archetype未找到,可通过以下两种方式解决:一是检查网络或仓库配置;二是设置VMOptions参数-DarchetypeCatalog=internal,强制使用内部目录
    2025-08-08
  • 解决java 分割字符串成数组时,小圆点不能直接进行分割的问题

    解决java 分割字符串成数组时,小圆点不能直接进行分割的问题

    这篇文章主要介绍了解决java 分割字符串成数组时,小圆点不能直接进行分割的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • SpringBoot如何实现并发任务并返回结果

    SpringBoot如何实现并发任务并返回结果

    这篇文章主要介绍了SpringBoot如何实现并发任务并返回结果问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Spring Boot如何优雅的使用多线程实例详解

    Spring Boot如何优雅的使用多线程实例详解

    这篇文章主要给大家介绍了关于Spring Boot如何优雅的使用多线程的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-05-05
  • springboot整合netty过程详解

    springboot整合netty过程详解

    这篇文章主要介绍了springboot整合netty过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Spring中如何动态注入Bean实例教程

    Spring中如何动态注入Bean实例教程

    这篇文章主要给大家介绍了关于Spring中如何动态注入Bean的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12

最新评论