ll在代码中如何打出_java实战如何在代码中应用设计模式

为什么要使用设计模式

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

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


1ccdcc19d88b818e92512455d70d6da8.png

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

以促销活动需求为例

需求

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

满减,满400减20

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

折扣,9折,8折

每满减,每满200减10

等等

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

简单实现

上面的需求看起来还是比较简单的,但是如果考虑到我们是不可能一次定义好所有的促销活动类型,后续我们可能会随时都添加新的类型,要保证能够简单的实现功能扩展,那就比较麻烦了。

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

2ffc054d3f755fc65b29048fe5a3952a.png

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

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

优化一:单一职责原则

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

f0de0bea73244b87725abfee82dadaea.png

这里我们将折扣类型的判断和计算价格分开,使得promotion(…)方法的代码量大大降低,提升了代码的可读性。

优化二:策略模式

上面优化后的代码提升了原有代码的可读性,但是原来OrderPromotion类代码大爆炸的问题还是没有解决。针对这个问题,我们希望能够将计算的代码和当前代码分离开,首先我们能想到的就是定义一个类,然后将计算的代码复制到这个类中,需要的时候就调用。这样到的确是分离开了,但是完全是治标不治本。在添加新的促销活动是两个类都要改。

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

策略模式

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

986c2eb0fbaace6bde586d61a9e07f1d.png
fed5187736f2953002dd58b0ecbfe4ec.png

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

优化三:工厂模式

上面的代码虽然已经将促销活动的实现分离开了,但是OrderPromotion还是一直在变得,每一次添加或者下线活动都需要修改该类。现在我们希望OrderPromotion是不变的,将PromotionCalculation的实例化剥离开来。创建类很明显是使用工厂设计模式了。

OrderPromotion

6eff17d7183d1090117e3ab0daf47641.png

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

PromotionFactory

824d1636a926e4f034fff0e14df60f26.png

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

优化四:配置+反射

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

定义映射配置文件

mapping.properties

3ff51501d72298c309c1bf5cd980e9c6.png

PromotionFactory

3c29dd3facc42041be19eadef4c16137.png

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

小结

设计模式是我们一定要了解的东西,熟悉设计模式能让我们设计出易于扩展和维护的代码结构。但是并不是任何地方都需要上设计模式,应该结合我们的项目实际进行分析是否需要设计模式,使用哪种设计模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个简单的多操作选项菜单的设计,您可以根据需要进行修改和扩展。 ```python # 导入必要的模块 import os # 定义菜单选项 menu = { "1": "显示当前目录下的文件和文件夹", "2": "创建一个新文件", "3": "创建一个新文件夹", "4": "删除一个文件或文件夹", "5": "退出程序" } # 定义函数显示菜单 def display_menu(): print("请选择操作:") for key, value in menu.items(): print(key + ". " + value) # 定义函数显示当前目录下的文件和文件夹 def show_files(): files = os.listdir() for file in files: print(file) # 定义函数创建新文件 def create_file(): filename = input("请输入文件名:") with open(filename, "w") as f: print("文件创建成功!") # 定义函数创建新文件夹 def create_folder(): foldername = input("请输入文件夹名:") os.mkdir(foldername) print("文件夹创建成功!") # 定义函数删除文件或文件夹 def delete_file_or_folder(): filename = input("请输入要删除的文件或文件夹名:") if os.path.isfile(filename): os.remove(filename) print("文件删除成功!") elif os.path.isdir(filename): os.rmdir(filename) print("文件夹删除成功!") else: print("文件或文件夹不存在!") # 主程序 while True: display_menu() choice = input() if choice == "1": show_files() elif choice == "2": create_file() elif choice == "3": create_folder() elif choice == "4": delete_file_or_folder() elif choice == "5": print("程序已退出!") break else: print("无效的操作,请重新选择!") ``` 这个菜单提供了以下操作: 1. 显示当前目录下的文件和文件夹 2. 创建一个新文件 3. 创建一个新文件夹 4. 删除一个文件或文件夹 5. 退出程序 您可以根据需要进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值