广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何彻底消除了多重
  • 541
分享到

如何彻底消除了多重

2024-04-02 19:04:59 541人浏览 安东尼
摘要

如何彻底消除了多重,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。先贴个阿里的《 Java 开发手册》中的一个规范我们先不探讨其

如何彻底消除了多重,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

如何彻底消除了多重

先贴个阿里的《 Java 开发手册》中的一个规范

如何彻底消除了多重

我们先不探讨其他方式,主要讲策略模式。

定义

策略模式(Strategy Design Pattern):封装可以互换的行为,并使用委托来决定要使用哪一个。

策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。

用人话翻译后就是:运行时我给你这个类的方法传不同的 “key”,你这个方法就去执行不同的业务逻辑。

你品,你细品,这不就是 if else 干的事吗?

先直观的看下传统的多重 if else 代码

public String getCheckResult(String type) {   if ("校验1".equals(type)) {     return "执行业务逻辑1";   } else if ("校验2".equals(type)) {     return "执行业务逻辑2";   } else if ("校验3".equals(type)) {     return "执行业务逻辑3";   } else if ("校验4".equals(type)) {     return "执行业务逻辑4";   } else if ("校验5".equals(type)) {     return "执行业务逻辑5";   } else if ("校验6".equals(type)) {     return "执行业务逻辑6";   } else if ("校验7".equals(type)) {     return "执行业务逻辑7";   } else if ("校验8".equals(type)) {     return "执行业务逻辑8";   } else if ("校验9".equals(type)) {     return "执行业务逻辑9";   }   return "不在处理的逻辑中返回业务错误"; }

这么看,你要是还觉得挺清晰的话,想象下这些 return 里是各种复杂的业务逻辑方法~~

当然,策略模式的作用可不止是避免冗长的 if-else 或者 switch 分支,它还可以像模板方法模式那样提供框架的扩展点等。

网上的示例很多,比如不同路线的规划、不同支付方式的选择 都是典型的 if-else  问题,也都是典型的策略模式问题,栗子我们待会看,先看下策略模式的类图,然后去改造多重判断~

类图

如何彻底消除了多重

策略模式涉及到三个角色:

  • Strategy:策略接口或者策略抽象类,用来约束一系列的策略算法(Context 使用这个接口来调用具体的策略实现算法)

  • ConcreateStrategy:具体的策略类(实现策略接口或继承抽象策略类)

  • Context:上下文类,持有具体策略类的实例,并负责调用相关的算法

应用策略模式来解决问题的思路

实例

先看看最简单的策略模式 demo:

1、策略接口(定义策略)

public interface Strategy {     void operate(); }

2、具体的算法实现

