8个常见的导致软件需要重新设计的原因及其解决方法

devtools/2024/11/14 2:45:37/

设计模式:可复用面向对象软件的基础》(《Design Patterns: Elements of Reusable Object-Oriented Software》),也称为GoF(Gang of Four)设计模式经典书籍,列举了8个常见的导致软件需要重新设计的原因。这些原因涵盖了软件开发中遇到的各种常见问题。以下是这些原因的详细说明以及通过使用设计模式解决这些问题的方法:

1. 通过显式地指定一个类来创建对象

问题:当系统依赖于显式指定某个类来创建对象时,系统会变得僵化,难以扩展。

设计模式解决方案

  • 工厂方法模式(Factory Method):定义一个创建对象的接口,但由子类决定实例化哪一个类。工厂方法模式使得类的实例化推迟到子类。
  • 抽象工厂模式(Abstract Factory):提供一个接口,用于创建一系列相关或依赖对象的家族,而不需要明确指定它们的具体类。

2. 对特殊操作的依赖

问题:当系统中的对象依赖于其他对象的特殊操作时,会导致代码耦合度过高。

设计模式解决方案

  • 命令模式(Command):将请求封装为对象,从而使可以用不同的请求对客户进行参数化。命令模式还可以支持撤销、队列化和记录日志等操作。

3. 对硬件和软件平台依赖

问题:硬编码对特定硬件或软件平台的依赖会导致系统难以移植和扩展。

设计模式解决方案

  • 适配器模式(Adapter):将一个类的接口转换成客户期望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以协同工作。

4. 对对象表示或实现的依赖

问题:直接暴露对象的表示或实现细节会导致代码耦合度过高。

设计模式解决方案

  • 抽象工厂模式(Abstract Factory):隐藏具体类的实现,提供一个接口用于创建一系列相关或依赖对象的家族。
  • 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。代理模式可以隐藏对象的实现细节。

5. 算法依赖

问题:当算法硬编码在系统中时,会导致算法难以修改或扩展。

设计模式解决方案

  • 策略模式(Strategy):定义一系列算法,将每个算法封装起来,并使它们可以互换。策略模式使得算法可以独立于使用它的客户而变化。

6. 紧耦合

问题:系统中的模块或类之间存在紧密的依赖关系,导致难以修改和测试。

设计模式解决方案

  • 中介者模式(Mediator):用一个中介对象来封装一系列对象的交互。中介者模式使得对象之间不需要显式地相互引用,从而降低了耦合度。
  • 观察者模式(Observer):定义对象间的一种一对多的依赖关系,使得当一个对象状态改变时,所有依赖于它的对象都会得到通知并自动更新。

7. 通过生成子类来扩展功能

问题:通过生成子类来扩展功能会导致类的层次结构复杂,难以维护。

设计模式解决方案

  • 装饰器模式(Decorator):动态地给一个对象添加一些额外的职责。装饰器模式提供了比继承更加灵活的扩展功能的方式。

8. 不能方便地对类进行修改

问题:当系统中的类难以修改时,会导致新功能难以添加,或者修改代码会导致其他部分出现问题。

设计模式解决方案

  • 模板方法模式(Template Method):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变算法的结构即可重定义算法的某些特定步骤。
  • 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作。访问者模式让你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

总结

通过使用设计模式,可以有效地解决上述8个导致软件需要重新设计的原因。设计模式提供了一种结构化的方法来应对软件开发中的常见问题,从而提高代码的可维护性、可扩展性和可重用性。每种设计模式都有其特定的应用场景和优势,开发人员可以根据具体需求选择合适的设计模式来解决问题。


http://www.ppmy.cn/devtools/133811.html

相关文章

# ubuntu系统安装搜狗输入法sogoupinyin

ubuntu系统安装搜狗输入法sogoupinyin 1、安装Fcitx框架及配置环境 fcitx 被称为 小企鹅输入法,是一个以 GPL 方式发布的 输入法平台,可以通过安装引擎支持多种输入法。它的优点是,短小精悍、跟程序的兼容性比较好! sudo apt-g…

ubuntu20.04 ROS 临时修改功能包名并作一系列对应修改 (ubuntu20.04)

ROS 临时修改功能包名并作一系列对应修改 (ubuntu20.04) 在ROS中临时修改一个功能包的包名确实需要更新多个文件和配置,确保整个系统的一致性不受影响。以下是具体步骤和C相关的示例: 1. 修改 package.xml 文件 这个文件描述了…

LLaMA-Factory学习笔记(1)——采用LORA对大模型进行SFT并采用vLLM部署的全流程

该博客是我根据自己学习过程中的思考与总结来写作的,由于初次学习,可能会有错误或者不足的地方,望批评与指正。 1. 安装 1.1 LLaMA-Factory安装 安装可以参考官方 readme (https://github.com/hiyouga/LLaMA-Factory/blob/main/…

19.(开发工具篇mysql库)mysql锁表问题解决

1:查看锁表情况 show OPEN TABLES where In_use > 0; 2:查看所有进程命令 show processlist 3:杀对应进程(通过host,db找对应的ID) kill 57303

开源大模型推理引擎现状及常见推理优化方法总结

原文:https://zhuanlan.zhihu.com/p/755874470 前言 前一段时间sglang-v0.3.0和vllm-v0.6.0前后脚发布之后,就一直想总结梳理一下现在主流的大模型推理引擎。因为我觉得这也算是一个有意义的节点吧,从此开源大模型推理引擎总算是由"非…

React官网生成Recat项目的区别

1. Next.js 特点: 页面级路由:使用文件系统路由,基于 /pages 文件夹的结构自动创建 URL 路径。渲染模式:支持三种渲染模式:静态生成 (SSG)、服务器端渲染 (SSR) 和客户端渲染 (CSR),并允许根据页面的具体需…

Chromium 中chrome.system.storage扩展接口定义c++

一、chrome.system.storage 您可以使用 chrome.system.storage API 查询存储设备信息,并在连接和分离可移动存储设备时收到通知。 权限 system.storage 类型 EjectDeviceResultCode 枚举 "success" 移除命令成功执行 - 应用可以提示用户移除设备。…

Qt第三课 ----------布局

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…