iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >怎么在代码中应用设计模式
  • 414
分享到

怎么在代码中应用设计模式

2024-04-02 19:04:59 414人浏览 独家记忆
摘要

这篇文章给大家分享的是有关怎么在代码中应用设计模式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 为什么要使用设计模式因为我们的项目的需求是永远在变的,为了应对这种变化

这篇文章给大家分享的是有关怎么在代码中应用设计模式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

 为什么要使用设计模式

因为我们的项目的需求是永远在变的,为了应对这种变化,使得我们的代码能够轻易的实现解耦和拓展。如果能够保证代码一次写好以后都不会再改变了,那可以想怎么写怎么写了。

怎么在代码中应用设计模式

如何判断那里需要使用设计模式

怎么在代码中应用设计模式

在我们实现中,有一些代码是一次写好后续基本不会改变的,或者不太需要扩展的,比如一些工具类等。有一部分是会经常变得,设计模式大多都应用在需求会变化的这一部分。分析这些代码会如何变,选择合适的设计模式来优化这部分代码。

以促销活动需求为例

需求

为了促进商品的销售,各大电商品台会在平时或者一些节日的时候退出一些促销活动刺激用户消费,活动的类型可能会各不相同,如下:

  • 满减,满400减20

  • 代金卷,玛莎拉蒂5元代金卷

  • 折扣,9折,8折

  • 每满减,每满200减10

  • 等等

其中有些可以叠加,有些只能单独使用。

简单实现

上面的需求看起来还是比较简单的,但是如果考虑到我们是不可能一次定义好所有的促销活动类型,后续我们可能会随时都添加新的类型,要保证能够简单的实现功能扩展,那就比较麻烦了。spring  框架用到的 9 个设计模式汇总,这个你知道吗?

先拿到需求的时候,也不用去想那么多,挽起袖子就是一通操作:

