1 引言
架构是一个软件的骨架。为了应对需求变更,架构设计需要有足够的弹性去适应变化;架构的任何修改都将导致大量代码的重写,从而导致成本上升、工期延长。而设计模式本来主要是针对编码阶段的,但在进行架构设计时,软件架构师可以将组件之间的关键接口通过“灰包图”的形式———指定接口类所使用的设计模式———给程序员更多的指导;并且让架构更具弹性,更能适应各种变化。
2 架构设计与设计模式的关系
“设计模式”是Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides在《设计模式:可复用面向对象软件的基础》中提出来的。在此书中一共介绍了23种面向对象的设计模式;根据模式的应用目的,又将它们分为3类:创建型、结构型和行为型。而设计模式的作用则可以概括为四个字:“封装变化”。“架构”有很多种定义,《软件架构设计》一书对架构的各种定义做了详细的分析和总结;概括出架构不外乎包含“组件”、“交互”和“决策”三个方面。其中决策的最主要目的是要保证架构能适应需求变更。因此,架构设计就是:确定系统有哪些组件,它们之间有什么交互,以及未来可能发生什么变化;然后决定如何去应对变化。也就是说,在架构设计中最重要的事情就是要“隔离变化”。
所以,设计模式是架构设计与编码实现之间的一个桥梁。
3 变化的起源
要在架构设计中正确运用设计模式,首先要明白有哪些变化形式;然后再考虑选择什么设计模式去应对此变化。在《设计模式》一书中列举了以下导致需要重新设计的因素:通过显式地指定一个类来创建对象;对特殊操作的依赖;对硬件和软件平台的依赖;对对象表示或实现的依赖;算法依赖;紧耦合;通过生成子类来扩充功能;不能方便地对类进行修改。单纯地列举这些因素是不够的,还要对变化形式进行分类,以后才能正确地应对变化。其实程序的功能,就是子系统对外交互的“接口”;概念,就是“抽象类”,这也是“接口”;编码实现,则是具体的“代码”。为了尽量重用已有代码,或者预见到代码将来会发生变化。这些变化,最终都可以看成是代码库的替换。所以,架构设计要考虑的变化就是
“交互接口”和“编码实现”的变化。
4 设计模式在架构设计中的运用
要让设计的架构能适应变化,就是要预见组件之间的交互接口和编码实现将来可能发生什么变化,并对此做出正确的决策:采用正确的设计模式去封装变化。可以将交互接口或编码实现前后的变化分为4大类。下面将分别给出有效的决策方案,即:指明了关键类设计模式的“灰包图”。
4.1 相似接口,相同功能
在做架构设计时,根据需要设计出的接口可能与现有代码不相同;或者想暂时使用第三方的SDK实现,将来可能会改为自己实现。为了重用代码、隔离变化,可以运用ADAPTER模式去匹配接口;将变化封装在一个独立的Component内。将来就算第三方的SDK发生了变化或替换为自己的新代码,我们都只需重写Adapter类,影响范围也仅限于Component。这种情景类似于通过USB转换头去匹配不同大小的USB接口。
4.2 不同接口,相似功能
在做架构设计时,很多软件都要求支持跨平台。虽然有可能各个开发平台的已经有相似的功能,但他们的工作方式和开发接口却有可能完全不同;不能使用上述ADAPTER模式去解决。在这种情况下,可以按软件本身的需求抽象出相关的功能接口(如IWindow、I3DWindow和IFaceWindow);然后再使用BRIDGE模式充分重用平台已有的功能,同时又做到了隔离变化,将平台相关的代码限制在单独的一个Platform包中。
4.3 增替“实现”
有时做架构设计时,会预见到将来也许需要调整或增加某些功能。比如原来保存功能默认是保存成纯文本格式,将来可能要让它支持保存成RTF、HTML等;或者字符串原来是用IDEA加密,将来要换成DES加密;等等。这种情景下,关键是要分离接口与实现;可以运用STRATEGY模式解决。
4.4 精简接口
在做架构设计时,有时也能预见到系统中对象的数目会不断增加。那么两两之间的交互数就会急剧上升,彼此间的依赖关系也将变得非常复杂。为了限制或控制对象之间的交互,可以利用FACADE模式将相关的对象封装成包、模块或子系统,加大组件的粒度、降低耦合;从而增加架构的灵活性,适应变化。
5 总结
“完美之道,不在无可增加,而在无可删减。”在做架构设计时,只要先将最核心和最必要的功能设计出来,然后再考虑如何提供增加功能和预防变化的机制,就能保证设计的稳定。设计模式是最常用的封装变化的方法,我们要善于运用。
相关推荐
在这篇文章中,我们将探讨六种常见的微服务架构设计模式:聚合器微服务设计模式、代理微服务设计模式、链式微服务设计模式、分支微服务设计模式、数据共享微服务设计模式和异步消息传递微服务设计模式。 聚合器...
本文重点介绍了程序设计模式与架构中的几个关键概念,包括创建型模式、结构型模式和行为型模式,以及网站开发架构模式中的MVC框架。设计模式为软件开发提供了一种标准化的方法来解决问题,而架构模式则关注于整体的...
在软考系统架构设计师的学习过程中,理解并熟练运用这些设计模式至关重要。它们不仅是解决实际问题的工具,更是提升软件架构质量的关键。设计模式的应用能够使代码更易于理解和维护,提高代码的复用性,降低系统的...
通过这个"IOS设计模式架构设计实例Demo",开发者不仅能学习到具体的设计模式如何使用,还能了解到如何在实际项目中选择合适的架构,以及如何将设计模式融入到架构中,以提升应用的整体质量。因此,对于想要深入学习...
### 设计模式在典型.NET三层架构Web程序中的应用 #### 一、设计模式与.NET多层架构程序 ##### 1.1 设计模式 设计模式是软件开发中一系列被广泛认可的最佳实践,它帮助开发者解决特定类型的问题。设计模式根据其...
### 软件架构与设计模式:深入理解与实践 ...侯捷的教材不仅介绍了设计模式的基本概念和GOF设计模式,还探讨了超越GOF的模式以及设计模式在具体编程语言中的应用,是一本值得深入学习和研究的宝贵资料。
在这个主题中,我们将详细剖析软件架构的重要性、基本元素,以及如何通过合理的设计模式来优化软件的结构和功能。 首先,软件架构是构建大型复杂系统的基础,它定义了系统的组织结构和组件之间的关系。一个良好的...
《C#设计模式 设计模式 架构设计》是一本专注于C#编程语言中的设计模式与架构设计的书籍。设计模式是软件开发中的一种最佳实践,它为解决常见问题提供了可复用的解决方案,而架构设计则是构建大型、复杂系统的基础,...
SAAS 架构设计模式是软件即服务的架构设计模式,它可以解决软件开发和维护的成本问题,提高应用的性能和可扩展性,并提供基于互联网的软件服务。但是,SAAS 架构设计模式也存在一些缺点,例如依赖互联网、数据安全性...
设计模式在这些架构中起到关键作用,例如工厂模式用于创建对象,单例模式确保类只有一个实例,观察者模式实现事件驱动,还有策略模式和装饰器模式等,它们都为架构提供了灵活性和可扩展性。 总之,这个资料包提供了...
在软件架构设计中,设计模式是构建模块化、可维护系统的关键。例如, façade模式用于提供一个统一的接口,隐藏复杂的子系统,简化客户端与其交互。桥接(Bridge)模式则允许抽象和实现分离,使得两者可以独立变化,...
虽然给定的文件信息没有直接涉及设计模式的具体内容,但通过上述对设计模式概念、重要性以及《Head First 设计模式》一书的介绍,我们已经能够理解设计模式在软件开发中的核心价值。设计模式不仅是一种工具,更是一...
《微服务架构设计模式》是由Chris Richardson所著的一本关于微服务架构的书籍,它深入探讨了在Java环境中应用微服务架构时遇到的各种设计模式,以及如何实现它们。本书不仅涵盖了微服务架构的基本理念,还提供了丰富...
《ooad设计模式软件架构分析资料》集合涵盖了面向对象编程、软件架构、设计模式、软件...通过深入研读这些资料,你将能够更好地理解和应用面向对象设计、软件架构、设计模式、分析方法和敏捷实践,提升自己的专业素养。
数据架构设计方法应用于企业中,用于数据管理、数据分析、数据挖掘、数据应用等领域。该方法可以帮助企业更好地管理和应用数据,提高数据质量和效率,支持企业业务的发展。 应用架构设计方法 ------------------- ...
企业应用系统架构与设计模式,企业应用系统架构与设计模式
通过对微服务架构的目标和设计原则的理解,结合具体的设计模式,可以有效地解决在构建分布式系统时面临的挑战。通过采用这些模式,不仅可以优化系统的性能和稳定性,还能提高开发效率,使组织更加敏捷地响应市场变化...
3. **领会**:深入理解设计模式的核心理念,并能够创造性地运用到实际项目中。 #### 如何选择合适的设计模式 1. **考虑设计模式的解决方案**:思考设计模式是如何解决问题的,这有助于理解其适用场景。 2. **浏览...
学习和理解设计模式在实际项目中的应用 目标 掌握软件架构设计的七大原则 理解并应用Spring框架中的设计模式 通过实例代码加深对设计模式的理解和应用能力 主要功能模块 软件架构设计七大原则 开闭原则对...
设计模式可以在不同的框架或应用程序中重复使用。 - **内容差异**:设计模式只是一种设计思路,可以被不同的语言以不同的方式实现。框架则是设计与实际代码的结合,开发者可以根据具体的需求对其进行扩展和定制,...