软件设计模式与体系结构-设计模式-结构型软件设计模式-外观模式

三、外观模式

概念

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

引入外观角色之后,用户只需要直接与外观角色交互用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度

在这里插入图片描述
在这里插入图片描述
外观模式:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这个子系统更加容易使用

外观模式由三个角色组成:
1.== 外观角色==:外观模式的核心。它被客户角色调用,因此它熟悉子系统的功能。其内部根据客户角色已有的需求预定了几种功能组合。
2. 子系统角色:实现子系统的功能,对它而言,外观角色就和客户角色一样是未知的,它没有任何外观角色的信息和链接。
3. 客户角色:调用外观角色来完成要得到的功能

外观模式分析

根据“单一职责原则”,在软件中将一个系统划分为若干个子系统有利于降低整个系统的复杂性,一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小,而达到该目标的途径之一就是引入一个外观对象,它为子系统的访问提供了一个简单而单一的入口
外观模式也是“迪米特法则”的体现,通过引入一个新的外观类可以降低原有系统的复杂度,同时降低客户类与子系统类的耦合度

一个统一的外观对象进行
客户端只需要与外观对象打交道,而不需要与子系统内部的很多对象打交道
外观模式的目的在于降低系统的复杂程度
外观模式从很大程度上提高了客户端使用的便捷性

实例一:

在这里插入图片描述

在这里插入图片描述

实例二:图形绘制

在这里插入图片描述
在这里插入图片描述

外观模式讨论

一个系统有多个外观类?

  1. 在外观模式中,通常只需要一个外观类,并且此外观类只有一个实例,换言之它是一个单例类
  2. 在很多情况下为了节约系统资源,一般将外观类设计为单例类。
  3. 当然这并不意味着在整个系统里只能有一个外观类,在一个系统中可以设计多个外观类,每个外观类都负责和一些特定的子系统交互,向用户提供相应的业务功能

不要试图通过外观类为子系统增加新行为

  1. 不要通过继承一个外观类在子系统中加入新的行为,这种做法是错误的
  2. 外观模式的用意是为子系统提供一个集中化和简化的沟通渠道,而不是向子系统加入新的行为,
  3. 新的行为的增加应该通过修改原有子系统类或增加新的子系统类来实现,不能通过外观类来实现。

外观模式与迪米特法则

外观模式创造出一个外观对象,将客户端所涉及的属于一个子系统的协作伙伴的数量减到最少,使得客户端与子系统内部的对象的相互作用被外观对象所取代

抽象外观类的引入 (因为违背开闭原则)

外观模式最大的缺点在于违背了“开闭原则”,当增加新的子系统或者移除子系统时需要修改外观类,可以通过引入抽象外观类在一定程度上解决该问题,客户端针对抽象外观类进行编程。

在这里插入图片描述

使用外观模式的目的

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

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

课程作业

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VengaZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值