public class OrderPromotion {          public BigDecimal promotion(Order order, int[] promotions){           for(int promotion:promotions){               switch (promotion){                   case 1:                       //计算该类型折扣后的价格                       break;                   case 2:                       //计算该类型折扣后的价格                       break;                   case 3:                       //计算该类型折扣后的价格                       break;                   //....               }           }           return order.getResultPrice();       }   }

单从功能实现上来说,上面的代码已经完成了基本功能了。

但是上面的代码也是致命的,虽然看起来很简单,但是那只不过是因为大多数功能都用注释代替了,换成实际代码的话一个方法可能就得上千行。

尤其是当我们需要添加新的促销活动的话就需要在switch中添加新的类型,这对于开发来说简直是灾难,并且维护这些代码也是一个麻烦。

优化一:单一职责原则

上面的代码中,promotion(…)方法直接完成了所有的工作,但是咋我们实际实现中最好让一个方法的职责单一,只完成某一个功能,所以这里我们将对折扣类型的判断和计算价格分开:

public class OrderPromotion {          public BigDecimal promotion(Order order, int[] promotions){           for(int promotion:promotions){               switch (promotion){                   case 1:                       calculate1(order);                       break;                   case 2:                       calculate2(order);                       break;                   case 3:                       calculate3(order);                       break;                   //more promotion               }           }           return order.getResultPrice();       }          public void calculate1(Order order){           //计算使用折扣一后的价格       }          public void calculate2(Order order){           //计算使用折扣二后的价格       }          public void calculate3(Order order){           //计算使用折扣三后的价格       }          //more calculate      }

这里我们将折扣类型的判断和计算价格分开,使得promotion(…)方法的代码量大大降低,提升了代码的可读性。面象对象设计6大原则之一:单一职责原则,这篇也推荐大家看下。

优化二:策略模式

上面优化后的代码提升了原有代码的可读性,但是原来OrderPromotion类代码大爆炸的问题还是没有解决。

针对这个问题,我们希望能够将计算的代码和当前代码分离开,首先我们能想到的就是定义一个类,然后将计算的代码复制到这个类中,需要的时候就调用。这样到的确是分离开了,但是完全是治标不治本。在添加新的促销活动是两个类都要改。

所以我们希望能够将不同的促销活动的实现分离开,这样对每一种活动的实现都是分开的,修改也不会影响其他的,基于此我们完全可以选择策略模式来实现。

策略模式

策略模式的思想是针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换。策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能。

怎么在代码中应用设计模式

public class OrderPromotion {          public BigDecimal promotion(Order order, int[] promotions){           for(int promotion:promotions){               switch (promotion){                   case 1:                       new PromotionType1Calculate(order);                       break;                   case 2:                       new PromotionType1Calculate(order);                       break;                   case 3:                       new PromotionType1Calculate(order);                       break;                   //more promotion               }           }           return order.getResultPrice();       }   }

上面的代码很明显已经精简很多了,到了现在如果需要添加一个促销活动的话只需定义一个促销类,实现PromotionCalculation接口然后在switch中添加即可。

优化三:工厂模式

上面的代码虽然已经将促销活动的实现分离开了,但是OrderPromotion还是一直在变得,每一次添加或者下线活动都需要修改该类。

现在我们希望OrderPromotion是不变的,将PromotionCalculation的实例化剥离开来。创建类很明显是使用工厂设计模式了。

OrderPromotion

public class OrderPromotion {          public BigDecimal promotion(Order order, int[] promotions){           for(int promotion:promotions){               PromotionFactory.getPromotionCalculate(promotion).calculate(order);           }           return order.getResultPrice();       }   }

类的创建工作交给工厂来实现。

public class PromotionFactory {          public static PromotionCalculate getPromotionCalculate(int promotion){           switch (promotion){               case 1:                   return new PromotionType1Calculate(order);               break;               case 2:                   return new PromotionType1Calculate(order);               break;               case 3:                   return new PromotionType1Calculate(order);               break;               //more promotion           }           return null;       }   }

使用工厂模式后OrderPromotion类就不需要改了,每一次添加新的促销活动后只需要在工厂类中添加即可。

优化四:配置+反射

上面的代码还存在的问题在于每一次需要添加新的促销活动的时候还是需要修改工厂类中的代码,这里我们通过配置文件加反射的方式来解决。

定义映射配置文件

mapping.properties

1=design.order.PromotionType1Calculate   2=design.order.PromotionType2Calculate   3=design.order.PromotionType3Calculate

PromotionFactory

public class PromotionFactory {          private static Map<Integer, String> mapping = new HashMap<Integer, String>();          static {           try {               Properties pps = new Properties();               pps.load(new FileInputStream("Test.properties"));               Iterator<String> iterator = pps.stringPropertyNames().iterator();               while(iterator.hasNext()){                   String key=iterator.next();                   mapping.put(Integer.valueOf(key), pps.getProperty(key));               }           } catch (IOException e) {               e.printStackTrace();           }       }          public static PromotionCalculate getPromotionCalculate(int promotion) throws Exception {           if(mapping.containsKey(promotion)){               String beanName = mapping.get(promotion);               return Class.forName(beanName).newInstance();           }           return null;       }   }

通过上面的代码就可以实现不改变已有代码的前提下实现对功能的灵活扩展。当然,这里的代码只是作为演示用的,实际上可以改进的地方还有不少,像最后反射效率较低,也可以通过其他的方式来实现。

感谢各位的阅读!关于“怎么在代码中应用设计模式”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: 怎么在代码中应用设计模式

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

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

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

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

下载Word文档
猜你喜欢
  • 怎么在代码中应用设计模式
    这篇文章给大家分享的是有关怎么在代码中应用设计模式的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 为什么要使用设计模式因为我们的项目的需求是永远在变的,为了应对这种变化...
    99+
    2022-10-19
  • java设计模式之代理模式怎么应用
    代理模式是一种结构型设计模式,它允许通过创建一个代理对象来控制对实际对象的访问。代理对象充当了实际对象的替代品,可以在调用实际对象的...
    99+
    2023-08-08
    java
  • Java工厂设计模式的代码怎么写
    这篇“Java工厂设计模式的代码怎么写”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Jav...
    99+
    2022-10-19
  • 怎么在JavaScript中应用代理模式
    这篇文章给大家介绍怎么在JavaScript中应用代理模式,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。javascript是一种什么语言javascript是一种动态类型、弱类型的语言,基于对象和事件驱动并具有相对安...
    99+
    2023-06-14
  • Facade设计模式在Golang中的应用:简化代码结构的魔力方法
    Facade设计模式是一种用于简化代码结构的神奇方法,特别适用于Golang这样的静态类型语言。它允许我们将复杂的子系统隐藏在一个简单的外观之后,从而提供了一种简洁、结构化的方式来访问这些子系统。在软件开发中,我们经常会遇到复杂的系统,由许...
    99+
    2023-12-20
    Golang facade简化代码
  • Java设计模式的代理模式怎么实现
    这篇文章主要介绍了Java设计模式的代理模式怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java设计模式的代理模式怎么实现文章都会有所收获,下面我们一起来看看吧。什么是代理模式代理模式的定义: 由于某...
    99+
    2023-06-30
  • PHP设计模式之迭代器模式怎么实现
    本篇内容主要讲解“PHP设计模式之迭代器模式怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP设计模式之迭代器模式怎么实现”吧!迭代器模式迭代器模式(Iterator Pattern)...
    99+
    2023-07-05
  • 怎么在Django中实现MVT设计模式
    怎么在Django中实现MVT设计模式?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。经典的MVC设计模式及其优点MVC即 Model-View-Controller(模型-...
    99+
    2023-06-14
  • Python设计模式中单例模式的实现及在Tornado中的应用
    单例模式的实现方式 将类实例绑定到类变量上 class Singleton(object): _instance = None def __new__(cls, *args): if ...
    99+
    2022-06-04
    模式 Python Tornado
  • 设计模式中的原型模式在Python程序中的应用示例
    原型模式: 原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式本质就是克隆对象,所以在对象初始化操作比较复杂的情况下,很实用,能大大降低耗时,提高性能,因为“不用重新初始化对象,而是动...
    99+
    2022-06-04
    模式 原型 示例
  • PHP设计模式中的命令模式怎么使用
    这篇文章主要介绍“PHP设计模式中的命令模式怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP设计模式中的命令模式怎么使用”文章能帮助大家解决问题。命令模式(Command Pattern...
    99+
    2023-07-05
  • spring中的设计模式怎么使用
    在Spring中使用设计模式可以提高代码的可维护性、可扩展性和可测试性。以下是一些常见的设计模式在Spring中的使用方法:1. 单...
    99+
    2023-09-28
    spring
  • java中mvc设计模式怎么使用
    在Java中使用MVC(Model-View-Controller)设计模式需要按照以下步骤进行:1. 创建模型(Model):模型...
    99+
    2023-10-10
    java
  • 设计模式中的单例模式与PHP中的应用
    引言:设计模式是在软件设计过程中,经验丰富的软件工程师总结出来的一些解决特定问题的经典模式。其中,单例模式是最常用的设计模式之一。单例模式确保一个类只有一个实例,并提供了一个全局访问点来访问这个实例。在PHP中,单例模式被广泛应用于各种场景...
    99+
    2023-10-21
    单例模式 设计模式 PHP应用
  • .Net结构型设计模式之代理模式怎么实现
    这篇文章主要介绍了.Net结构型设计模式之代理模式怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇.Net结构型设计模式之代理模式怎么实现文章都会有所收获,下面我们一起来看看吧。一、动机(Motivate...
    99+
    2023-06-30
  • web前端中设计模式应用场景怎么实现
    今天就跟大家聊聊有关web前端中设计模式应用场景怎么实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.解释器模式对于一种语言,我们给出其文法表示...
    99+
    2022-10-19
  • JS设计模式之策略模式怎么用
    小编给大家分享一下JS设计模式之策略模式怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!策略模式的概念引用:在软件开发中也常...
    99+
    2022-10-19
  • Java设计模式之访问者模式使用场景及代码示例
    Java设计模式访问者模式模式概念访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。访问者模式适用于数据结构相对稳定算法又易变化的系统,若系统数据结构对象易于变化,则不适合使用...
    99+
    2023-05-30
    java 访问者模式 ava
  • Python设计模式中命令模式怎么实现
    这篇文章主要介绍了Python设计模式中命令模式怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python设计模式中命令模式怎么实现文章都会有所收获,下面我们一起来看看吧。1.命令模式命令模式的目的是解...
    99+
    2023-06-29
  • javascript设计模式之装饰者模式怎么用
    这篇文章主要为大家展示了“javascript设计模式之装饰者模式怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript设计模式之装饰者模式怎...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作