软件设计模式与体系结构

35 阅读8分钟

面向对象设计原则

单一职责、开闭原则里氏替换依赖倒转接口隔离合成复用迪米特法则                                      

单一职责:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。

  • 有且只有一个原因引起类的变更。(所谓职责是指类变化的原因)

开闭原则:软件实体应当对扩展开放,对修改关闭。

里氏替换:所有引用基类的地方必须能透明地使用其子类的

  • 对象父类的方法都要在子类中实现或者重写;不允许子类出现父类所没有定义的方法

依赖倒转:高层模块不应该依赖于低层模块。二者都应该依赖于抽象。

  • 抽象不应该依赖于细节,细节应该依赖于抽象。

接口隔离:客户端不应该依赖那些它不需要的接口。

  • 避免接口污染;
  • 恰当的划分角色和接口;
  • 从一个客户类的角度来讲:一个类对另外一个类的依赖性应当是建立在最小的接口上的;
  • 使用多个专门的接口比使用单一的总接口要好

合成复用:优先使用对象组合,而不是继承来达到复用的目的。

  • 尽量使用组合/聚合、尽量不使用继承
  • 在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用这些对象的目的

迪米特法则:又叫作最少知识原则。每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位(一个类对于其他类知道的越少越好)

软件设计模式

模式其实就是解决某一类问题的方法论

解决某类问题的方法总结归纳到理论高度,那就是模式。

模式对问题的描述以及对问题的解答应具有高度的抽象性和代表性。

模式是对现实生活某类现象的共同特质的高度抽象,描述了事务或者现象的规律,这种规律以及解决方法对于类似的现象同样有用。

设计模式使人们可以更加简单方便地复用成功的设计和体系结构。

设计模式提供了一种共享经验的方式,可以使团体受益和避免不断的重复发明。  

模式的定义:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心,通过这种方式,人们可以无数次地重用那些已有的解决方案,无须再重复相同的工作。

模式是在特定环境下人们解决某类重复出现问题的一套成功或有效的解决方案

设计模式的分类:

根据目的(模式是用来做什么的)可分为创建型(Creational),结构型(Structural)和行为型(Behavioral)三类:

  • 创建型模式主要用于创建对象

  • 结构型模式主要用于处理类或对象的组合

  • 行为型模式主要用于描述类或对象如何交互和怎样分配职责

根据范围,即模式主要是处理类之间的关系还是处理对象之间的关系,可分为类模式和对象模式两种:

  • 类模式处理类和子类之间的关系,这些关系通过继承建立,在编译时刻就被确定下来,是一种静态关系;

  • 对象模式处理对象间的关系,这些关系在运行时变化,更具动态

设计模式的主要作用:优化的设计经验;较高的复用性;丰富的表达能力;降低耦合性

image.png

image.png

软件体系结构

定义:一个软件系统的体系结构定义了组成系统的构件连接器和它们之间的匹配

软件系统的结构,包含软件元素、软件元素外部可见的属性以及这些软件元素之间的关系

软件系统的基本组织,包含构件、构件之间、构件与环境之间的关系,以及相关的设关的设计与演化原则等。

  • 软件体系结构的发展过程经历了四个阶段

    • “无体系结构”阶段、萌芽阶段、初期阶段、高阶阶段
  • 软件体系结构的描述方法分为:

    • 图形表达工具、模块内连接语言、基于软件构建的系统描述语言、ADL
  • 软件体系结构建模的种类:

    • 结构模型、框架模型、动态模型、过程模型、功能模型
  • “4+1”模型:

    • 逻辑视图、开发视图、进程视图、物理视图 。+ 场景视图

构件用于实施计算和保存状态,连接件用于表达构件之间的关系,构件和连接件之间的匹配表示了系统的拓扑结构。

构件的定义: 构件是指语义完整、语法正确和有可复用价值的单位软件,是软件复用过程中可以明确辨识的元素;结构上,它是语义描述、通讯接口和实现代码的复合体。

  • 构件是计算或数据储存的单元
  • 构件是计算和状态的场所
  • 构件可以是简单的或复合的

连接器是对构件之间的交互、指导这些交互的规则进行建模的体系结构元素

  • 简单交互:过程调用、共享变量访问
  • 复杂和语义丰富的交互:客户/服务器协议、数据库访问协议、异步事件广播、管道数据流

软件体系结构是对系统的高层设计,是从一个较高的层次来考虑组成系统的构件、构件之间的连接关系,以及系统需满足的约束等。

鉴于是否有一个稳定的软件体系结构,对软件的质量和成本影响很大,因此如何获得一个良好的体系结构就成为当今软件界研究的重点

软件体系结构风格

软件体系结构风格,是描述某一特定应用领域中系统组织方式的惯用模式。

一种体系结构风格定义一个系统家族:一个词汇表一组指导构建系统的规则

  • 词汇表:表中包含了构件和连接件类型

  • 一组规则(一组约束):指出系统是如何将这些构件和连接件组合起来的。

指导如何将各软件体系结构风格,反映了领域中众多系统所共有的结构和语义特征,并指导如何将各个模块和子系统有效地组织成一个完整的系统。

描述一类体系结构(如层次风格),在实践中被多次设计、应用(层次风格几乎已经成为企业信息化必须遵循的系统风格),是若干设计思想的综合,具有已经被熟知的特性,并且可以被复用

软件体系结构风格的重要作用

  1. 促进了设计的复用,使得一些经过实践证实的解决方案能够可靠地解决新问题。

  2. 带来显著的代码复用,使得体系结构风格中的不变部分可共享同一个解决方案。

  3. 便于设计者之间的交流与理解

  4. 通过对标准风格的使用支持了互操作性,以便于相关工具的集成

  5. 在限定了设计空间的情况下,能够对相关风格作出分析。

经典软件体系结构风格

  • 调用返回风格:

    • 主程序子程序
    • 面向对象风格
    • 层次结构
  • 以数据为中心风格:

    • 仓库系统
    • 黑板系统
    • 数据库系统
  • 独立构件风格:

    • 进程通讯
    • 事件系统
  • 数据流风格:

    • 批处理序列
    • 管道过速器
  • 虚拟机风格:

    • 解释器
    • 基于规则的系统

image.png

  1. 调用-返回体系结构风格
  • 主程序-子程序 image.png
  • 数据抽象和面向对象 image.png
  • 分层系统 image.png

数据流体系结构风格

  • 批处理 image.png
  • 管道-过滤器 image.png image.png

独立构件体系结构风格

  • 基于事件的隐式调用 image.png

以数据为中心的体系结构风格

  • 黑板风格 image.png

虚拟机体系结构风格

  • 解释器 image.png

  • 模型-视图-控制器(MVC)风格

image.png

  • 基于层次消息总线的体系结构风格 image.png

  • 客户/服务器(C/S)体系结构风格 image.png

  • SOA软件体系结构风格与Web Service

image.png