我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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

 为什么要使用设计模式

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

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

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

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

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

以促销活动需求为例

需求

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

  • 满减,满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;       }   }

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

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

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

下载Word文档

猜你喜欢

java设计模式之代理模式怎么应用

代理模式是一种结构型设计模式,它允许通过创建一个代理对象来控制对实际对象的访问。代理对象充当了实际对象的替代品,可以在调用实际对象的方法之前或之后添加额外的逻辑。代理模式可以用于许多不同的场景,以下是几个常见的应用场景:1. 远程代理:当客
2023-08-08

高性能 C++ 代码中的设计模式应用

在高性能 c++++ 代码中应用设计模式,特别是策略模式和责任链模式,可以显著提升性能。策略模式将算法分离为独立对象,允许在运行时轻松切换它们。责任链模式将对象链接成一个链,按顺序处理请求,减少无用的分支和条件语句。这些模式有助于创建可重用
高性能 C++ 代码中的设计模式应用
2024-05-13

怎么在JavaScript中应用代理模式

这篇文章给大家介绍怎么在JavaScript中应用代理模式,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。javascript是一种什么语言javascript是一种动态类型、弱类型的语言,基于对象和事件驱动并具有相对安
2023-06-14

设计模式在C++中的应用案例

是的,设计模式在 c++++ 中有广泛应用。观察者模式是一种一对一关系,其中一个对象(主体)管理依赖对象(观察者)并通知它们状态变化。在这个示例中,天气数据(主体)通知显示屏(观察者)状态变化,从而更新显示内容。设计模式提供了经过验证的解决
设计模式在C++中的应用案例
2024-05-14

Facade设计模式在Golang中的应用:简化代码结构的魔力方法

Facade设计模式是一种用于简化代码结构的神奇方法,特别适用于Golang这样的静态类型语言。它允许我们将复杂的子系统隐藏在一个简单的外观之后,从而提供了一种简洁、结构化的方式来访问这些子系统。在软件开发中,我们经常会遇到复杂的系统,由许
Facade设计模式在Golang中的应用:简化代码结构的魔力方法
2023-12-20

PHP 设计模式代码复用策略

php 代码复用策略包括:继承:子类继承父类属性和方法。组合:类包含其他类或对象的实例。抽象类:提供部分实现,定义需实现方法。接口:定义方法,不需实现。PHP 设计模式:代码复用策略介绍代码复用是软件开发中的一项重要原则,可以减少代码重
PHP 设计模式代码复用策略
2024-05-07

PHP 设计模式在云计算环境中的应用

php 设计模式在云计算环境中的应用可以提高应用程序在分布式和弹性环境中的可扩展性、可维护性和可靠性。常用的云计算相关设计模式包括:工厂方法模式:动态创建不同云平台的资源。适配器模式:集成不兼容的云服务。装饰器模式:按需添加监控、日志记录或
PHP 设计模式在云计算环境中的应用
2024-05-07

设计模式应用于代码重构的利弊权衡

应用设计模式于代码重构具有以下利弊:优点:提高可重用性:通过封装通用解决方案,减少代码冗余,提高开发效率。提高可维护性:清晰且结构化的模式增强代码可读性,提高可维护性。提高可扩展性:提供扩展性框架,便于代码适应需求变化。缺点:增加复杂性:应
设计模式应用于代码重构的利弊权衡
2024-05-09

设计模式如何应对代码维护难题

设计模式通过提供可重用和可扩展的解决方案来解决代码维护难题:观察者模式:允许对象订阅事件,并在事件发生时收到通知。工厂模式:提供了一种创建对象的集中式方式,而无需依赖具体类。单例模式:确保一个类只有一个实例,用于创建全局可访问的对象。设计模
设计模式如何应对代码维护难题
2024-05-09

设计模式在提高代码质量中的有效性

设计模式可显著提升代码质量。其类型包括创建型、结构型和行为型。使用设计模式的步骤为:识别问题、选择模式、应用模式。单例模式是一个创建型设计模式,可确保类只创建一次实例,避免重复创建带来的问题。应用设计模式的好处包括提高代码质量、增强可维护性
设计模式在提高代码质量中的有效性
2024-05-10

设计模式在避免代码重复方面的妙用

设计模式通过提供可重复使用的解决方案,减少代码重复,从而使代码更加易于维护和可读。这些模式包括:工厂模式:用于创建对象,无需指定其具体类。策略模式:允许算法或行为独立于其使用方式改变。单例模式:确保特定类只有一个实例。观察者模式:允许对象订
设计模式在避免代码重复方面的妙用
2024-05-09

Python设计模式中单例模式的实现及在Tornado中的应用

单例模式的实现方式 将类实例绑定到类变量上class Singleton(object):_instance = Nonedef __new__(cls, *args):if not isinstance(cls._instance, cl
2022-06-04

设计模式中的原型模式在Python程序中的应用示例

原型模式: 原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式本质就是克隆对象,所以在对象初始化操作比较复杂的情况下,很实用,能大大降低耗时,提高性能,因为“不用重新初始化对象,而是动态地获得对象运行时的状态”。 应用
2022-06-04

Java设计模式的代理模式怎么实现

这篇文章主要介绍了Java设计模式的代理模式怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java设计模式的代理模式怎么实现文章都会有所收获,下面我们一起来看看吧。什么是代理模式代理模式的定义: 由于某
2023-06-30

怎么在Django中实现MVT设计模式

怎么在Django中实现MVT设计模式?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。经典的MVC设计模式及其优点MVC即 Model-View-Controller(模型-
2023-06-14

设计模式中的单例模式与PHP中的应用

引言:设计模式是在软件设计过程中,经验丰富的软件工程师总结出来的一些解决特定问题的经典模式。其中,单例模式是最常用的设计模式之一。单例模式确保一个类只有一个实例,并提供了一个全局访问点来访问这个实例。在PHP中,单例模式被广泛应用于各种场景
2023-10-21

PHP 设计模式在物联网开发中的应用

物联网开发中可应用多种 php 设计模式,包括:观察者模式:实现传感器与应用程序通信。单例模式:确保全局配置对象或缓存服务只有一个实例。工厂方法模式:创建不同类型的传感器或设备。PHP 设计模式在物联网开发中的应用设计模式是可重用的解决方
PHP 设计模式在物联网开发中的应用
2024-05-07

PHP设计模式之迭代器模式怎么实现

本篇内容主要讲解“PHP设计模式之迭代器模式怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP设计模式之迭代器模式怎么实现”吧!迭代器模式迭代器模式(Iterator Pattern)
2023-07-05

编程热搜

目录