设计模式与UML图的关系

189 阅读6分钟

前置内容

先回顾一下一下类图的各种关系

image.png

【泛化关系】:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。

【实现关系】:是一种类与接口的关系,表示类是接口所有特征和行为的实现。

【关联关系】:是类与类之间的一种关系,表示一类对象与另一类对象之间有联系。

【聚合关系】:是整体与部分的关系,且部分可以离开整体而单独存在。

【组合关系】:是整体与部分的关系,但部分不能离开整体而单独存在。

【依赖关系】:是一种使用的关系,即一个类的实现需要另一个类的协助。

再看一下设计模式的几个原则:

  • S – Single Responsibility Principle 单一职责原则

    • 一个程序只做好一件事
    • 如果功能过于复杂就拆分开,每个部分保持独立
  • O – OpenClosed Principle 开放/封闭原则

    • 对扩展开放,对修改封闭
    • 增加需求时,扩展新代码,而非修改已有代码
  • L – Liskov Substitution Principle 里氏替换原则

    • 子类能覆盖父类
    • 父类能出现的地方子类就能出现
  • L – Law Of Demeter 迪米特原则

    • 从依赖者的角度来说,只依赖应该依赖的对象
    • 从被依赖者的角度说,只暴露应该暴露的方法
  • I – Interface Segregation Principle 接口隔离原则

    • 保持接口的单一独立
    • 类似单一职责原则,这里更关注接口
  • D – Dependency Inversion Principle 依赖倒转原则

    • 面向接口编程,依赖于抽象而不依赖于具体
    • 使用方只关注接口而不关注具体类的实现

用UML图来表示设计模式

适配器模式(Adapter Pattern):结构型模式之一,将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作

image.png

  • 代理模式:代理对象具备真实对象的功能,并代替真实对象完成相应操作,并能够在操作执行的前后,对操作进行增强处理。(为真实对象提供代理,然后供其他对象通过代理访问真实对象)以下为租客找中介租房的例子(转自 blog.csdn.net/weixin_4395…

image.png

  • 适配器模式:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。例子:我们有一个 MediaPlayer 接口和一个实现了 MediaPlayer 接口的实体类 AudioPlayer。默认情况下,AudioPlayer 可以播放 mp3 格式的音频文件。我们还有另一个接口 AdvancedMediaPlayer 和实现了 AdvancedMediaPlayer 接口的实体类。该类可以播放 vlc 和 mp4 格式的文件。我们想要让 AudioPlayer 播放其他格式的音频文件。为了实现这个功能,我们需要创建一个实现了 MediaPlayer 接口的适配器类 MediaAdapter,并使用 AdvancedMediaPlayer 对象来播放所需的格式。AudioPlayer 使用适配器类 MediaAdapter 传递所需的音频类型,不需要知道能播放所需格式音频的实际类。AdapterPatternDemo 类使用 AudioPlayer 类来播放各种格式。(转自 www.runoob.com/design-patt…

image.png

  • 外观模式:又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。以计算机的启动过程为例(转自 blog.csdn.net/qq_40124555…

image.png

  • 装饰模式:装饰模式是一种对象结构型模式,它以对客户透明的方式动态地给一个对象附加上更多的责任,可以在不需要创建更多子类的情况下,让对象的功能得以扩展。实例:某软件公司基于面向对象技术开发了一套图形界面构件库——VisualComponent。该构件库提供了大量的基本构件,如窗体、文本框、列表框等,由于在使用该构件库时,用户经常要求定制一些特殊的显示效果,如带滚动条的窗体、带黑色边框的文本框,既带滚动条又带黑色边框的列表框等,因此经常需要对该构件库进行扩展以增强其功能,现使用装饰模式来设计该图形界面构件库。(转自 blog.csdn.net/ChaITSimple…

image.png

  • 访问模式:系统中有一些固定结构的对象(元素),在其内部提供一个accept()方法用来接受访问者对象的访问,不同的访问者对同一元素的访问内容不同,所以使得相同的元素可以产生不同的元素结果。例子:模拟大众公司生产油车和电车,销售人员关注油车和电车的价格,质检人员关注油车和电车的油耗量和电耗量(转自 blog.csdn.net/qq_42665745…

image.png

  • 观察者模式:观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。(转自 www.jianshu.com/p/94eb1a0af…

image.png

  • 责任链模式:责任链(chain of responsibility)模式很像异常的捕获和处理,当一个问题发生的时候,当前对象看一下自己是否能够处理,不能的话将问题抛给自己的上级去处理,但是要注意这里的上级不一定指的是继承关系的父类,这点和异常的处理是不一样的。所以可以这样说,当问题不能解决的时候,将问题交给另一个对象去处理,就这样一直传递下去直至当前对象找不到下线了,处理结束。(转自 www.jianshu.com/p/94eb1a0af…

image.png

  • 中介者模式:中介者模式可以使对象之间的关系数量急剧减少,通过引入中介者对象,可以将系统的网状结构变成以中介者为中心的星形结构,是迪米特原则的典型应用。例子:现在租房基本都是通过房屋中介,房主将房屋托管给房屋中介,而租房者从房屋中介获取房屋信息。房屋中介充当租房者与房屋所有者之间的中介者。(转自 blog.csdn.net/glass__sky/…

image.png

  • 备忘录模式:备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原,当前很多软件都提供了撤销操作,其中就使用了备忘录模式。以合同状态为例(转自 blog.csdn.net/qq_42665745…

image.png

其他的模式以后更新