软件设计模式与体系结构(上)

目录

  • 软件设计模式概述(面向对象设计概述)
    • 一、面向对象设计的表示方法
      • 1. UML
    • 二、面向对象的设计原则
      • 1.单一原则
      • 2.开闭原则
      • 3.里氏代换原则
      • 4.依赖倒转原则
      • 5.接口隔离原则
      • 6.合成复用原则
      • 7.迪米特法则
  • 创建型软件设计模式
    • 一、工厂方法与抽象工厂模式
      • 1.简单工厂方法模式
      • 2.工厂方法模式
      • 3.抽象工厂模式
    • 二、生成器模式
    • 三、单例模式
  • 结构性软件设计模式
    • 一、组合模式
    • 二、适配器模式
    • 三、外观模式
    • 四、桥接模式
  • 行为型软件设计模式
    • 一、迭代器模式
    • 二、访问者模式
    • 三、中介者模式
    • 四、策略模式
    • 五、状态模式

软件设计模式概述(面向对象设计概述)

一、面向对象设计的表示方法

1. UML

  • 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。

类之间的关系:

关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的,例如一个公司包含了很多员工,其实现上是差不多的。

几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖
参考:关联、聚合、组合的区别

  • 其他辅助视图

好的系统设计应该具有的三个性质:
1.可扩展性
2.灵活性
3.可插拔性

4.依赖倒转原则

  • 定义:
    • 高层模块不应该依赖低层模块,它们都应该依赖抽象
    • 抽象不应该依赖于细节
    • 细节应该依赖于抽象
    • 另一种表述为:要针对接口编程,而不是针对实现编程

JAVAEE中有提到过

7.迪米特法则

定义:

  • 不要和“陌生人”说话
  • 只与你的直接朋友通信
  • 每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位

简单工厂模式最大的缺点就是当有新产品要加入到系统中时,必须修改工厂类,加入必要的处理逻辑,这违背了“开闭原则”

适用环境

在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做
工厂方法模式退化后可以演变成简单工厂模式

优点:
1.用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名
2.工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部
3.在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了。
缺点:
1.在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。
2.增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。

3.抽象工厂模式

两个概念

结构性软件设计模式

结构型软件设计模式的主要目的是将不同的类和对象组合在一起,形成更大或者更复杂的结构体。

关于组合模式的讨论
1.安全形式的组合模式

 

    优点:

    适配者模式的扩展
    1.默认适配器模式(缺省适配器模式、单接口适配器模式)

    三、外观模式

    • 外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子接口更加容易使用
    • 外观模式又称为门面模式,它是一种对象结构型模式

 

使用外观模式的目的

  • 为一系列复杂的接口提供一个统一的接口,使该系统更容易使用

适配器模式与外观模式的区别

  • 适配器模式转换接口的目的是将一个不适用的接口转换为可以被使用的接口,或将一些接口不同而功能相近的接口加以转换,以便可以被统一使用
  • 外观模式简化接口的目的是为了更好地使用某个类库

四、桥接模式

  • 桥接模式将继承关系转换为关联关系,从而降低类与类之间的耦合,减少了代码编写量
  • 桥接模式:将抽象部分与它的实现部分分离,使它们都可以独立地变化
  • 它是一种对象结构型模式,又称为柄体模式或接口模式

例如:

1.确定抽象部分和实现部分
2.确定抽象部分的实现类,实现部分的实现类

优点

首先分为两个部分,一是元素类,而是访问者类
先抽象再具体
在访问者类里要有访问元素的方法visitXXX(抽象元素父类做参数)之类的
在元素类里要有接受访问的方法,比如accept(抽象访问者父类做参数)等

三、中介者模式

  • 模式动机:为了减少对象两之间复杂的引用关系,使之成为一个松耦合的系统,需要适用中介者模式
  • 定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使耦合松散,而且可以独立地该变它们之间的交互
  • 中介者模式又称为调停者模式,它是一种对象行为型模式
  • 中介者模式的要点是将所有对象之间的交互细节抽象到一个独立的类中,这个类叫做中介者类Mediator

简单来说就是增加一个第三者,控制中心之类的东西

四、策略模式

简单说就是将算法作为一个类存在,而不是作为方法存在某个类之中

  • 定义:策略模式定义了一系列算法,将每一个算法封装起来,并且使它们之间可以相互替换。策略模式让算法的变化不会影响到适用算法的客户
  • 策略模式试对算法的封装,它把算法的责任和算法本身分隔开,委派给不同的对象管理

策略模式组成

  1. Strategy:定义了一个共同的接口,所有具体的算法类实现这个接口。环境(上下文)类Context使用这个接口调用具体的算法类
  2. ConcreteStrategy:封装了具体的算法,实现同一个接口
  3. Context:环境(上下文)类。用于配置一个具体的算法策略对象,维持一个策略接口类型的参考(Reference),并且可以定义一些让接口Strategy的具体对象访问的接口。在简单情况下,Context类可以省略。
    例如:
    模式应用
    策略模式与状态模式

优点

五、状态模式

与策略模式类似,状态模式将不同状态下的行为封装在不同的类中,每个类代表一个状态
状态模式的组成

  1. Context:定义了与客户程序的接口,它保持了一个concreteState的代表现在状态的实例
  2. State:定义了状态接口,它的各个子类封装了在各种不同状态下的行为
  3. ConcreteState子类:封装了在各种不同状态下的行为
  • 状态模式描述了对象状态的变化以及对象如何在每一种状态下表现除不同的行为
  • 状态模式的关键是引入了一个抽象类来专门表示对象的状态,这个类我们叫做抽象状态类,而对象的每一种具体状态类都继承了该类,并在不同具体状态类中实现了不同状态的行为,包括各种状态之间的切换

策略模式和状态模式的相似之处

软件设计模式与体系结构(上)

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年5月11日
下一篇 2022年5月11日

相关推荐