public class ConcreteStrategyA implements Strategy {     @Override     public void operate() {         //具体的算法实现         System.out.println("执行业务逻辑A");     } }  public class ConcreteStrategyB implements Strategy {     @Override     public void operate() {         //具体的算法实现         System.out.println("执行业务逻辑B");     } }

3、上下文的实现

public class Context {      //持有一个具体的策略对象     private Strategy strategy;      //构造方法,传入具体的策略对象     public Context(Strategy strategy){         this.strategy = strategy;     }      public void doSomething(){         //调用具体的策略对象进操作         strategy.operate();     } }

4、客户端使用(策略的使用)

public static void main(String[] args) {   Context context = new Context(new ConcreteStrategyA());   context.doSomething(); }

ps:这种策略的使用方式其实很死板,真正使用的时候如果还这么写,和写一大推 if-else  没什么区别,所以我们一般会结合工厂类,在运行时动态确定使用哪种策略。策略模式侧重如何选择策略、工厂模式侧重如何创建策略。

解析策略模式

策略模式的功能就是把具体的算法实现从具体的业务处理中独立出来,把它们实现成单独的算法类,从而形成一系列算法,并让这些算法可以互相替换。

策略模式的重心不是如何来实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。

实际上,每个策略算法具体实现的功能,就是原来在 if-else 结构中的具体实现,每个 if-else  语句都是一个平等的功能结构,可以说是兄弟关系。

策略模式呢,就是把各个平等的具体实现封装到单独的策略实现类了,然后通过上下文与具体的策略类进行交互。

『 策略模式 = 实现策略接口(或抽象类)的每个策略类 + 上下文的逻辑分派 』

如何彻底消除了多重

策略模式的本质:分离算法,选择实现 ——《研磨设计模式》

所以说,策略模式只是在代码结构上的一个调整,即使用了策略模式,该写的逻辑一个也少不了,到逻辑分派的时候,只是变相的 if-else。

而它的优化点是抽象了出了接口,将业务逻辑封装成一个一个的实现类,任意地替换。在复杂场景(业务逻辑较多)时比直接 if-else 更好维护和扩展些。

谁来选择具体的策略算法

如果你手写了上边的 demo,就会发现,这玩意不及 if-else 来的顺手,尤其是在判断逻辑的时候,每个逻辑都要要构造一个上下文对象,费劲。

其实,策略模式中,我们可以自己定义谁来选择具体的策略算法,有两种:

客户端:当使用上下文时,由客户端选择,像我们上边的 demo

上下文:客户端不用选,由上下文来选具体的策略算法,可以在构造器中指定

优缺点

优点:

避免多重条件语句:也就是避免大量的 if-else

更好的扩展性(完全符合开闭原则):策略模式中扩展新的策略实现很容易,无需对上下文修改,只增加新的策略实现类就可以

缺点:

客户必须了解每种策略的不同(这个可以通过 ioc、依赖注入的方式解决)

增加了对象数:每个具体策略都封装成了类,可能备选的策略会很多

只适合扁平的算法结构:策略模式的一系列算法是平等的,也就是在运行时刻只有一个算法会被使用,这就限制了算法使用的层级,不能嵌套使用

思考

实际使用中,往往不会只是单一的某个设计模式的套用,一般都会混合使用,而且模式之间的结合也是没有定势的,要具体问题具体分析。

策略模式往往会结合其他模式一起使用,比如工厂、模板等,具体使用需要结合自己的业务。

切记,不要为了使用设计模式而强行模式,不要把简单问题复杂化。

策略模式也不是专为消除 if-else 而生的,不要和 if-else 划等号。它体现了“对修改关闭,对扩展开放“的原则。

并不是说,看到 if-else 就想着用策略模式去优化,业务逻辑简单,可能几个枚举,或者几个卫语句就搞定的场景,就不用非得硬套设计模式了。

策略模式在 jdk 中的应用

在 JDK 中,Comparator 比较器是一个策略接口,我们常用的 compare() 方法就是一个具体的策略实现,用于定义排序规则。

public interface Comparator<T> {    int compare(T o1, T o2);    //...... }

当我们想自定义排序规则的时候,就可以实现 Comparator 。

这时候我们重写了接口中的 compare() 方法,就是具体的策略类(只不过这里可能是内部类)。当我们在调用 Arrays 的排序方法 sort()  时,可以用默认的排序规则,也可以用自定义的规则。

public static void main(String[] args) {   Integer[] data = {4,2,7,5,1,9};   Comparator<Integer> comparator = new Comparator<Integer>() {     @Override     public int compare(Integer o1, Integer o2) {       if(o1 > o2){         return 1;       } else {         return -1;       }     }   };    Arrays.sort(data,comparator);   System.out.println(Arrays.toString(data)); }

Arrays 的 sort() 方法,有自定义规则就按自己的方法排序,反之走源码逻辑。

public static <T> void sort(T[] a, Comparator<? super T> c) {     if (c == null) {         sort(a);     } else {         if (LegacyMergeSort.userRequested)             legacyMergeSort(a, c);         else             TimSort.sort(a, 0, a.length, c, null, 0, 0);     } }

还有,ThreadPoolExecutor 中的拒绝策略 RejectedExecutionHandler  也是典型的策略模式,感兴趣的也可以再看看源码。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网JavaScript频道,感谢您对编程网的支持。

--结束END--

本文标题: 如何彻底消除了多重

本文链接: https://www.lsjlt.com/news/81661.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何彻底消除了多重
    如何彻底消除了多重,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。先贴个阿里的《 Java 开发手册》中的一个规范我们先不探讨其...
    99+
    2022-10-19
  • 电脑中毒了如何彻底清除
    要彻底清除电脑中的病毒,可以按照以下步骤进行操作:1. 断开与互联网的连接:首先,断开电脑与互联网的连接,以防止病毒通过网络进一步传...
    99+
    2023-09-28
    电脑
  • 如何彻底删除nodejs
    本篇内容介绍了“如何彻底删除nodejs”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本文操作环境:Win...
    99+
    2022-10-19
  • navicat如何彻底删除
    这篇文章给大家分享的是有关navicat如何彻底删除的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。卸载点开windows设置,选择应用,找道navicat,点击选择卸载。这是卸载...
    99+
    2022-10-18
  • 如何彻底删除Vue
    Vue是现今最受欢迎的JavaScript库之一,它具有灵活性、高效性和易于使用的特点。然而,有时候我们会需要删除Vue库,可能因为我们想切换到其他框架,或是因为我们不再需要Vue的特性。本文将介绍如何彻底删除Vue。首先,如果你是用npm...
    99+
    2023-05-14
  • 如何彻底删除windows.old
    本文小编为大家详细介绍“如何彻底删除windows.old”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何彻底删除windows.old”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。彻底删除windows.o...
    99+
    2023-07-01
  • mac如何彻底删除windows
    要彻底删除Windows系统,您可以按照以下步骤进行操作:1. 备份您的重要文件:在删除Windows之前,确保将您的重要文件备份到...
    99+
    2023-10-18
    mac windows
  • macbook如何彻底删除python
    一、删除python所在环境 你需要删除的东西有三,一是Library中的python(即环境变量),二是Application中的python,三是清除指向python的链接。故步骤分为如下三步: ...
    99+
    2023-10-24
    linux 运维 服务器
  • ubuntu如何彻底删除php7.0
    本文操作环境:ubuntu 18.04系统、php 7.0、thinkpad t480电脑。ubuntu系统彻底删除php的步骤如下所示:一、删除php的相关包及配置sudo apt-get autoremove php7*二、删除关联su...
    99+
    2015-01-29
    ubuntu php
  • 如何彻底删除weblogic域
    要彻底删除WebLogic域,需要执行以下步骤: 停止所有WebLogic服务器实例:在每台服务器上运行/bin/stopWeb...
    99+
    2023-10-25
    weblogic
  • 如何彻底删除MSN Messenger
    操作步骤: Windows XP,开始-->运行-->输入"RunDll32 advpack.dll,LaunchINFSection %windir%\INF;,按回车键后,在打开的对话框中单击“...
    99+
    2023-05-23
    MSN Messenger
  • win102345文件如何彻底删除
    今天小编给大家分享一下win102345文件如何彻底删除的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。win102345文件...
    99+
    2023-07-01
  • 如何彻底删除Github账号
    Github是全球最大的开源社区之一,吸引了来自世界各地的开发者和用户。Github并不需要收取费用就可以使用,可以创建项目和代码片段、参加各种开源项目等。但有些用户可能会因为某些原因想删除Github账号,本文将介绍如何彻底删除Githu...
    99+
    2023-10-22
  • 如何彻底删除mysql服务
    如何彻底删除mysql服务?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!彻底删除mysql服务的步骤:1、关闭mysql服...
    99+
    2022-10-18
  • mysql如何彻底删除用户
    小编给大家分享一下mysql如何彻底删除用户,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 之前碰...
    99+
    2022-10-18
  • 如何彻底删除uniapp应用
    随着移动应用的普及,越来越多的人开始使用uniapp开发自己的应用程序。然而,在使用uniapp开发应用的过程中,总会遇到一些问题,例如应用程序无法正常运行、应用程序过于占用存储空间等等。针对这些问题,有时候不得不考虑卸载应用程序。但是,不...
    99+
    2023-05-14
  • 如何彻底删除Linux文件
    这篇文章主要介绍“如何彻底删除Linux文件”,在日常操作中,相信很多人在如何彻底删除Linux文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何彻底删除Linux文件”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-13
  • win11如何彻底删除文件
    要彻底删除文件,可以按照以下步骤进行操作:1. 找到要删除的文件或文件夹,将其选中。2. 按下键盘上的"Shift"键同时点击"De...
    99+
    2023-09-06
    win11
  • 如何在MacBook上彻底删除mysql
    好久以前安装过,但是现在配置mysql一直出错,索性全部删掉重新配置。 一、停止MySQL服务 首先,请确保 MySQL 服务器已经停止运行,以免影响后续的删除操作。 sudo /usr/local/mysql/support-files/...
    99+
    2023-10-08
    mysql 数据库
  • sql注册表如何彻底删除
    要彻底删除一个SQL注册表,可以按照以下步骤进行操作:1. 确保没有任何外部程序或用户正在使用该表。如果有,需要先关闭或终止这些程序...
    99+
    2023-10-11
    sql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作